我正在模拟具有三个运动轴(横摇,俯仰和偏航)的飞机。我有侧倾角(机翼围绕飞机的尾巴轴线倾斜的度数),俯仰角(机头与水平线之间的角度)和偏航角(飞机的罗盘方向)。
我试图确定的是升力的单位矢量(即,从飞机“上”到的矢量)-即当飞机笔直并水平时,升力矢量应笔直向上;当飞机机头笔直时,升力矢量由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
}
[在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];