OpenGL基础常用类解释

421 阅读3分钟

GFrame 参考帧

其中存储了一个世界坐标点和2个世界坐标下的方向量,也就是9GLFloat值,分别用来表示:

当前位置点,向前方向量,向上方向向量。

GLFrame可以表示世界坐标系中任意物体的位置与方向。

无论相机还是模型,都可以使用GLFrame来表示。

对任意一个使用GLFrame来表示的物体而言,涉及到的坐标系有两个:

  • 永远不变的世界坐标系
  • 针对于自身的物体坐标系(即绘图坐标系)

为什么modelFrame.MoveForward(7.0f); 是将物体向垂直于纸面方面移动了7个像素。

对于物体自身的物体坐标系有以下特点:

  • x轴永远平行于视口的水平方向
    • +x 方向根据右手定则+y +z得出
  • y轴永远平行于视口的垂直方向
    • +y 竖直向上
  • z轴永远平行于视口的垂直纸面
    • +z 垂直纸面向里

例子

对于相机,默认状态下,其物体坐标系为

+y:竖直向上
+z:垂直于纸面向里(相机看到的方向)
+x:根据右手定则为水平向左

影响:

y若增大,则相机上移,看到的景物下移。
z若增大,则相机向前移动,看到的景物更加靠近,
x若增大,则相机向左移动,看到的景物右移

所以针对抛出的问题,模型参考帧向前意味着沿+z轴方向前进7个单位。


GLFrustum 平截头体

定义一个平截头体,它计算一个用于实现透视投影的矩阵,并把它与当前的投影矩阵(一般是单位矩阵)相乘。

也即是改函数构造了一个视景体用来将模型进行投影,来裁剪模型,决定模型哪些在视景体里,哪些在视景体的外面。在视景体之外的就不可见。

翻译 perspective: 透视

viewFrustum.SetPerspective(fovy, aspect, zNear, zFar)	// 设置透视矩阵
// 参数信息,参见上一篇

GLMatrixStack矩阵堆栈

我们在使用矩阵对所渲染的视图做图形变换时(如平移,缩放,旋转),需要对矩阵进行点乘或叉乘计算。

我们计算后的结果往往使用GLMatrixStack来存储,但是它究竟是个什么东西呢?

通过下图展示流程:

矩阵堆栈

常见API操作

//类型
GLMatrixStack::GLMatrixStack(int iStackDepth = 64);

//在堆栈顶部载入一个单元矩阵
void GLMatrixStack::LoadIdentity(void);

//在堆栈顶部载⼊任何矩阵 //参数:4*4矩阵
void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);

//矩阵乘以矩阵堆栈顶部矩阵,相乘结果存储到堆栈的顶部
void GLMatrixStack::MultMatrix(const M3DMatrix44f);

//获取矩阵堆栈顶部的值 GetMatrix 函数 
//为了适应GLShaderMananger的使⽤用,或者获取顶部矩阵的副本
const M3DMatrix44f & GLMatrixStack::GetMatrix(void);
void GLMatrixStack::GetMatrix(M3DMatrix44f mMatrix);		# 获取栈顶元素,将其赋值给mMatrix

入栈出栈操作

//将当前矩阵压入堆栈(栈顶矩阵copy 一份到栈顶)
 void GLMatrixStack::PushMatrix(void);

//将M3DMatrix44f 矩阵对象压入当前矩阵堆栈
void PushMatrix(const M3DMatrix44f mMatrix);

//将GLFrame 对象压入矩阵对象
void PushMatrix(GLFame &frame);

//出栈(出栈指的是移除顶部的矩阵对象)
void GLMatrixStack::PopMatrix(void);

GLGeometryTransform 几何矩阵

专门用来管理 模型矩阵投影矩阵 的。 其实质就是将两个矩阵堆栈都存到它这个管道里,方便我们使用的时候拿出来。


总结

通过这些常用类及操作API解析,可以大概了解下代码实现的一些方案,便于理解代码的编写。