2015-10-04 32 views
-7

我正在研究某些3D圖形的文件格式,並且遇到了將單獨網格的繪製順序解釋爲單個對象的問題。每個網格通過一個樞軸與前一個網格相連,包含一個父索引(下一個樞軸連接),一個平移和一個旋轉 - 這些通常被稱爲骨骼。操作的順序不容易通過反覆試驗來確定 - 有太多的可能性。繪製旋轉物體之間的骨骼

a helicopter

我在即時模式下在同一時間畫這個,一個網格,並辦理使用glRotateglTranslate樞軸的堆棧。在這幅圖中,用不同顏色的網格繪製正確的平移和旋轉值 - 顯然一個或多個操作仍然是錯誤的順序。

爲了幫助調試這個,我想從每個網格的中心點繪製一條連接線到它應該連接的一條連線。但是,這在立即模式下似乎不可行!

僞代碼:

.. rotate/translate pivot #1 
.. draw mesh #1 .. 
glBegin (GL_LINES); 
    glVertex3fv (center); 
glEnd(); 
.. rotate/translate pivot #2 
glBegin (GL_LINES); 
    glVertex3fv (center); 
glEnd(); 

是不可能的,因爲GL_LINES只對頂點的工程之間,並且不能使用glRotateglTranslateglBeginglEnd

手動計算每個單獨點的旋轉和平移矩陣,還是OpenGL被強制爲「記住」上次使用的頂點,以便與下一個GL_LINES命令一起使用?

回答

1

我想不出一種方法來將不同的轉換應用到固定管道的一條線的兩個端點上。

您將需要至少應用自己代碼中兩點之間不同的轉換,並讓OpenGL只應用常用轉換。或者,您可以設置OpenGL狀態來爲一個點應用轉換,並在將其轉換爲另一個點之前應用該轉換的反轉,然後將其傳遞到glVertex3f()

一旦你開始使用可編程管線,你有更多的靈活性,並且有不同的轉換適用於繪圖調用的頂點幾個選項。

  1. 使用屬性,而不是工作服的變換矩陣:浮現在腦海中的一些方法。由於變換是屬性,每個頂點都可以有自己的變換。

  2. 使用包含許多不同轉換矩陣的統一數組。然後你可以有一個包含這個數組索引的頂點屬性。這允許您從每個頂點的一組變換中進行選擇。

  3. 在簡單情況下,您可以使用先前方法的變體,但在頂點着色器中使用預定義的gl_VertexID變量來選擇變形。

請注意,對於所有這些,使用即時模式繪圖或者如果您使用更多當前繪圖方法與VBO無關緊要。固定管道的侷限性在於其中的變換是制服,這意味着它們對於完整的繪製命令而言保持不變。

順便說一句,關於您試圖追蹤的原始問題:請記住,轉換以與您指定的順序相反的順序應用。因此,如果要旋轉對象,然後翻譯它,glTranslatef()通話必須在撥打glRotatef()之前。