Jul 14, 2015

opengl的座標空間設定,python mplot3d的座標空間設定

這邊畫出python的3d繪圖套件mplot3d的三維xyz座標空間與opengl的三維xyz座標空間,好讓我以及其他人在學習python與opengl的時候好做轉換的對應及比較,因為常常相同物體的座標位置在兩個座標上的顯示是不一樣的,而這若沒有搞懂此兩座標空間的轉換會白白浪費很多時間在轉來轉去。

預設的python mplot3d的xyz座標是下面這樣擺設的(對觀察者而言)
而預設的opengl的xyz座標是下面這樣擺設的
並且opengl的預設視窗(也就是顯示在螢幕上的視窗平面)是在xy平面上。

由於無法一筆畫畫出一個立方體而不重複邊,一個簡單立方體的繪製無法用一個連續線指令來完成,這不管在任何的3d繪圖軟件會套件都一樣,因此立方體的繪製有一些特殊的方法,我這邊是用四條相同長度相同形狀帶有轉折的線來完成一個立方體的繪製,因此使用畫線指令使用四次。而線的起始點與轉折點的座標位置就因為上述原因而要小心,因為在opengl與在python中是不一樣的。

python中立方體的頂點設置
opengl中立方體的頂點設置
----
另外也討論一下opengl所使用的model space及view space:

這邊稍微介紹一下opengl的座標空間,以及討論一下我認為比較方便的建立方式。
opengl紅書上介紹了兩個空間座標,一個是model座標model space,一個是視窗的座標view space。

model space就是一個繪圖的3D空間,view space就是顯示在最終電腦螢幕上的觀察角度及觀察視角大小的座標,可以想成是繪圖空間中有一個攝影機,攝影機的方位座標及角度決定了顯示在電腦螢幕上的東西。理想上我們先設定一個繪圖座標,在此座標上建立我們的3D物件,這就是我們的model space,建立好之後,在架設我們的攝影機,攝影機拍到的角度就是我們要顯示在電腦螢幕視窗上的角度,也就是view space。不過我發現這樣做的目的有好有壞。好處是,你可以動態的移動攝影機,也就是移動view space,以model space的座標作為參考座標的基準。這樣我們可以很直覺在model space上移動攝影機的位置及視角。

但是也有缺點,原因解釋如下。在建立攝影機視角及方位的時候,或說使用view space的指令建立視角方位時(如glOrtho等等),我們會選定一個3D區域,然後區域內的東西投影到我們攝影機上,也就是投影到view space的原點。選定3D區域的時候,輸入的參數條件如點的位置必須以view space為參考座標,比如說3D區域若是glOrtho來設定,那麼我們就會設定一個立方體,立方體內的東西會才會投影到攝影機上,最終顯示在電腦螢幕上。但是,問題來了,立方體的頂點的資訊必須是在view space座標上的投影值。但是通常對我們來說直覺的座標是model space,或說我們通常知道的是頂點在model space座標上的投影值,因此若要轉到view space上,還需要經過一次矩陣變換。這就是麻煩的一個地方。比方說在model space我們取一個立方體,立方體內的東西才要被投影,但這立方體的頂點資訊在view space上的數值我們是不知道的,還要經過變換才行。這會很麻煩。

因此這邊我們回到根本,只用一個座標就好,我們只用view space。直接以它來做繪圖的空間。也就是我們一開始就設定model space跟view space重合。這樣子在選定3D區域的時候,3D區域的頂點資訊都是固定的,這樣好像會省下很多步驟而節省下很多出錯的機會。

待整理... 2016/六月


----
相關文章:
anaconda 安裝 pyopengl

No comments: