围绕物体旋转

rotating around objects

我一直在尝试让一个物体围绕另一个物体运行:

//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);

现在一切正常。已解决

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 轴方向。

换句话说,您缺少的是您没有考虑点相对于原点的原始方向。您根据两个角度将点放置在绝对方向,而不是相对于点原始方向的相对方向.

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