我目前正在使用以下数学来获得x,y,z坐标,假设斜度为150,我已知的偏航俯仰和滚动。
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 :(得分:1)
考虑这一点的最简单方法是考虑嵌入包含P和z轴的平面中的单位圆。在那里,矢量Q是三角形的一侧,PQ是另一侧。因此,掌握着这张照片:
首先,z应该是cos(pitch)
,而不是tan(pitch)
。然后,为了校正音高的x,y,将它们乘以sin(pitch)
。
请注意,这是假设您确实打算将phi / pitch设置为z轴和矢量之间的角度(而不是x-y平面和矢量之间更标准的角度)。
答案 1 :(得分:1)
当俯仰为正/负90度时,欧拉角(即坐标的方位角,俯仰,滚动系统)存在问题。这似乎就是你所指的,它被称为Grimbal Lock。我最近问过,然后在math.stackexchange.com上回答了一个关于此的问题,所以也许this link会有所帮助。
答案 2 :(得分:0)
由于phi是P和z轴之间的角度,因此z坐标应为rho*cos(phi)
。类似地,x是rho*sin(phi)cos(theta)
,y是rho*sin(phi)sin(theta)
答案 3 :(得分:0)
dsharlet,使用tan(pitch-90)似乎正在工作我的预期...如果我切换到cos我必须做它(音高+ 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;