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

时间:2014-08-20 12:22:46

标签: 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)); 

方位角轴看起来工作正常,但问题是当操纵极角时,左右交换天顶或底部,如此处所示(在顶部选择mp4以获得更流畅的播放) : http://gyazo.com/4a245713c232893960863cf4ea4186f6

有什么问题?

1 个答案:

答案 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)时,事情开始变得丑陋,因为两个坐标的变化都没有协调(没有双关语意)。