将球坐标转换为笛卡尔坐标

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

怎么了?

Bar*_*kin 5

呵呵,这个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) 时,由于两个坐标的变化不协调(没有双关语),事情开始变得丑陋。