2015-04-15 31 views
0

我想在傳統OpenGL中做骨骼動畫,並認爲我可以在各個頂點上使用矩陣。當我編程,它和它沒有工作,我做了一些谷歌搜索發現這一點:如果在glBegin的執行和glEnd的相應的執行之間執行glLoadMatrix產生https://www.talisman.org/opengl-1.1/Reference/glLoadMatrix.html在特定頂點上使用glLoadMatrixd?

GL_INVALID_OPERATION。

所以現在我很難過。這裏是一個圖:

enter image description here

骨骼被標記爲紅色。我試圖做骨骼動畫,所以有兩個矩形。一個使用Bone 0,另一個使用Bone 1.只有構成第二個矩形的三角形的特定頂點使用Bone 1的旋轉矩陣,而不使用Bone 0的旋轉矩陣的那些頂點, ,如果這是有道理的。

因爲我不能使用glLoadMatrix在三角形中的單個頂點,我可以通過其他方式來取代基於存儲矩陣的頂點嗎?也許將一些矩陣值乘以頂點?不知道該怎麼去做。任何輸入讚賞,謝謝!

回答

0

您提到了兩個矩形Bone0和Bone1。您需要分別繪製它們,因爲它們需要單獨的變換矩陣。這兩個矩形的兩點是重合的,您的轉換矩陣繪製Bone1必須確保:

glTranslateF(...); 
glRotateF(...);  /* position rectangle Bone0 */ 

glBegin(GL_QUADS); /* draw rectangle Bone0 */ 
glVertex3f(...);  /* draw it */ 
    ... 
glEnd(); 

glPushMatrix();  /* save transformation matrix */ 

glMulMatrix(...);  /* 
         * as per your drawing, this is not just a 
         * simple translate/rotate operation, but 
         * a translate/shear 
         * you need to do that manually 
         */ 

glBegin(GL_QUADS); /* 
         * draw rectangle Bone1. Two of the vertices are 
         * coincident with two of rectangle Bone0. Your 
         * shear matrix must ensure they are 
         */ 
glVertex3F(...); 
glEnd(); 
0

您要做的就是所謂的蒙皮!不幸的是,它會涉及比您的方法更多的努力。可以在一個開始和結束之間進行,這通常是可取的。

最簡單的方法是不使用OpenGL來轉換頂點。在傳遞給OpenGL之前,使用您最喜歡的矩陣數學庫將頂點與骨骼矩陣相乘。如果頂點的數量不是太大,它不會讓你減慢很多。

更難的方法是實現蒙皮着色器。這book chapter提供了一個很好的介紹如何做到這一點。原則是將多個矩陣上傳到OpenGL,併爲每個頂點指定一個索引,指出要與哪個矩陣相乘。這將比簡單的方法快得多。

GPU的速度很快,因爲它們被優化用於在大量數據集上執行相同的操作 - 這樣做的折衷是,在繪製調用時不能修改狀態(如更改矩陣)進行中。

0

嘿,自從我發佈我的問題並回頭檢查後,我已經做了大量的數學工作,併爲相同問題的任何人發佈了答案,並且我注意到我已經有了一些答案,所以非常感謝您回答您的問題輸入!

因爲我已經想出了一個解決方案,但是,我想我會發佈一個答案以及這兩個。

基本上,我在渲染過程中所做的每個頂點渲染,無論從哪裏讀取數據緩衝區中的每個三角形的頂點以及所有這些,所以繼續寫下並不是太麻煩將矩陣與頂點相乘的自定義函數,因此從緩衝區加載頂點的副本,根據頂點映射到的哪個骨骼將矩陣乘以它,然後用於渲染該特定頂點三角形。

有趣的是,我已經實施了@Hannesh的建議,我只需要編寫乘數函數。很酷!

更難的方法是實現蒙皮着色器。這本書提供了一個很好的介紹如何完成。原則是將多個矩陣上傳到OpenGL,併爲每個頂點指定一個索引,指出要與哪個矩陣相乘。這將比簡單的方法快得多。

再次感謝!只要有信譽,我就會投票!

相關問題