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

來源:互聯網
上載者:User

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。由於比較複雜,:

現在可以推導一下(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) 結構體定義

// 型別宣告<br />typedef struct POINT2D_TYPE // 2D笛卡爾座標<br />{<br />double x;<br />double y;<br />} POINT2D, *POINT2D_PTR;</p><p>typedef struct POINT3D_TYPE // 3D笛卡爾座標<br />{<br />double x;<br />double y;<br />double z;<br />} POINT3D, *POINT3D_PTR;</p><p>typedef struct POLAR2D_TYPE // 2D極座標<br />{<br />double r;<br />double theta;<br />} POLAR2D, *POLAR2D_PTR;</p><p>typedef struct CYLINDRICAL3D_TYPE // 3D柱面座標<br />{<br />double r;<br />double theta;<br />double z;<br />} CYLINDRICAL3D, *CYLINDRICAL3D_PTR;</p><p>typedef struct SPHERICAL3D_TYPE<br />{<br />double p;<br />double phi;<br />double theta;<br />} SPHERICAL3D, *SPHERICAL_PTR;

 

2) 轉換函式定義

void _CPPYIN_Math::CooTransPOINT2DtoPOLAR2D(POINT2D_PTR point2d, POLAR2D_PTR polar2d)<br />{<br />polar2d->r = sqrt((point2d->x * point2d->x) + (point2d->y * point2d->y));<br />polar2d->theta = atan((point2d->y) / (point2d->x));<br />}</p><p>void _CPPYIN_Math::CooTransPOLAR2DtoPOINT2D(POLAR2D_PTR polar2d, POINT2D_PTR point2d)<br />{<br />point2d->x = polar2d->r * cos(polar2d->theta);<br />point2d->y = polar2d->r * sin(polar2d->theta);<br />}</p><p>void _CPPYIN_Math::CooTransPOINT3DtoCYLINDRICAL3D(POINT3D_PTR point3d, CYLINDRICAL3D_PTR cylindrical3d)<br />{<br />cylindrical3d->r = sqrt((point3d->x * point3d->x) + (point3d->y * point3d->y));<br />cylindrical3d->theta = atan((point3d->y) / (point3d->x));<br />cylindrical3d->z = point3d->z;<br />}</p><p>void _CPPYIN_Math::CooTransCYLINDRICAL3DtoPOINT3D(CYLINDRICAL3D_PTR cylindrical3d, POINT3D_PTR point3d)<br />{<br />point3d->x = cylindrical3d->r * cos(cylindrical3d->theta);<br />point3d->y = cylindrical3d->r * sin(cylindrical3d->theta);<br />point3d->z = cylindrical3d->z;<br />}</p><p>void _CPPYIN_Math::CooTransPOINT3DtoSPHERICAL3D(POINT3D_PTR point3d, SPHERICAL3D_PTR spherical3d)<br />{<br />spherical3d->p = sqrt((point3d->x * point3d->x) + (point3d->y * point3d->y) + (point3d->z * point3d->z));<br />double r = sqrt((point3d->x * point3d->x) + (point3d->y * point3d->y));<br />spherical3d->phi = asin(r / spherical3d->p);<br />spherical3d->theta = atan(point3d->y / point3d->x);<br />}</p><p>void _CPPYIN_Math::CooTransSPHERICAL3DtoPOINT3D(SPHERICAL3D_PTR spherical3d, POINT3D_PTR point3d)<br />{<br />double r = spherical3d->p * sin(spherical3d->phi);<br />point3d->x = r * cos(spherical3d->theta);<br />point3d->y = r * sin(spherical3d->theta);<br />point3d->z = spherical3d->p * cos(spherical3d->phi);<br />}

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

 

 

3. 代碼下載

完整項目原始碼下載:>>點擊進入下載頁<< 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.