OpenGL 中关于观察者矩阵与投影矩阵的关系(GLFrame、M3DMatrix44f、GLMatrixStack)

561 阅读1分钟

GLFrame (参考帧)与M3DMatrix44f矩阵

  • 在OpenGL中我们可以通GLFrame类表示物体或 观察者的坐标,GLFrame 提供了旋转,移动的函数(MoveForward、MoveUp、MoveRight) 以及RotateWorld 式的旋转函数,可以快速的完成平移以及旋转操作

  • 通过 void GetCameraMatrix(M3DMatrix44f m, bool bRotationOnly = false) void GetMatrix(M3DMatrix44f m, bool bRotationOnly = false)我们可以很容易的获取到GLFrame对应的M3DMatrix44f 矩阵

GLMatrixStack 矩阵堆栈 与 M3DMatrix44f

GLMatrixStack::函数名称 函数说明
void LoadIdentity(void) 调用顶部载入单元矩阵
void LoadMatrix(const M3DMatrix44f mMatrix) 向矩阵堆栈中压入一个矩阵 与 PushMatrix相同
PushMatrix(const M3DMatrix44f mMatrix) 向矩阵堆栈中压入一个矩阵
void PopMatrix(void) 向矩阵堆栈中推出矩阵

在RenderScene函数中我们通过获取到的模型变换最终矩阵压入到模型视图矩阵堆栈中,这样在 GLGeometryTransform::SetMatrixStacks 中获取到的就是我们压栈后的矩阵,当然我们也可以一次也入观察者矩阵与物体矩阵,值得注意的是依次压入是有先后顺序的,建议通过m3dMatrixMultiply44()获取到混合矩阵后压入

 modelViewMatrix.PushMatrix(finalMatrix);

GLGeometryTransform 几何矩阵

在OpenGL 设置变换管道(GLGeometryTransform)时候我经常使用GLGeometryTransform 类用来管理 模型矩阵 和投影矩阵

 //设置变换管线以使用两个矩阵堆栈
    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);

关联模型矩阵 和投影矩阵 仅需要一次 ,绘制图形时,会根据transformPipeline获取模型视图与投影矩阵选择不同的着色器绘制不同的图形


    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vGreen);