1、向量:
点乘:float m3dDotProduce3(u,v):返回两个单位向量的余弦值
叉乘:float m3dCrossProduct3(result,u,v):返回垂直于两个向量定义的平面的向量
2、矩阵:
OpenGL使用的是列优先排序的矩阵
单位矩阵(对角线为1,其他为0):任何向量乘以一个单位矩阵都不会发生任何改变
3、变换:最终获得的变换矩阵会应用到每个顶点
视图矩阵x模型矩阵x投影矩阵->投影摄像机的位置变换,物体对象的位置变换,投影裁剪变换
若顶点向量为Vert,则变换公式是:P * MV * Vert
视觉坐标:一个虚拟的固定坐标系,作为参考坐标系使用
视图变换:其实就是照相机在场景中的位置变换,忧郁视图变换会移动当前的工作坐标系,所以视图变换必须在其他模型变换之前
模型变换:场景中的对象的变换,变换的结果与变换的顺序相关
模型视图:就是视图矩阵和 模型矩阵的结合
投影变换:定义了视景体并创建了裁剪平面。
视口变换:剪裁平面和物理窗口的映射过程
4、模型视图矩阵变换的函数:
快速或获取一个单位矩阵:void m3dLoadIdentity44(m)
平移矩阵:void m3dTranslationMatrix44(m,x,y,z)
旋转矩阵:void m3dRotationMatrix44(m,angle,x,y,z):逆时针,弧度,xyz指定各轴上的分量
如果需要按角度选择,可以这样调用m3dRotationMatrix44(m,m3dDegToRad(angle),x,y,z)
缩放矩阵:void m3dScaleMatrix44(m,xScale,yScale,zScale)
矩阵相乘:void m3dMatrixMultiply44(product,a,b)->product = a*b
5、变换管线:
Vert * V : 顶点根据视图转换的矩阵变换,落在新的视图坐标系中
-> * M : 顶点进行模型变换,落在试图坐标的新位置中
-> * P : 顶点经过投影剪裁之后,落在新的剪裁坐标中
-> 视口变换: 顶点最终落在Windows视口坐标中
6、矩阵堆栈的使用:GLMatrixStack,初始化时已经在堆栈中包含了单位矩阵
载入单位矩阵:GLMatrixStack::LoadIdentity()
载入任何矩阵:GLMatrixStack::LoadMatrix(m)
任何矩阵乘以栈顶元素并压栈:GLMatrixStack::MultMatrix(m)
获取栈顶矩阵:1.const M3DMatrix44f& GLMatrixStack::GetMatrix()
2.void GLMatrixStack::GetMatrix(m)
压栈:复制当前矩阵(或指定矩阵),压入栈顶
1、GLMatrixStack::PushMatrix()
2、GLMatrixStack::PushMatrix(m)
3、GLMatrixStack::PushMatrix(frame)
出栈:GLMatrixStack::PopMatrix()
栈顶变换:对当前栈顶矩阵进行变换
Rotate(angle,x,y,z)
Translate(x,y,z)
Scale(x,y,z)
7、管线管理:GLGeometryTransform
用于管理顶点变换矩阵堆栈和光照法线矩阵堆栈的一个类
protected: M3DMatrix44f _mModelViewProjection; M3DMatrix33f _mNormalMatrix; GLMatrixStack* _mModelView; GLMatrixStack* _mProjection;
用于在渲染的时候将对应的矩阵传递给Shader
8、角色帧和抽象的照相机
角色帧是一个用于代替对象在场景内变换矩阵的一个数据结构:包含空间中的一个位置,一个指向前方的向量,一个指向上方的向量。主要用于照相机对象的变换
class GLFrame{ protected: M3DVector3f vLocation; M3DVector3f vUp; M3DVector3f vForward; }
x列的向量可以通过y和z的叉乘得出,所以不需要存储
GLFrame->Matrix 获取帧的矩阵: GLFrame::GetMatrix(m,bRotationOnly)
照相机:用于管理观察点,为了使用照相机变换,我们使用照相机的角色变换对它进行反转,这样向后移动照相机就相当于向前移动整个场景
3D环境中典型的渲染循环流程:
9、光照变换:光源位置需要转换到视觉坐标系中,所以光源的位置也需要相对于照相机进行变换,再传递给Shader
<span style="white-space:pre"> </span>M3DVector4f vLightPos = {0.0f,10.0f,5.0f,1.0f}; M3DVector4f vLightEyePos; m3dTransformVector4(vLightEyePos,vLightPos,mCamera); shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transformPipline.GetModelViewMatrix(),transformPipline.GetProjectionMatrix(),vLightEyePos,vTorColor);