欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGL 基础变化(四)

程序员文章站 2022-07-04 12:03:29
...
  • 3D数学

  • 矩阵

  • 向量(方向和数量)

  • OpenGL math3d库
    1、M3DVector3f可以表示一个三维向量(x,y,z)
    2、M3DVector4f可以表示一个四维向量(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);