围绕物体旋转

时间:2015-05-29 21:30:38

标签: opengl rotation jogl coordinate orbit

我一直试图让一个物体绕另一个轨道运行:

//childX,childY,childZ are my starting coordinates
//here I count distance to the middle of my coordinate plane
float r = (float) Math.sqrt(Math.pow(childX, 2)+Math.pow(childY, 2)+Math.pow(childZ,2));

//here i convert my angles to radians
float alphaToRad = (float) Math.toRadians(findParent(figure.parentId).rotate[1]);//up_down
float betaToRad = (float) Math.toRadians(findParent(figure.parentId).rotate[0]);//left_right


float newX = (float) (r*Math.cos(betaToRad)*Math.cos(alphaToRad));
float newY = (float) (r*Math.cos(betaToRad)*Math.sin(alphaToRad));
float newZ = (float) (r*Math.sin(betaToRad));'

我有起点(5,5,0)的坐标和0°和0°的角度,这意味着在计算新坐标后坐标不应该改变。但结果是:

newX: 7.071068 newY: 0.0 newZ: 0.0

我尝试计算新坐标的每个方法总会有这种奇怪的结果。什么是7.07,我怎样才能得到正确的结果?

@edit

为了使我的新点相对于旧点,我只是将旧点的角度添加到新点:

float alphaToRad = (float) Math.toRadians(findParent(figure.parentId).rotate[1]) + Math.atan(childY/childX);
float betaToRad = (float) Math.toRadians(findParent(figure.parentId).rotate[0]) + Math.asin(childZ/r);

现在一切都像它应该的那样。解决

1 个答案:

答案 0 :(得分:0)

7.07是代码中r的值,即您的点与原点的距离:

sqrt(5 * 5 + 5 * 5) = sqrt(50) = 7.0711

如果两个角度均为零,则所有cos()值均为1.0,sin()值为0.0。这意味着newX变为r,即7.07,newYnewZ都变为0.0。这正是你得到的,所以这个结果没有神秘感。

你基本上做的是将点放在给定的方向和距离原点的距离。距离与原始距离相同。方向由两个角度给出,其中两个角度都是0.0对应于x轴方向。

换句话说,您所缺少的是您没有考虑相对于原点的点的原始方向。您将点放在绝对方向上,基于两个角度,而不是指向相对方向到该点的原始方向。

要按给定角度旋转点,最简单的方法是从角度构建旋转矩阵,并将它们应用到您的点。