向量
- 3个值(x、y、z)组合起来表示2个重要的值,方向和数量。
- 向量 点乘
//实现点乘⽅法: //⽅法1:返回的是-1,1之间的值。它代表这个2个向量的余弦值。
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//方法2:返回2个向量之间的弧度值。
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
- 向量 叉乘(得到一个法线)
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
矩阵
//三维矩阵(x,y,z)
typedef float M3DMatrix33f[9];
//四维矩阵(x,y,z,w)
typedef float M3DMatrix44f[16];
- 单位矩阵(对角线为1)
一个矩阵乘以一个单位矩阵得到的结果还是原来的矩阵。
- 行距阵和列矩阵
转置矩阵(AT):将行矩阵A转换成同序列得到的矩阵,叫做A的转换矩阵。
矩阵转置:行列互换。
列向量进行了特别的注释:矩阵中的最后一行都为0,只有最后一个元素为1。
变换
| 变换 | 应用 |
|---|---|
| 视图 | 指定观察者的位置 |
| 模型 | 在场景中移动物体 |
| 模型视图 | 描述视图/模型变换的二元性 |
| 投影 | 改变视景体大小和设置它的投影方式 |
| 视口 | 伪变化,对窗口上最终输出进行缩放 |
平移
正方体延Z轴进行平移。
旋转
缩放
1.移动观察者
2.移动坐标系
矩阵堆栈
- 顶点变换管线
- 使用矩阵堆栈函数
//类型
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);
- 压栈.出栈
//将当前矩阵压入堆栈(栈顶矩阵copy 一份到栈顶)
void GLMatrixStack::PushMatrix(void);
//将M3DMatrix44f 矩阵对象压入当前矩阵堆栈
void PushMatrix(const M3DMatrix44f mMatrix);
//将GLFrame 对象压入矩阵对象
void PushMatrix(GLFame &frame);
//出栈(出栈指的是移除顶部的矩阵对象)
void GLMatrixStack::PopMatrix(void)
- 仿射变换
//Rotate 函数angle参数是传递的度数,⽽不是弧度
void MatrixStack::Rotate(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);
void MatrixStack::Translate(GLfloat x,GLfloat y,GLfloat z);
void MatrixStack::Scale(GLfloat x,GLfloat y,GLfloat z);
- 仿射变换
//在堆栈的顶部压入任何矩阵
void GLMatrixStack::LoadMatrix(GLFrame &frame);
//矩阵乘以矩阵堆栈顶部的矩阵。相乘结果存储在堆栈的顶部
void GLMatrixStack::MultMatrix(GLFrame &frame);
//将当前的矩阵压栈
void GLMatrixStack::PushMatrix(GLFrame &frame);
- 3D环境中典型的渲染循环流程
- 照相机管理
//GLFrame函数,这个函数用来检索条件适合的照相矩阵
void GetCameraMatrix(M3DMatrix44f m,bool bRotationOnly = flase);