OpenGL超级宝典(第五版)第四章:基础变换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjz520yy/article/details/81913484

转换矩阵:转换矩阵是由一个4个向量组成的4x4矩阵,每个向量由x,y,z,w组成,其中w代表缩放大小。如图所示:
这里写图片描述

渲染变换流程:一个模型到最终2D屏幕上显示出来,大致经历以下流程:
这里写图片描述
其中各种矩阵对应变换如下所示:
模型视图矩阵:由视图变换和模型变化两部分组成。含义如下:
1.视图变换:就是将观察者(如:摄像机)放置在任意一个位置以及任意一个方向上观察场景。
2.模型变换:就是操作模型中的所有对象,对它们进行移动,旋转和缩放处理。而这些变换又可以通过视图变换实现,所以模型变换和视图变换之间存在二元性。
投影矩阵:由投影变换生成。正投影没有深度区分,常用于2d绘制中。透视投影有深度之分,常用于需要透视缩短(既是近大远小)的3d绘制中。经过投影变换后将坐标映射到+-1.0的空间中,其他位置顶点将会被裁剪掉。

GLTools中GLTriangleBatch类:是一种存储三角形的批处理对象,用表面法线计算光线和纹理坐标,进而通过定点缓冲区渲染到界面上。常用接口如下:
1.void BeginMesh(GLint num):指定最多使用的顶点数,用来构建网格。
2.void AddTriangle(M3DVector3f verts[3], M3DVector3f norms[3], M3DVector2f texCoords[3]):通过三个顶点坐标,三个法线坐标和三个纹理坐标来添加三角形。
3.void End():结束三角形批处理对象数据添加。
4.void Draw():将批处理对象中的顶点按照三角形图元批次渲染出来。

GLTools中GLFrustum类:表示平面截头体,也表示视景体。常用接口如下:
1.void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax):创建一个正交投影矩阵。参数分别为x,y,z三个轴方向上的坐标区间来组合成一个视口区域。
2.void SetPerspective(float fov, float aspect, float near, float far):创建一个透视投影矩阵。参数fov表示从顶点方向看去的视场角度。aspect表示视口宽度和高度的比值。near表示近切面距离。far表示远切面距离。
3.M3DMatrix44f GetProjectionMatrix():获取一个投影矩阵。

GLTools math3d类:用来进行向量和矩阵之间的数学运算。常见的接口如下:
1.float m3dDotProduct3(const M3DVector3f u, const M3DVector3f v):对向量u和向量v之间进行点乘操作,返回一个-1到1之间的浮点类型数值,这个数值代表向量u和向量v之间的余弦值。
2.float m3dGetAngleBetweenVector3(const M3DVector3f u, const M3DVector3f v):获取向量u和向量v之间的夹角值。
3.void m3dCrossProduct3(M3DVector3f result, const M3DVector3f u, const M3DVector3f v):对向量u和v之间进行叉乘操作,返回一个新的向量result,并且这个向量result垂直于向量u和向量v所定义的平面。当向量u和向量v互换位置时,得到的result方向也会与不换位置时相反。
4.void m3dLoadIdentity44(M3DMatrix44f m):获取一个单位矩阵。
5.void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z):对顶点按照指定点(x,y,z)进行移动操作。
6.void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z):对顶点按照指定点(x,y,z)旋转指定角度angle。
7.void m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale):对顶点按照指定坐标轴方向(xScale, yScale, zScale)进行缩放。
8.void m3dMatrixMultiply44(M3DMatrix44f product, M3DMatrix44f a, M3DMatrix44f b):将矩阵a乘以矩阵b,得到结果矩阵product。其中product代表着将a和b两种矩阵操作结合在一起的意思。
9.void glMakeSphere(GLTriangleBatch& sphereBatch, GLfloat radius, GLint slices, GLint stacks):创建一个球体。sphereBatch表示三角形批处理对象,里面存放着三角形顶点数据。radius表示球体半径。slices表示围绕球体排列的三角形对数。stacks表示从球体底部堆砌到顶部的三角形数量。
10.void glMakeTorus(GLTriangleBatch& torusBatch, GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, GLint numMinor):创建一个花托。torusBatch表示三角形批处理对象,里面存放着三角形顶点数据。majorRadius表示花托中心到外边缘的半径。minorRadius表示花托中心到内边缘的半径。numMajor表示沿着主半径细分单元的数量。numMinor表示沿着内部较小半径细分单元的数量。
11.void glMakeCylinder(GLTriangleBatch& cylinderBatch, GLfloat baseRadius, GLfloat topRadius, GLfloat length, GLint slices, GLint stacks):创建一个圆柱或者圆锥。cylinderBatch表示三角形批处理对象,里面存放着三角形顶点数据。baseRadius表是底部半径。topRadius表示顶部半径。slices表示围绕z轴的三角形对的数量。stacks表示从圆柱体底部堆砌到顶部圆环的数量。
12.void glMakeDisk(GLTriangleBatch& diskBatch, GLfloat innerRadius, GLfloat outerRadius, GLint slices, GLint stacks):创建一个圆盘。diskBatch表示三角形批处理对象,里面存放着三角形顶点数据。innerRadius表示内部半径。outerRadius表示外部半径。
13.void m3dTransformVector4(M3DVector4 eyePos, M3DVector4 pos, M3DMatrix44f cameraMatrix):将位置坐标pos经过照相机变换矩阵cameraMatrixb变换后,得到一个基于照相机的视觉坐标eyePos。

