1

我通过调整两个旋转角度——围绕被跟踪对象的 X 轴和 Y 轴旋转,在 3D 空间中围绕另一个对象移动卫星。给定这些角度和半径,如何计算对象的最终位置?

这仅适用于 y 轴旋转:

position.x = otherObject.position.x + Math.cos(yRotation) * radius;
position.y = otherObject.position.y;
position.z = otherObject.position.z + Math.sin(yRotation) * radius;

但是一旦我尝试合并 x 轴旋转,事情就会变得很奇怪。

4

2 回答 2

2

您可以使用这些方程式在 2D 中旋转某些东西(请参阅Wikipedia):

x' = x * cos(angle) - y * sin(angle)
y' = x * sin(angle) + y * cos(angle)

您可以使用基本相同的方程来绕 3D 中的 x/y/z 轴旋转,例如绕 y 轴旋转:

x' = x * cos(angle) - z * sin(angle)
y' = y
z' = x * sin(angle) + z * cos(angle)

我想你想做的是:

  • 绕 y 轴旋转 yRotation
  • 然后绕x轴旋转xRotation

您已经完成了 y 轴旋转。所以从 (x, y, z) = (radius, 0, 0) 开始,你已经完成了:

x' = x * cos(angley) - z * sin(angley) = radius * cos(angley)
y' = y = 0
z' = x * sin(angley) + z * cos(angley) = radius * sin(angley)

我们只需要再次应用方程来绕 x 轴旋转:

x'' = x' = radius * cos(angley)
y'' = y' * cos(anglex) - z' * sin(anglex) = -radius * sin(angley) * sin(anglex)
z'' = y' * sin(anglex) + z' * cos(anglex) = radius * sin(angley) * cos(anglex)

请注意,调整“y 轴”旋转不一定会使卫星绕 y 轴旋转(例如,如果您的 x 旋转为 90 度,那么调整 y 旋转实际上会绕 z 轴旋转)。如果您不喜欢这种行为,我建议您只存储卫星 (x, y, z)(相对于被跟踪对象)并直接调整它(您可能希望在每次调整后重新归一化以确保浮动点不准确不会使您的卫星漂移)。

于 2012-06-05T02:40:07.830 回答
0

我的解决方案最终使用了根据旋转角度计算的变换矩阵,如下所示:

var mtx = new THREE.Matrix4();
mtx.rotateY(yRotation);
mtx.rotateX(xRotation);
var v = new THREE.Vector3(mtx.elements[8], mtx.elements[9], mtx.elements[10]);
v.multiplyScalar(radius);
于 2012-06-05T11:12:26.953 回答