我目前正在學習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,而應該傳達的理念。)
但是,這看起來相當不整潔,看起來像程序更多的工作量(因爲會有一個額外的矢量數學噸)。
我已經讀了一些關於層次建模的內容,但是關於它的所有文獻似乎都假定每個孩子總是想要繼承所有的父屬性。
有沒有更好的方法來做到這一點?