阅读 154

(十)OpenGL 对向量/矩阵的操作

向量

  • 3个值(x、y、z)组合起来表示2个重要的值,方向和数量。
  • 向量 点乘
//实现点乘⽅法: //⽅法1:返回的是-1,1之间的值。它代表这个2个向量的余弦值。
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//方法2:返回2个向量之间的弧度值。
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
复制代码
  • 向量 叉乘(得到一个法线)
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
复制代码

矩阵

//三维矩阵(x,y,z)
typedef float M3DMatrix33f[9];
//四维矩阵(x,y,z,w)
typedef float M3DMatrix44f[16];
复制代码
  • 单位矩阵(对角线为1) 一个矩阵乘以一个单位矩阵得到的结果还是原来的矩阵。
  • 行距阵和列矩阵
    转置矩阵(AT):将行矩阵A转换成同序列得到的矩阵,叫做A的转换矩阵。

矩阵转置:行列互换。

一个4*4矩阵是如何在3D空间中表示一个位置和方向的。

列向量进行了特别的注释:矩阵中的最后一行都为0,只有最后一个元素为1。

变换

变换 应用
视图 指定观察者的位置
模型 在场景中移动物体
模型视图 描述视图/模型变换的二元性
投影 改变视景体大小和设置它的投影方式
视口 伪变化,对窗口上最终输出进行缩放

平移

正方体延Z轴进行平移。

旋转

缩放

当我们想放大🔍一个物体时,可以使用的变换方式:

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);
复制代码
  • 压栈.出栈
//将当前矩阵压入堆栈(栈顶矩阵copy 一份到栈顶)
void GLMatrixStack::PushMatrix(void);
//将M3DMatrix44f 矩阵对象压入当前矩阵堆栈
void PushMatrix(const M3DMatrix44f mMatrix);
//将GLFrame 对象压入矩阵对象
void PushMatrix(GLFame &frame);
//出栈(出栈指的是移除顶部的矩阵对象) 
void GLMatrixStack::PopMatrix(void)
复制代码

  • 仿射变换
//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);
复制代码
  • 仿射变换
//在堆栈的顶部压入任何矩阵
void GLMatrixStack::LoadMatrix(GLFrame &frame);
//矩阵乘以矩阵堆栈顶部的矩阵。相乘结果存储在堆栈的顶部 
void GLMatrixStack::MultMatrix(GLFrame &frame);
//将当前的矩阵压栈
void GLMatrixStack::PushMatrix(GLFrame &frame);
复制代码
  • 3D环境中典型的渲染循环流程
  • 照相机管理
//GLFrame函数,这个函数用来检索条件适合的照相矩阵
void GetCameraMatrix(M3DMatrix44f m,bool bRotationOnly = flase);
复制代码
文章分类
iOS
文章标签