我尝试编写一个用于理论飞行装置的旋转系统。 我的主要问题是,我几乎从未绕过坐标系的轴旋转,而是绕着车辆的轴(俯仰,侧倾,下颌)旋转。 围绕其自身的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);
如何存储参数? 如何计算旋转?
答案 0 :(得分:1)
如果这是您第一次尝试这样的操作,请首先尝试做一些非常基本和简单的操作。
请按照以下步骤操作:
(X/(Z + dist)*scale
,Y/(Z+dist)*scale)
,其中dist
等于将物体推出您的视野,scale
是一个放大系数。X1 = X*cos(roll) + Y*sin(roll)
和Y1 = Y*cos(roll) - X*sin(roll)
Y2 = Y1*cos(pitch) + Z*sin(pitch)
和Z1 = Z*cos(pitch) - Y1*sin(pitch)
X2 = X1*cos(yaw) + Z1*sin(yaw)
和Z2 = Z1*cos(yaw) - X1*sin(yaw)
您现在可以将对象指向您喜欢的任何地方。您将明确地按顺序应用旋转:将其旋转,倾斜,然后偏航/定向。了解了操作步骤后,您可以尝试将其写为3x3矩阵-您会看到可以预乘单个矩阵来执行任意滚动/俯仰/偏航的转换。
正如您所观察到的,以不同顺序应用这些转换会改变结果,但是矩阵乘法不是可交换的:改变顺序会使结果混乱。
一旦您牢牢掌握了这些基础知识,就去阅读更多的原理和实践。一个好的目标是能够绘制形状并旋转形状,围绕视点平移它,向左/向右向上/向下滑动。有一种使用4x4矩阵的聪明方法,它可以直接捕获转换向量,请参见How does 4x4 matrix work in 3d graphic?。
但是首先要使工作更简单,在此您要理解每个部分。然后,更高级的方法,上面提到的四元数等似乎并不那么令人生畏。