从角度计算侧倾,俯仰和偏航

问题描述 投票:-1回答:1

我正在模拟具有三个运动轴(横摇,俯仰和偏航)的飞机。我有侧倾角(机翼围绕飞机的尾巴轴线倾斜的度数),俯仰角(机头与水平线之间的角度)和偏航角(飞机的罗盘方向)。

我试图确定的是升力的单位矢量(即,从飞机“上”到的矢量)-即当飞机笔直并水平时,升力矢量应笔直向上;当飞机机头笔直时,升力矢量由180 - roll_angle给出,等等。

我仅通过获取新点的球坐标并转换为笛卡尔坐标,并以法向于所得矢量给定平面的法线,仅用两个角度(例如,滚动和偏航)取得了部分进展。但是,我不确定如何考虑第三个角度(俯仰)。

我希望实现的功能是接受三个角度(滚动,俯仰和偏航)并给出升力的单位矢量。

function get_lift_vector()
{
    var lift_vector_heading = 0;
    var lift_vector_elevation = 90;

    // Adjust to range (-180, 180]
    roll_angle %= 360;
    if(roll_angle > 180)
    {
        roll_angle = 180 - roll_angle;
    }

    // Roll
    if(roll_angle > 0)
    {
        lift_vector_heading = 90;
        lift_vector_elevation = 90 - roll_angle;
    }
    else if(roll_angle < 0)
    {
        lift_vector_heading = 270;
        lift_vector_elevation = 90 - roll_angle;
    }

    // Yaw
    lift_vector_heading += aircraft_compass_heading;
    lift_vector_heading %= 360;

    // Pitch

}
javascript vector 3d game-physics
1个回答
0
投票

[在Math SE上发布了一个相关问题,其中Matti P.'s detailed answer提供了必要的数学背景后,使用ThreeJS库的Euler角度解决了这个问题。

从本质上讲,这个问题变成了一个固有的欧拉角问题,因此我们避免了上面贴上的笨拙的伪代码,只需插入相关角度,然后转换原始的z轴单位矢量(即升力矢量),就可以得出结果向量是提升的单位向量。

[我使用ThreeJS库的Math包提供了一段代码,很好地照顾了Euler角度变换背后的实际数学问题。

var transform = 
    new Euler(_Math.degToRad(angle_of_attack),
    _Math.degToRad(roll_angle),
    _Math.degToRad(heading),
    'ZXY');

var v = new Vector3(0, 0, 1);
v.applyEuler(transform);

return [v.x, v.y, v.z];
© www.soinside.com 2019 - 2024. All rights reserved.