1

我正在尝试将球坐标转换为笛卡尔坐标以绘制简单的 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

怎么了?

4

1 回答 1

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+                 

使用这些角度,我们可以通过以下方式计算坐标:

         Point := radius * (x = sin(xrad) * cos(yrad)
                            y = sin(xrad) * sin(yrad)
                            z = cos(xrad))

这些是常规符号(参见球坐标系)。当您绘制点的笛卡尔表示时,通常使用 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) 时,由于两个坐标的变化不协调(没有双关语),事情开始变得丑陋。

于 2014-08-20T16:43:42.000 回答