如何在Java的飞行模拟器中对旋转系统进行编程?

时间:2019-05-09 08:27:11

标签: java rotation

我尝试编写一个用于理论飞行装置的旋转系统。 我的主要问题是,我几乎从未绕过坐标系的轴旋转,而是绕着车辆的轴(俯仰,侧倾,下颌)旋转。 围绕其自身的z轴滚动的对象将随之跟随围绕其x轴的俯仰旋转。

我最大的想法是使用车辆的位置矢量和三个方向矢量来描述位置{1,0,0},{0,1,0},{0,0,1}。我猜想这些向量可以以某种方式用于存储对象的轴。在旋转车辆时,我会绕着其余点所代表的轴旋转其中两个点。 作为向量,我使用javafx.geometry.Point3D

到目前为止,我已经为我的启动旋转设置了此代码,该代码不考虑随着时间的推移会发生的车辆旋转。进一步旋转JavaFX形状也不是我的目标。 (我想拥有并转换原始坐标以用于其他用途,而不仅仅是绘制它们)

final Point3D isFacing = new Point3D(0, 0, 1).normalize();
final Point3D shouldFace = position.subtract(goalDirection).normalize();

final double rotationAngle = Math.toDegrees(Math.acos(isFacing.dotProduct(shouldFace)));

final Point3D rotationAxis = isFacing.crossProduct(shouldFace).normalize();

Rotate rotate = new Rotate(rotationAngle, rotationAxis);
model.getTransforms().addAll(rotate);

如何存储参数? 如何计算旋转? flight vehicle rotation axes

1 个答案:

答案 0 :(得分:1)

如果这是您第一次尝试这样的操作,请首先尝试做一些非常基本和简单的操作。

请按照以下步骤操作:

  • 尝试定义一个长方体,即围绕原点的8个3D点的列表。
  • 编写一些代码以使其在3D透视图中进行矢量渲染,在边缘点之间绘制12条线,其中每个点为(X/(Z + dist)*scaleY/(Z+dist)*scale),其中dist等于将物体推出您的视野,scale是一个放大系数。
  • 现在尝试在 roll 轴上旋转:对于每个点,计算X1 = X*cos(roll) + Y*sin(roll)Y1 = Y*cos(roll) - X*sin(roll)
    • 这将为您提供一组新的点-确保可以绘制这些点。您的长方体应该看起来是倾斜的。
    • 我们刚才要做的是通过旋转变换矩阵打开矩阵乘法。
    • 我假设您向下看Z轴正向,这意味着滚动是在X-Y平面上绕Z旋转。
  • 现在尝试绕着音高(X)轴再次旋转,在Y-Z平面上旋转:Y2 = Y1*cos(pitch) + Z*sin(pitch)Z1 = Z*cos(pitch) - Y1*sin(pitch)
    • 然后渲染:形状应该在向你点头。
  • 最后:绕着偏航(Y)轴在X-Z平面中旋转:X2 = X1*cos(yaw) + Z1*sin(yaw)Z2 = Z1*cos(yaw) - X1*sin(yaw)

您现在可以将对象指向您喜欢的任何地方。您将明确地按顺序应用旋转:将其旋转,倾斜,然后偏航/定向。了解了操作步骤后,您可以尝试将其写为3x3矩阵-您会看到可以预乘单个矩阵来执行任意滚动/俯仰/偏航的转换。

正如您所观察到的,以不同顺序应用这些转换会改变结果,但是矩阵乘法不是可交换的:改变顺序会使结果混乱。

一旦您牢牢掌握了这些基础知识,就去阅读更多的原理和实践。一个好的目标是能够绘制形状并旋转形状,围绕视点平移它,向左/向右向上/向下滑动。有一种使用4x4矩阵的聪明方法,它可以直接捕获转换向量,请参见How does 4x4 matrix work in 3d graphic?

但是首先要使工作更简单,在此您要理解每个部分。然后,更高级的方法,上面提到的四元数等似乎并不那么令人生畏。