從零實現3D圖像引擎:(5)3D座標系函數庫

1. 數學分析

1) 2D笛卡爾座標系與2D極座標系

2D笛卡爾座標系就是平面直角座標系,不說了。

2D極座標系,是用方向和距離來定義2D空間中的點,而非x,y座標,如下圖:

極座標

其中極座標的參數用紅色表示,笛卡爾座標的參數用藍色字表示。

非常顯而易見,他們之間的轉換關係如下:

x = r * cos(theta)

y = r * sin(theta)

r = sqrt(x2 + y2)

theta = arctg(y/x)

 

2) 3D笛卡爾座標系

在2D笛卡爾座標系上增加了Z軸,形成3D笛卡爾座標系。分爲左手座標系和右手座標系。區分方法:用左手握住Z軸,大拇指伸直,其他四指的指尖方向從X軸轉向Y軸,如果大拇指的指向是Z的正半軸,則爲左手座標系,反之爲右手。

 

3) 3D柱面座標系

3D柱面座標系和2D的極座標系對應,只是在2D極座標系上增加了一條Z軸,所以3D笛卡爾座標系與3D柱面座標系的轉換也非常簡單:x和y以及r和theta都不變,只增加了Z座標而已。3D柱面座標系的表示方式是:P(r, theta, z)。

 

4) 3D球面座標系

這個是3D座標系中最複雜的,用P(p, phi, theta)表示。其中p是點P到原點的距離,phi是原點到點P的直線與正Z軸的夾角,theta是原點到點P的線段在X-Y平面上的投影與X軸之間的夾角,其實正好是極座標theta。由於比較複雜,如圖所示:

3D球面座標系

現在可以推導一下(p,phi,theta)與(x,y,z)的關係了。

由圖上可以得知:

OP在X-Y平面上的投影長度r = sqrt(x2+y2)

p = sqrt(x2+y2+z2)

Sin(phi) = r / p,所以

phi = arcsin(r / p)

tg(theta) = y / x

theta = arctg(y/x)

 

從p,phi,theta如何得到x,y,z呢:

r = p * Sin(phi)

x = r * Cos(theta)

y = r * Sin(theta)

z = p * Cos(phi)

代入整理得:

x = p * Sin(phi) * Cos(theta)

y = p * Sin(phi) * Sin(theta)

z = p * Cos(phi)

 

弄清楚了上面的關係,就可以建立這些座標系下點的數據結構,以及轉換函數了。

 

2. 代碼實現

1) 結構體定義

 

2) 轉換函數定義

沒什麼可說的,全是套上面推出來的公式而已。

 

 

3. 代碼下載

完整項目源代碼下載:>>點擊進入下載頁<< 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章