围绕物体旋转
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,而 newY
和 newZ
都变为 0.0。这正是你得到的,所以这个结果没有什么神秘的。
您基本上要做的是将点放置在给定的方向和距原点的距离。距离与原来的距离相同。方向由两个角度给出,其中两个角度均为 0.0 对应于 x 轴方向。
换句话说,您缺少的是您没有考虑点相对于原点的原始方向。您根据两个角度将点放置在绝对方向,而不是相对于点原始方向的相对方向.
要按给定角度旋转点,最简单的方法是根据角度构建旋转矩阵,并将它们应用于您的点。
我一直在尝试让一个物体围绕另一个物体运行:
//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,而 newY
和 newZ
都变为 0.0。这正是你得到的,所以这个结果没有什么神秘的。
您基本上要做的是将点放置在给定的方向和距原点的距离。距离与原来的距离相同。方向由两个角度给出,其中两个角度均为 0.0 对应于 x 轴方向。
换句话说,您缺少的是您没有考虑点相对于原点的原始方向。您根据两个角度将点放置在绝对方向,而不是相对于点原始方向的相对方向.
要按给定角度旋转点,最简单的方法是根据角度构建旋转矩阵,并将它们应用于您的点。