0

我目前正在使用以下数学来获取假设斜边为 150 和我已知的偏航俯仰和滚动的 x、y、z 坐标。

float zPos = (float)Math.tan(Math.toRadians(rmPitch-90))*150;
float xPos = (float)Math.cos(Math.toRadians(90-rmYaw))*150;
float yPos = (float)Math.cos(Math.toRadians(rmYaw))*150;

假设观众站在 0,0,0 并抬头看 P.Q 距离 150 个单位,我知道视图的偏航和俯仰);

我的数学似乎工作得很好,直到我的音高接近直线上下,此时我意识到 x 和 y 需要以某种方式考虑 z ..请帮助

假设观众站在 0,0,

4

4 回答 4

1

当俯仰角为正/负 90 度时,欧拉角(即方位角、俯仰角、横滚坐标系统)存在问题。这似乎就是您所指的,它被称为Grimbal Lock。我最近在 math.stackexchange.com 上询问并回答了一个关于此的问题,所以也许这个链接会有所帮助。

于 2013-05-19T22:49:59.597 回答
1

考虑这一点的最简单方法是考虑嵌入在包含 P 和 z 轴的平面中的单位圆。在那里,向量 Q 是三角形的一侧,而 PQ 是另一侧。所以,带着你脑海中的那张照片:

首先, z 应该是cos(pitch),而不是tan(pitch)。然后,为了修正 x, y 的音高,将它们乘以sin(pitch)

请注意,这是假设您确实打算将 phi/pitch 设为 z 轴和向量之间的角度(而不是 xy 平面和向量之间更标准的角度)。

于 2013-05-19T20:53:32.157 回答
0

因为 phi 是 P 和 z 轴之间的角度,所以 z 坐标应该是rho*cos(phi)。同样 x 是rho*sin(phi)cos(theta), y 是rho*sin(phi)sin(theta)

于 2013-05-20T04:01:57.163 回答
0

dsharlet,使用 tan(pitch-90) 似乎按我的预期工作......如果我切换到 cos 我必须做到(pitch+180),但按照你的建议,下面的代码似乎工作......我必须翻转和轴或一些奇怪的东西..你能谈谈 tan(pitch-90) 和 cos(pitch+180) 之间的区别吗

float zPos = (float)Math.cos(Math.toRadians(rmPitch+180))*radius;
float xPos = (float)Math.cos(Math.toRadians(90-rmYaw))*(float)Math.sin(Math.toRadians(rmPitch))*radius;
float yPos = (float)Math.cos(Math.toRadians(rmYaw))*(float)Math.sin(Math.toRadians(rmPitch))*radius;
于 2013-05-21T15:21:32.030 回答