【问题标题】:Calculating Roll, Pitch and Yaw from angles从角度计算滚动、俯仰和偏航
【发布时间】:2019-10-15 07:04:20
【问题描述】:

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

我要确定的是升力的单位矢量(即从飞机“向上”的矢量) - 即。当飞机平直且水平时,升力矢量应指向正上方,当飞机机头笔直向上时,升力矢量由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】:

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

    本质上,这个问题变成了一个内在的欧拉角问题,我们避免了我上面发布的不雅的伪代码,简单地插入相关的角度,然后变换原始的 z 轴单位向量(这是升力的向量),合成向量是升力的单位向量。

    我使用 ThreeJS 库的 Math 包包含一个 sn-p 代码,它很好地处理了欧拉角变换背后的实际数学。

    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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多