私は現在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かもしれませんが、アイデアを伝える必要があります。)
しかし、それはむしろふさわしくないように見え、プログラムの作業量がはるかに増えるように見えます(追加のベクトル計算の量が多いため)。
私は階層的なモデリングについて少しお読みになりましたが、すべての文献はすべての子が常にすべての親のプロパティを継承したいと考えているようです。
このような方法はありますか?