美文网首页
OpenGL 向量、矩阵

OpenGL 向量、矩阵

作者: 汉包包 | 来源:发表于2020-07-16 22:40 被阅读0次

向量

在坐标系上,一个顶点就是X,Y,Z坐标空间的一个位置。由一个单独的XYZ定义的这样就是向量。

向量定义图

单位向量

向量⻓度为1. 我们称为⻓度为1的向量

向量⻓度(向量的模)计算公式

如果⼀个向量不是单位向量, ⽽我们把它缩放到1. 这个过程叫做标准化. 将⼀个向量进⾏标准化就是将它的缩为1; 也叫做单位化向量;

在OpenGL如何定义一个向量 ---------- math3d 库

  • match3d库有两个数据类型,能够表示一个三维或四维向量。
  1. M3DVector3f可以表示一个三维向量(x,y,z)
  2. M3DVector4f可以表示一个四维向量(x,y,z,w)w是缩放因子。x、y、z通过除以w来进行缩放。
typedef float M3DVector3f[3];
typedef float M3DVector4f[4];
//声明⼀个三分量向量操作:
M3DVector3f vVector;

//类似,声明⼀个四分量的操作:
M3DVector4f vVectro= {0.0f,0.0f,1.0f,1.0f};

//声明一个三分量顶点数组,例如⽣成⼀个三⻆形
M3DVector3f vVector[] = {
    0.5, 0.0, 0.0,
    0.0, 0.5, 0.0,
    0.0, 0.0, 0.0,    
};

向量点乘

1.点乘只能发生在两个向量之间,且点乘时,两向量必须是单位向量,如果不是,需要将向量进行单位化后,再点乘
2.点乘得到的是两个向量之间的夹角的余弦值 即 cosα,范围在[-1, 1]之间,是一个标量

向量点乘
math3d 库中提供了关于点乘的API

//1.m3dDotProduct3 函数获得2个向量之间的点乘结果; ----- 获得2个向量量之间的点乘结果,即余弦值 = cosα
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//2.m3dGetAngleBetweenVector3 即可获取2个向量之间夹⻆的弧度值; ------ 获取2个向量之间夹⻆的弧度值,即α = arccos(余弦值)
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);

向量叉乘

1.两个向量之间叉乘得到结果同样是一个向量,且该向量垂直于两个向量所构成的平面
2.由于结果与两向量构成平面垂直,也可以理解为得到的结果是该平面的法线

向量叉乘
math3d 库中提供了关于叉乘的API

//m3dCrossProduct3 函数获得2个向量之间的叉乘结果得到⼀个新的向量 ------- 获得2个向量之间的叉乘结果得到一个新的向量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);

矩阵

1.矩阵只有⼀⾏或者⼀列都是合理的. 只有⼀⾏或者⼀列数字可以称为向量. 也可以称为矩阵;
2.OpenGL的约定里,更多倾向使⽤一维数组,这样做的原因是 OpenGL 使用的是 Column-Major(以列为主) 矩阵排序的约定。

typedef float M3DMatrix33f[9];// 3x3矩阵
typedef float M3DMatrix44f[16];// 4x4矩阵
4*4矩阵
这 16 个值表示空间中⼀个特定的位置,这4列中,每⼀列都是有4个元素组成的向量。如果将⼀个对象所有的顶点向量乘以这个矩阵,就能让整个对象变换到空间中给定的位置和方向。
单元矩阵初始化方式
// 方式一:
GLFoat m[] = {
  1, 0, 0, 0,      // X 列
  0, 1, 0, 0,      // Y 列
  0, 0, 1, 0,      // Z 列
  0, 0, 0, 1,      // Translation
}
// 方式二:
M3DMatrix44f m = {
  1, 0, 0, 0,      // X 列
  0, 1, 0, 0,      // Y 列
  0, 0, 1, 0,      // Z 列
  0, 0, 0, 1,      // Translation
}
// 方式三:
void m3dLoadIdentity44f(M3DMatrix44f m);

将一个向量 乘以 单元矩阵 等于向量本身。

矩阵的点乘

1.矩阵可以进行点乘的前提:两个矩阵的行列数相等
2.矩阵A · 矩阵B = 矩阵C
规则: 矩阵A的第一个元素与矩阵B的第一个元素的乘积 = 矩阵C的第一个元素

矩阵点乘

矩阵的叉乘

1.矩阵可以进行叉乘的前提:第一个矩阵的列数 = 第二个矩阵的行数
2.矩阵A X 矩阵B = 矩阵C
规则:矩阵A第一行与矩阵B第一列对应元素乘积的综合 = 矩阵C的第一个元素

矩阵的叉乘

理解OpenGL中的矩阵相乘

