3

特定の回転でクワッドをレンダリングしたいのですが、さらにこのクワッドには、二分木構造のようにその下にレンダリングされた「リーフ」クワッドがあります。各子には、親のローテーションに加えて、独自のローテーションが適用されます。つまり、ルート クワッドが回転すると、ツリー全体が回転しますが、各サブツリーも個別に回転できます。したがって、私の再帰的なレンダー関数は次のようになります...

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() を配置してみました。これにより、すべてのプレートの回転が完全に停止します。

誰かがここで何が起こっているか教えてくれますか?

4

1 に答える 1

0

再帰のためちょっとハックですが、これは私がすぐに思いつくことができる最高のベースケースです:

これを試して:

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()他のものをレンダリングしたい場合は、メッシュをレンダリングした後にもう一度呼び出すことを忘れないでください。

于 2013-03-17T13:42:49.070 に答える