2012-01-22 10 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状態になります。これを解決する一般的な方法(たとえばOpenSceneGraphなど)は、サブグラフがその子要素のプロパティをオーバーライドするかどうかを定義する各状態の追加プロパティを定義することです。順番に、子どもは親を介して自分の状態が上書きされるのを防ぐことができます。これはあらゆる種類のOpenGL状態でうまく動作します。

あなたのケースは少し奇妙なようです。多くの場合、変換はサブグラフ全体に適用されることを意図しています。このスキームはここでもうまくいくかもしれませんが。