2012-11-06 66 views
0

所以我有一個場景圖,它包含我所有的對象,並且我必須使用我自己的矩陣類來滿足所有要求(要求,所以不是可選的,學校)。我已經編寫了所有數學課,但我不確定如何在代碼中實現矩陣堆棧。矩陣堆棧,glLoadMatrix和glMultMatrix與場景圖和相機一起使用?

我對它是如何工作有理論上的理解。基本上我的場景是身份矩陣,那麼我必須使用我的Matrix 4類創建的相機矩陣,然後我必須通過場景圖和glMultMatrix每個級別與其父級一起循環。

我認爲這是正確的軌道,但我從來沒有編碼過,只研究它背後的理論。

我在正確的軌道上嗎?

它應該看這個這個。

身份矩陣 - >攝像機矩陣 - > 爲每個對象 重置回單位矩陣 - >攝像機矩陣 - >生成翻譯和四元數的乘法與身份字模 - >攝像頭矩陣。 爲每個孩子 生成矩陣翻譯和四元數的乘法,與家長的Matrix

所以基本上我沒有glMatrixMode,只是一個矩陣堆棧存在,因爲我的場景圖。

我希望這是正確的軌道。

回答

1

場景爲單位矩陣

沒有,單位矩陣僅僅是一個矩陣,與相乘不會改變任何東西。

我必須通過場景圖形和glMultMatrix每個級別與其父級循環。

不是真的。做自己的矩陣數學的想法,不是依靠OpenGL爲你做任何事情。這包括矩陣乘法。如果你實際使用OpenGL固定功能矩陣,你可以使用glLoadMatrix。但更好地走現代化的道路:使用着色器並將矩陣作爲制服提供。

由於改造管道工程怎麼樣,我是指你回顧一下至https://stackoverflow.com/a/13223392/524368

我希望這是在正確的軌道上。

差不多,你覺得有點太複雜。做自己的矩陣數學的好處是,你可以很自由地用你實現的方式。

我個人很喜歡就地數學運算。使用這種模式,對於矩陣層次結構中的每一步,您都需要獲取較低層次的副本,然後對其進行修改。這樣的樹很好地遍歷。對於每個繪圖操作,您只需在變換層級樹的分支/葉子中加載矩陣,那麼您當前正在遍歷。並且在繪製每個東西之後,不需要重置,只需加載下一個東西,也可以釋放中間結果的記憶。

0

那麼,你在正確的軌道上,但大多數處理有點不同。

我們假設棧頂是活動矩陣。所以在開始的時候我們有一個包含身份矩陣的堆棧。你應該熟悉推送和彈出呼叫。這些做基本上如下:

push(Matrix m) 
{ 
    newMatrix = stack.top() * m; //Or the other way round. This depends on the matrix definition and the function of the * operator 
    put newMatrix on stack; 
} 
pop() 
{ 
    remove first element from stack; 
} 

你已經觀察到,你需要一個投影和查看矩陣首先。所以:

push(cameraMatrix); 

然後你可以迭代場景圖。我假設你有一個簡單的遞歸迭代這就要求每個孩子下面的方法:

iterate_node(node) 
{ 
    generate matrix from translate and quaternions 
    push(matrix); 
    for each (children of this node) 
     iterate_node(child) 
    next 
    pop(); 
} 

所以,如果你輸入一個節點,該節點的矩陣添加到堆棧,如果你離開它,矩陣被刪除。這樣,您可以擁有任意深度和複雜度的圖形。你已經注意到,每個矩陣都會影響孩子們的轉換。