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