我正在尝试模拟飞机的转弯,特别是倾斜。因此,我想要一个俯仰运动来根据滚转水平改变飞机的实际俯仰和偏航。例如,如果飞机没有滚动,俯仰它会直接向上转动,但如果有一定程度的滚动,飞机会稍微向上转动并稍微向侧面转动。
现在我正在使用矩阵变换来旋转模型,并且我使用的顺序使俯仰和偏航独立于滚动 - 因此,我需要弄清楚当飞机倾斜时滚动将如何影响俯仰和偏航。
这是我尝试过的:
if (keys["arrowleft"]) {
plane.roll -= 0.1;
}
if (keys["arrowright"]) {
plane.roll += 0.1;
}
if (keys["arrowup"]) {
plane.pitch -= 0.1*Math.cos(plane.roll);
plane.yaw -= 0.1*Math.sin(plane.roll);
}
if (keys["arrowdown"]) {
plane.pitch -= 0.1*Math.cos(plane.roll);
plane.yaw -= 0.1*Math.sin(plane.roll);
}
换句话说,有没有办法用基本公式将滚动时的俯仰运动(给定当前方向)转换为适当的欧拉角?或者我需要使用不同的矩阵变换吗?
所有俯仰、滚动和偏航操作都会旋转飞机的方向矢量,因此左/右不应为滚动添加固定值,而是以某个角度滚动飞机,这是通过将 3D 向量与 3D 旋转相乘来实现的矩阵。
如果我们的平面方向向量有序为 p、r、y,则滚动是在 r 上的旋转:
| cos(a) 0 sin(a) | |p|
| 0 1 0 | x |r|
| -sin(a) 0 cos(a) | |y|
同样,俯仰意味着在p上旋转,所以
| 1 0 0 | |p|
| 0 cos(a) -sin(a) | x |r|
| 0 -sin(a) cos(a) | |y|
然后您可以更新飞机沿横滚轴的位置,并校正偏航。