我正在尝试将球面坐标转换为笛卡尔坐标以绘制一个简单的3D金字塔。
以下是获取金字塔四个主要角落的代码,具体取决于极角yrad和方位角xrad以及峰值坐标x和y:
xpos1 = x+25*( sin(yrad+pi/2+pi/4)*cos(-xrad+pi/2+pi/4));
zpos1 = y-35+25*( cos(yrad+pi/2+pi/4));
xpos2 = x+25*( sin(yrad+pi/2-pi/4)*cos(-xrad+pi/2+pi/4));
zpos2 = y-35+25*( cos(yrad+pi/2-pi/4));
xpos3 = x+25*( sin(yrad+pi/2-pi/4)*cos(-xrad+pi/2-pi/4));
zpos3 = y-35+25*( cos(yrad+pi/2-pi/4));
xpos4 = x+25*( sin(yrad+pi/2+pi/4)*cos(-xrad+pi/2-pi/4));
zpos4 = y-35+25*( cos(yrad+pi/2+pi/4));
方位角轴看起来工作正常,但问题是当操纵极角时,左右交换天顶或底部,如此处所示(在顶部选择mp4以获得更流畅的播放) : http://gyazo.com/4a245713c232893960863cf4ea4186f6
有什么问题?
答案 0 :(得分:3)
呵呵,这个bug确实有一个很好看的结果:)让我们解决它。
对于极坐标,我们定义了两个角度:
yrad
) - 杆周围的旋转角度xrad
) - 赤道线上方“上方”/“下方”(0位于“北极”)如果我们尝试将其可视化,它将如此:
Look from above | Look from side
(Z goes positive towards you) | (Y goes negative towards you)
|
Y- Z- | Z- Y+
| / | | /
| / "far" | | / "far"
|/ | |/
X- ------+-------> X+ | X- ------+-------> X+
/| yrad | | /| xrad ^
"near" / |<-----+ | "near" / |------+
/ | "polar angle" | / | "azimuth angle"
Z+ Y+ | Y- Z+
使用这些角度,我们可以通过以下方式计算坐标:
Point := radius * (x = sin(xrad) * cos(yrad)
y = sin(xrad) * sin(yrad)
z = cos(xrad))
这些是传统的符号(见Spherical coordinate system)。当您绘制点的笛卡尔表示时,通常使用X和Y坐标,但是您选择的X和Z仍然完全正常。
然而,你所犯的错误是你换了角度!
Your computation | x := sin( yrad ) * cos ( xrad ) | z := cos( yrad )
------------------+-----------------------------------+------------------
Should have been | x := sin( xrad ) * cos ( yrad ) | z := cos( xrad )
所以,当你改变方位角(xrad
)时,你只有X坐标受到影响,这实际上效果很好(因为cos( xrad ) = sin( 90 - xrad )
,所以你有一个窦性行为(如需要xrad
))。当你旋转极角(yrad
)时,事情开始变得丑陋,因为两个坐标的变化都没有协调(没有双关语意)。