给定两个旋转角度,如何计算轨道位置?

时间:2012-06-04 23:56:25

标签: math language-agnostic 3d

我通过调整两个旋转角度 - 围绕被跟踪物体的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轴旋转,事情就会变得奇怪。

2 个答案:

答案 0 :(得分: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)=(半径,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)(相对于被跟踪对象)并直接调整(您可能希望在每次调整后重新规范化以确保浮动点不准确不会使你的卫星漂移掉。)

答案 1 :(得分: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);