GLTools中GLFrame类:GLFrame是基于本地坐标系的角色帧类。定义形式如图所示:
这里写图片描述
其中位置坐标vLocation对应转换矩阵中的第四列,向上方向vUp对应转换矩阵中的第二列,向前矩阵vForward对应转换矩阵中的第三列,而vUp和vForward的叉乘对应转换矩阵中的第一列。常用接口如下:
1.void GetMatrix(M3DMatrix44f matrix, bool rotationOnly = false):获取转换矩阵。核心实现代码如下图所示:
这里写图片描述
这里写图片描述
2.void MoveForward(float linear):移动角色帧。
3.void RotateWorld(float angular, float x, floay y, float z):旋转角色帧。
4.void GetCameraMatrix(M3DMatrix44f m, bool rotationOnly = false):获取照相机矩阵。通过该矩阵对角色进行照相机变换,达到角色变换的目的。

GLTools中GLMartixStack类:是GLTools中用来进行矩阵操作的堆栈辅助类。常用接口如下:
1.GLMatrixStack(int stackDepth = 64):构造矩阵堆栈类对象,最大深度为64层。
2.void LoadIdentify():在栈顶载入单位矩阵。
3.void LoadMatrix(const M3DMatrix44f m):在栈顶载入任何矩阵。
4.void LoadMatrix(GLFrame& frame):在栈顶载入参考帧中的矩阵。
5.void MultMatrix(const M3DMatrix44f m):将矩阵m乘以栈顶矩阵并将结果存入栈顶矩阵中。
6.void MultMatrix(GLFrame& frame):将参考帧中矩阵乘以栈顶矩阵并将结果存入栈顶矩阵中。
7.const M3DMatrix44f& GetMatrixStack(): 获取栈顶矩阵的引用。
8.void GetMatrixStack(M3DMatrix44f matrix):获取栈顶矩阵的拷贝值。
9.void PushMatrix():将当前矩阵压入栈顶。
10.void PushMatrix(const M3DMatrix44f matrix):将矩阵matrix压入栈顶。
11.void PushMatrix(GLFrame& frame):将参考帧frame中的矩阵压入栈顶。
12.void PopMatrix():弹出栈顶矩阵,其他元素点自动移位。
13.void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z):创建按照指定点和角度进行旋转操作的矩阵。
14.void Translate(GLfloat x, GLfloat y, GLfloat z):创建按照指定点进行移动操作的矩阵。
15.void Scale(GLfloat x, GLfloat y, GLfloat z):创建按照指定轴进行缩放操作的矩阵。

GLTools中GLGeometryTransform类:几何变换工具类。常用接口如下:
1.void SetMatrixStacks(GLMatrixStack modelviewStack, GLMatrixStack projectionStack):用模型视图矩阵堆栈和投影矩阵堆栈来设置几何变换管理器。
2.M3DMatrix44f GetModelViewProjectionMatrix():获取模型视图投影矩阵对象。

猜你喜欢

转载自blog.csdn.net/zjz520yy/article/details/81913484