1

以下のようにすると、ポインタの座標が変わります。0,0,0別のオブジェクトをスケッチする前に座標系をリセットするにはどうすればよいですか?

glPushMatrix();
glTranslatef(0.0f, -500.0f, 1200.0f);
glRotatef(270.0f, 1.0f, 0.0f, 0.0f);

glPushMatrix();
glColor3f(0.0f, 1.0f, 1.0f);
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);
glPopMatrix();

別のオブジェクトをスケッチしますが、現在の原点システムは ではありません0,0,0。ポイントは、すでにスケッチされているシリンダーにあると思います。

また、最初のオブジェクトの後に別のオブジェクトをスケッチすると、それも回転します。なんで?

4

2 に答える 2

1

glPushMatrix()マトリックスを現在アクティブなマトリックス スタック (おそらくモデルビュー) にプッシュします。glTranslate()などは、glRotate()レンダリングと同様に、最上位のモデル ビュー マトリックスで動作します。glPopMatrix()スタックから一番上のマトリックスを削除します。

したがって、バランスを取ってコールするglPushMatrix()glPopMatrix()、スタックは開始時と同じ状態になります。

于 2012-11-23T12:42:07.790 に答える
1
glPushMatrix () ;
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 1.0f, 0.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);
glPopMatrix();

glPushMatrix () ;
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 0.0f, 1.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);
glPopMatrix();

(このコードは 2 つの独立したオブジェクトを描画します。1 つは回転した x 軸、もう 1 つは回転した y 軸です)

すべてglPushMatrix()の呼び出しには、対応するglPopMatrix()呼び出しが必要です。1 つのオブジェクトに対して「ローカル」変換 (つまり、平行移動、回転) を行いたい場合は、単に を呼び出しglPushMatrix()て変換を行い、オブジェクトを描画して を呼び出すだけglPopMatrix()です。その後、座標系は最終的に再び変換されなくなり、次のオブジェクトを描画できます。

それが得られない場合は、glLoadIdentity()いくつかの変換を適用した後に Modelview Matrix で使用することもできます (すべての変換を再度リセットするため) - ただし、ModelviewMatrix で変換関連のコード (つまり gluLookAt) を使用している場合は、それを行う必要があります。繰り返しますが、すべてのglLoadIdentity()呼び出しの後。

glLoadIdentity();
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 1.0f, 0.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);

glLoadIdentity();
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 0.0f, 1.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);
于 2012-11-23T14:06:29.947 に答える