3D数学
矩阵
向量(方向和数量)
OpenGL math3d库
1、M3DVector3f
可以表示一个三维向量(x,y,z)
2、M3DVector4
f可以表示一个四维向量(x,y,z,w),x,y,z值通过除以w,来进行缩放点乘
1、⽅法1:返回的是-1,1之间的值。它代表这个2个向量的余弦值
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
2、方法2:返回2个向量之间的弧度值 (角度)
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
叉乘(左手)
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
OpenGL 下的矩阵
typedef float M3DMatrix33f[9];
typedef float M3DMatrix44f[16];
理解变化
变换 | 应用 |
---|---|
视图 | 指定观察者或照相机的位置 |
模型 | 在场景中移动物体 |
模型视图 | 描述视图和模型变换的二元性 |
投影 | 改变视景体大小和设置它的投影方式 |
视口 | 伪变化,对窗口上最终输出进行缩放 |
视觉坐标
平移
旋转
缩放
透视投影/正投影
CLFrustum::SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);
透视投影
CLFrustum::SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax);
正投影行矩阵、列矩阵
转置矩阵---矩阵转置,其实就是⾏列互换。
1、⼀个4*4矩阵是如何在3D空间中表示一个位置和⽅向的
2、列向量进行了特别的标注:矩阵的最后一行都为0,只有最后一个元素为1
3、将一个向量乘以一个单位矩阵得到的结果还是原来的矩阵
一、顶点变换管线
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);
1.3 压栈.出栈
//将当前矩阵压⼊堆栈(栈顶矩阵copy 一份到栈顶)
void GLMatrixStack::PushMatrix(void);
//将M3DMatrix44f 矩阵对象压入当前矩阵堆栈
void PushMatrix(const M3DMatrix44f mMatrix);
//将GLFame 对象压入矩阵对象
void PushMatrix(GLFame &frame);
//出栈(出栈指的是移除顶部的矩阵对象)
void GLMatrixStack::PopMatrix(void);
1.4 仿射变换
//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);
2.1 使⽤照相机(摄像机) 和 角色帧 进行移动
class GLFrame
{
protected:
M3DVector3f vOrigin; // Where am I?
M3DVector3f vForward; // Where am I going?
M3DVector3f vUp; // Which way is up?
}
2.2 矩阵分析
2.3 GLFrame
//将堆栈的顶部压入任何矩阵
void GLMatrixStack::LoadMatrix(GLFrame &frame);
//矩阵乘以矩阵堆栈顶部的矩阵。相乘结果存储在堆栈的顶部
void GLMatrixStack::MultMatrix(GLFrame &frame);
//将当前的矩阵压栈
void GLMatrixStack::PushMatrix(GLFrame &frame);
2.4 照相机管理
//GLFrame函数,这个函数⽤用来检索条件适合的照相矩阵
void GetCameraMatrix(M3DMatrix44f m,bool bRotationOnly = flase);