OpenGLの「glPushMatrix」「glPopMatrix」行列スタック操作関数徹底解説
OpenGLのglPushMatrix()とglPopMatrix()関数は、行列スタックの頂点の行列を操作するために使用されます。
- glPushMatrix() 関数は 現在行列 (モデルビュー行列または射影行列) を行列スタックのスタック先頭へプッシュする。
- 現在の行列は、glMatrixMode()関数で設定した現在の行列モード(GL_MODELVIEWまたはGL_PROJECTION)の行列のことです。
- スタックのトップへプッシュすると、現在の行列は新しいスタックのトップにコピーされます。
- glPopMatrix()関数は、行列スタックの一番上の行列をポップしてきて、ポップした行列をカレント行列に設定します。
- 行列スタックのトップにある行列がポップされると、スタックのトップの次の行列が新しいスタックのトップとなり、現在の行列になる。
- ポップ後行列スタックが空の場合は、現在の行列を単位行列にする。
これらの2つの関数は、行列の状態を保存して復元するために通常組み合わせて使用されます。これにはたとえば、複数の変換操作が実行された後に、最初の状態に復元する場合などが含まれます。
例えばコード
// 在OpenGL渲染循环的开始部分,保存初始状态
glMatrixMode(GL_MODELVIEW); // 设置当前矩阵模式为模型视图矩阵
glPushMatrix(); // 保存当前模型视图矩阵
// 执行变换操作
glLoadIdentity(); // 将当前模型视图矩阵设置为单位矩阵
glTranslatef(0.0f, 0.0f, -5.0f); // 平移变换
// 绘制物体
// ...
// 恢复初始状态
glPopMatrix(); // 恢复之前保存的模型视图矩阵
このように、glPushMatrix() と glPopMatrix() 関数によって、毎レンダリングサイクルの度に、各オブジェクト描画時は初期状態のマトリックスを使用し、変形操作後に初期状態へ戻すことを保証できます。