OpenGL超级宝典笔记二

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*b5、变换管线: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);

最有效的资本是我们的信誉,它24小时不停为我们工作。

OpenGL超级宝典笔记二

相关文章:

你感兴趣的文章:

标签云: