Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从角度计算横摇、俯仰和偏航_Javascript_Vector_3d_Game Physics - Fatal编程技术网

Javascript 从角度计算横摇、俯仰和偏航

Javascript 从角度计算横摇、俯仰和偏航,javascript,vector,3d,game-physics,Javascript,Vector,3d,Game Physics,我正在模拟一架具有三个运动轴(滚转、俯仰和偏航)的飞机。 我有侧倾角(机翼围绕飞机的机头-机尾轴倾斜的度数)、俯仰角(机头和地平线之间的角度)和偏航角(飞机的罗盘航向) 我试图确定的是升力的单位矢量(即从飞机“向上”的矢量)——即当飞机笔直且水平时,升力矢量应指向正上方,当飞机机头笔直向上时,升力矢量由180-滚转角等给出 通过简单地获取新点的球面坐标,转换为笛卡尔坐标,并获取合成向量所给平面的法线,我仅在两个角度(例如滚动和偏航)上取得了部分进展。但是,我不确定如何考虑第三个角度(俯仰角) 我

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

我试图确定的是升力的单位矢量(即从飞机“向上”的矢量)——即当飞机笔直且水平时,升力矢量应指向正上方,当飞机机头笔直向上时,升力矢量由
180-滚转角
等给出

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

我希望实现的是一个函数,它接受三个角度(横摇、俯仰和偏航),并给出升力的单位矢量

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

}
函数get\u lift\u vector() { var lift_vector_heading=0; var升力向量高程=90; //调整到范围(-180,180] 滚转角%=360; 如果(滚动角度>180) { 滚动角度=180-滚动角度; } //滚 如果(滚动角度>0) { 升力矢量航向=90; 升力向量仰角=90-横滚角; } 否则如果(滚动角度<0) { 升力矢量航向=270; 升力向量仰角=90-横滚角; } //偏航 升力矢量航向+=飞机罗盘航向; 升力矢量航向%=360; //投球 }
在Math SE上发布了一个相关问题,提供了必要的数学背景后,使用ThreeJS库的Euler angles实现解决了这个问题

本质上,这个问题变成了一个内在的欧拉角问题,因此我们避免了我上面发布的不雅观的伪代码,只需插入相关的角度,然后变换原始的z轴单位向量(即升力向量),得到的向量就是升力的单位向量

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

}
我使用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];