Math x、 球面中的y,z极坐标

Math x、 球面中的y,z极坐标,math,polar-coordinates,Math,Polar Coordinates,我现在用下面的数学来得到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坐标,假设斜边为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。。请帮忙


考虑这一点最简单的方法是考虑一个单位圆,它嵌入在包含p和z轴的平面中。这里,向量Q是三角形的一边,PQ是另一边。因此,在你脑海中浮现出这样的画面:

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


请注意,这是假设您确实希望phi/pitch是z轴和矢量之间的角度(而不是x-y平面和矢量之间更标准的角度)。

当俯仰为正负90度时,Euler角(即方位角、俯仰角、坐标系的滚动)存在问题。这似乎就是你所指的,它被称为。我最近在math.stackexchange.com上问了一个问题,然后回答了一个问题,所以可能会有帮助。

因为φ是p和z轴之间的角度,z坐标应该是
rho*cos(φ)
。同样地,x是ρ*sin(φ)cos(θ),y是ρ*sin(φ)sin(θ)

dsharlet,使用tan(螺距-90)似乎是我所期望的工作方式。。。如果我切换到cos,我必须做到(音高+180),但按照你的建议,下面的代码似乎有效。。我一定是在翻筋斗或者做什么奇怪的事。。你能谈谈棕褐色(音高-90)和cos(音高+180)之间的区别吗


你能不能把这个问题变成一个纯粹的数学问题,然后在math.stackexchange.com上提问?对不起,我不认为在这里发布并标记为math,polar Coordination有什么问题。如果有人能回答,你会有更多的能力。我只是觉得这更像是一个基于数学的问题,而不是一个编程问题。你看过上面的球坐标吗?我知道,先生。。实际上,我使用旋转矩阵和加速度计、陀螺仪和指南针的传感器融合来生成矩阵,我只是使用从matirx中提取的欧拉来将极坐标存储在数据库中好的,我对Grimbal Lock的评论只是对你关于“俯仰越来越接近直线上升和下降“在这种情况下,我不确定你有什么问题。也许您应该更清楚地表述,例如,明确给出横摆-俯仰和横摇的符号,并说明您遇到了什么问题。请注意,仅表示球体上点的位置,只需要两个角度,而不是三个角度。θ是多少?我假设ρ是蓝线的长度θ是图中的角度θ,现在我看到我贴的图片实际上指向了错误点的φ。。它不是在z和p之间,而是在p和y之间
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;