1.数学中为了方便计算,都是以行矩阵为标准,从左到右的顺序进行计算,所以在数学中,顶点将以行向量的方式表示
2.从数学角度理解mvp矩阵的计算,由于顶点是行向量,要满足矩阵相乘的规定条件(即 叉乘的前提),必须将mvp矩阵放在右边,属于右乘
顶点向量 = V_local * M_model * M_view * M_pro
顶点向量 = 顶点 * 模型矩阵 * 观察矩阵 * 投影矩阵

顶点 乘以 模型矩阵 乘以 观察矩阵 乘以 投影矩阵

理解OpenGL中的矩阵角度

1.OpenGL中的矩阵规定是以列为主,所以顶点以列向量的方式表示
2.从OpenGL角度理解mvp矩阵的计算,由于顶点是列向量,如果项进行矩阵规则,就需要满足矩阵相乘的条件,需要将mvp矩阵的顺序颠倒为pvm,且放在列向量的左边,属于左乘
变换顶点向量 = M_pro * M_view * M_model * V_local
变换顶点向量 = 投影矩阵 ✖ 视图变换矩阵 ✖ 模型矩阵 ✖ 顶点

投影矩阵 ✖ 视图变换矩阵 ✖ 模型矩阵 ✖ 顶点

OpenGL矩阵堆栈中矩阵相乘源码分析

从OpenGL矩阵堆栈中矩阵相乘源码分析,主要有以下3步

1.从栈顶获取栈顶矩阵,复制到mTemp
2.将栈顶矩阵 mTemp 左乘 mMatrix
3.将结果放回栈顶,覆盖栈顶矩阵

矩阵相乘源码

而我们在观察者不动、物体动的观察方式中,根据之前Demo代码可知

1.ChangeSize函数中,得到投影矩阵,将投影矩阵压入投影矩阵堆栈栈顶,并与模型视图矩阵栈顶相乘,将结果覆盖栈顶,即 投影矩阵 * 单元矩阵 = 投影矩阵
2.RenderScene函数中,将栈顶矩阵copy一份,然后将观察者矩阵与模型视图矩阵堆栈栈顶相乘,其结果覆盖栈顶矩阵,即投影矩阵 * 视图矩阵 = 视图投影矩阵
得到模型矩阵,将模型矩阵与栈顶矩阵相乘,其结果覆盖栈顶矩阵,即 栈顶 = 模型视图投影矩阵

上述代码,矩阵堆栈的变化过程如下

堆栈变化过程

由此可知,在实际的代码中,mvp矩阵的计算顺序是pvm,最后再将mvp矩阵与顶点矩阵相乘,得到物体变换后的顶点和位置

相关文章

  • OpenGL--向量和矩阵

    在我们OpenGL中涉及到图形变换的时候经常会运用到向量/矩阵的运算。今天我们就来了解下OpenGL中的向量、矩阵...

  • OpenGL 向量、矩阵

    向量 在坐标系上,一个顶点就是X,Y,Z坐标空间的一个位置。由一个单独的XYZ定义的这样就是向量。 单位向量 向量...

  • OpenGL向量、矩阵

    向量 在 3D 笛卡尔坐标系, 基本上一个顶点就是XYZ 坐标空间上的⼀个位置。而在空间中给定的一个位置恰是由一个...

  • OpenGL 向量/矩阵

    向量 什么是向量 在3D笛卡坐标系中,基本上,一个顶点就是XYZ坐标空间上的一个位置。而在空间中给定的一个位置,恰...

  • OpenGL 矩阵基础变化

    OpenGL⾥的矩阵/向量 向量:3个值(x、y、z)组合起来表示2个重要的值,⽅向和数量. 矩阵: 在OPenG...

  • 006---OpenGL基础变化

    [toc] OpenGL 矩阵向量 向量 一个顶点同时也是一个向量. 方向 数量 长度或模为1的 当前这个顶点为 ...

  • OpenGL 向量 矩阵 变换

    向量 单位向量 标量:只有大小,例如:1,2,3...向量:既有大小又有方向。单位向量:向量长度(向量的模)为1的...

  • 六、OpenGL 向量 矩阵

    一、向量 向量是指在3D笛卡尔空间坐标系中,坐标系中的一个的一个顶点位置,这个顶点拥有X、Y、Z坐标值。 单位向量...

  • OpenGL向量、矩阵相关

    向量 定义:既有大小,又有方向的一个几何对象。 单位向量:不论方向,大小为1的向量 向量大小(长度/模)的计算公式...

  • OpenGL 向量与矩阵

    1、向量 在 3D 笛卡尔坐标系, 基本上一个顶点就是XYZ 坐标空间上的⼀个位置,而在空间中给定的一个位置恰恰是...

网友评论

      本文标题:OpenGL 向量、矩阵

      本文链接:https://www.haomeiwen.com/subject/naimhktx.html