Gri*_*ixM 1 3d trigonometry coordinate-systems cartesian-coordinates
我正在尝试将球坐标转换为笛卡尔坐标以绘制一个简单的 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));
Run Code Online (Sandbox Code Playgroud)
方位角轴似乎工作正常,但问题是在操纵极角时,左右在经过天顶或底部时会交换,如下所示(选择顶部的 mp4 以获得更流畅的播放): http: //gyazo.com/4a245713c232893960863cf4ea4186f6
怎么了?
呵呵,这个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+
Run Code Online (Sandbox Code Playgroud)
使用这些角度,我们可以通过以下方式计算坐标:
Point := radius * (x = sin(xrad) * cos(yrad)
y = sin(xrad) * sin(yrad)
z = cos(xrad))
Run Code Online (Sandbox Code Playgroud)
这些是常规符号(请参阅球坐标系)。当您绘制点的笛卡尔表示时,通常使用 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 )
Run Code Online (Sandbox Code Playgroud)
所以,当你改变方位角 ( xrad) 时,你只影响了 X 坐标,这实际上效果很好(因为cos( xrad ) = sin( 90 - xrad ),所以你有一个窦的行为(根据需要xrad))。当您旋转极角 ( yrad) 时,由于两个坐标的变化不协调(没有双关语),事情开始变得丑陋。