2012-01-22 130 views
3

我目前正在學習OpenGL,並獲得了我的第一批顯示的幾何圖形和紋理。OpenGL中的建模層次結構

現在我正試圖在不同的圖形角色之間建立一個父子層次結構模型。 據我所知,它通常是實現這樣的:

void Draw(){ 
    glPushMatrix(); 
    <apply all transformations> 
    <draw this model> 
    <for each child c of this actor:> 
     c.Draw(); 
    glPopMatrix(); 
} 

這樣的孩子將繼承父(規模,位置,旋轉)的所有轉換。 但有時我只想要應用某些轉換(例如,特殊效果演員應與其父項一起移動,但在頭盔演員想要繼承所有轉換時不要使用它的父項旋轉)。

的想法,我想出了在流逝應當適用於繪圖功能的轉換參數:

class Actor{ 
    Vec3 m_pos, m_rot, m_scale; //This object's own transformation data 
    std::vector<Actor*> m_children; 

    void Draw(Vec3 pos, Vec3 rot, Vec3 scale){ 
     (translate by pos) //transform by the given parent data 
     (rotate around rot) 
     (scale by scale) 

     glPushMatrix(); //Apply own transformations 
     (translate by m_pos) 
     (rotate around m_rot) 
     (scale by m_scale) 
     (draw model) 
     glPopMatrix(); //discard own transformations 

     for(Actor a : m_children){ 
      glPushMatrix(); 
      a.Draw(pass m_pos, m_rot and/or m_scale depending on what the current child wants to inherit); 
      glPopMatrix(); 
     } 
    } 
} 

void StartDrawing(){ 
    glLoadIdentity(); 
    //g_wold is the "world actor" which everything major is attached to. 
    g_world.Draw(Vec3(0,0,0), Vec3(0,0,0), Vec3(0,0,0)); 
} 

(僞代碼可能是errorneous,而應該傳達的理念。)

但是,這看起來相當不整潔,看起來像程序更多的工作量(因爲會有一個額外的矢量數學噸)。

我已經讀了一些關於層次建模的內容,但是關於它的所有文獻似乎都假定每個孩子總是想要繼承所有的父屬性。

有沒有更好的方法來做到這一點?

回答

2

先說明一下:矩陣堆棧在最近的OpenGL版本中已被棄用,用戶應該自己控制轉換。

你面臨的問題是你在渲染圖中使用的每一種OpenGL狀態。解決這個問題的一個常見方法是爲每個狀態定義一個附加屬性,該屬性定義子圖是否覆蓋其子級中的屬性。反過來,孩子們可以保護他們的國家免受父母的壓制。這適用於每種OpenGL狀態。

你的情況似乎有點奇怪。通常轉換意圖適用於整個子圖。雖然這個方案也可以在這裏工作。