GFrame 参考帧
其中存储了一个世界坐标点和2个世界坐标下的方向量,也就是9个GLFloat值,分别用来表示:
当前位置点,向前方向量,向上方向向量。
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解析,可以大概了解下代码实现的一些方案,便于理解代码的编写。