2013-03-17 59 views
3

我想呈現具有特定旋轉的四邊形,此外,該四邊形在其下面呈現類似於二叉樹結構的「葉」四邊形。除了父母之外,每個孩子都有自己的輪換適用於他們。換句話說,如果根quad旋轉,整棵樹就會隨之旋轉,但每個子樹也可以單獨旋轉。所以,我的遞歸函數渲染看起來有點像這樣...將獨立旋轉應用於多個四邊形使用舊的OpenGL功能

RenderNode(Node current_node){ 
    glRotate(current_node->rotation); 
    glBegin(GL_QUADS); 
     // supply 4 vertices and texture mapping 
    glEnd(); 

    RenderNode(current_node->leftChild); 
    RenderNode(current_node->rightChild); 
} 

現在我希望比他們的父母我的孩子節點略有不同的旋轉,但不幸的是這是情況並非如此。在單個幀中調用glRotate()的次數越多,旋轉動畫的速度越快,但所有的板都保持在同一個平面上。似乎沒有任何四邊形正在被渲染,直到最後,並且最新的變換矩陣被應用到所有這些矩陣。作爲一個測試,我嘗試在每次轉換之前放置glPushMatrix(),並在每次調用glEnd()之後放置glPopMatrix(),這完全停止了所有板的旋轉。

有人能告訴我,這裏發生了什麼?

+0

在你調用'glPushMatrix()'之前,你把'glIdentityMatrix()'放在了嗎? – 2013-03-17 13:34:05

+0

不,只是試了一下,現在四邊形似乎沒有渲染。 – user2179327 2013-03-17 13:36:57

+1

對不起,'glLoadIdentity()'是實際的呼叫... – 2013-03-17 13:37:49

回答

0

類的hackish,因爲遞歸的,但是這是最好的基本情況,我可以拿出短時間內:

試試這個:

RenderNode(Node current_node, GLfloat parentRotation){ 
    if(current_node->leftChild != null) RenderNode(current_node->leftChild, parentRotation + current_node->rotation); 
    if(current_node->rightChild != null) RenderNode(current_node->rightChild, parentRotation + current_node->rotation); 
    glLoadIdentity(); 
    glRotate(current_node->rotation); 
    glBegin(GL_QUADS); 
     // supply 4 vertices and texture mapping 
    glEnd(); 
} 

這樣你就不必流行或推送任何矩陣,它將重置爲每個實際幾何渲染的單位矩陣。只要記得在渲染網格後再次調用glLoadIdentity(),如果你想渲染其他東西。

+0

嗯,我想在渲染孩子時在堆棧上有父變換。例如,如果父母的個人旋轉度爲45,而孩子的個人旋轉度爲3,則我實際上希望孩子旋轉總共48度。當我在函數中包含對glLoadIdentity的調用時,我無法獲取任何內容。 – user2179327 2013-03-17 13:52:29

+0

編輯,爲什麼你不只是通過父輪旋轉浮動?在遞歸樹下進行求和時,可能必須玩弄「glLoadIdentity」調用的位置 – 2013-03-18 03:17:07