美文网首页OpenGL/ES、Metal
NO.10 - OpenGL中向量、矩阵

NO.10 - OpenGL中向量、矩阵

作者: z夜流星 | 来源:发表于2020-07-19 02:15 被阅读0次

向量

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


向量

在 X轴上的向量 (1,0,0). 向量⻓度为1. 我们称为长度为1的向量为单位向量。


向量的模的计算

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


向量单位化
向量定义

math3d库,有2个数据类型,能够表示一个三维或者四维向量。
M3DVector3f可以表示一个三维向量(x,y,z),
M3DVector4f则可以表示一个四维向量(x,y,z,w).
在典型情况下,w坐标设为1.0。x,y,z值通过除以w,来进行缩放。而除以1.0则本质上不改变x,y,z值。

参考代码:

//三维向量量/四维向量量的声明
typedef float M3DVector3f[3]; 
typedef float M3DVector4f[4];
//声明一个三维向量 M3DVector3f:类型 vVector:变量名 
M3DVector3f vVector;
//声明一个四维向量并初始化⼀一个四维向量 
M3DVector4f vVertex = {0,0,1,1};
//声明一个三分量顶点数组,例如生成一个三角形 
M3DVector3f vVerts[] = {
           -0.5f,0.0f,0.0f,
            0.5f,0.0f,0.0f, 
            0.0f,0.5f,0.0f
}
向量点乘

2个(三维向量)单元向量 之间进行点乘运算将得到一个标量(不是三维向量,是⼀一个标量).它表示两个向量之间的夹⻆。
注意:
点乘只能发生在两个向量之间,且点乘时,两向量必须是单位向量,如果不是,需要将向量进行单位化后,再点乘。
点乘得到的是一个范围在[-1, 1]之间的值,这个值其实就是夹角的cos值(余弦值)


点乘运算返回2个向量的夹角

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

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

2个向量之间叉乘就可以得到另外一个向量,新的向量会与原来2个向量定义的平面垂直。 同时进行叉乘,不必为单位向量;


叉乘运算结果返回一个新的向量, 这个向量与原来2个向量垂直

OpenGL中针对向量叉乘也提供了对应的API

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

矩阵

单元矩阵
单元矩阵
  • 主对角线上数据都是1,其余元素都是0,即为单元矩阵
  • 向量 X 单元矩阵 = 向量 X 1,不会发生任何变化
  • 向量与单元矩阵相乘的前提是:向量的列数 == 单元矩阵的行数

在其他编程标准中, 许多矩阵库定义⼀个矩阵时,使⽤⼆维数组;OpenGL的约定⾥,更多倾向使⽤ ⼀维数组; 这样做的原因是: OpenGL 使⽤的是Column-Major(以列为主)矩阵排序的约定;

行优先矩阵

行优先矩阵
列优先矩阵
列优先矩阵
  • 行优先矩阵:一行一行读取
  • 列优先矩阵:一列一列读取
  • 两者的关系为:行优先矩阵经过转置 即可得到列优先矩阵

矩阵的点乘

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

矩阵的叉乘

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

OpenGL中单元矩阵的初始化方法
1、通过GLFloat定义一个一维数组。

 GLFloat m[] = {
         1,0,0,0, //X Column
         0,1,0,0, //Y Column
         0,0,1,0, //Z Column
         0,0,0,1 // Translation
}

2、通过M3DMatrix44f创建一个单元矩阵

M3DMatrix44f m = {
           1,0,0,0, //X Column
           0,1,0,0, //Y Column
           0,0,1,0, //Z Column
           0,0,0,1 // Translation 
}

3、通过方法m3dLoadIdentity44f创建单元矩阵

void m3dLoadIdentity44f(M3DMatrix44f m);
矩阵相乘

数学角度

  • 数学中为了方便计算,都是以行矩阵为标准,从左到右的顺序进行计算,所以在数学中,顶点将以行向量的方式表示。

  • 从数学角度理解mvp矩阵的计算,由于顶点是行向量,要满足矩阵相乘的规定条件(即 叉乘的前提),必须将mvp矩阵放在右边,属于右乘。

                 顶点向量 = V_local * M_model * M_view * M_pro
                 顶点向量 = 顶点 * 模型矩阵 * 观察矩阵 * 投影矩阵
    
数学中的矩阵相乘

OpenGL角度

  • OpenGL中的矩阵规定是以列为主,所以顶点以列向量的方式表示。
  • 从OpenGL角度理解mvp矩阵的计算,由于顶点是列向量,如果项进行矩阵规则,就需要满足矩阵相乘的条件,需要将mvp矩阵的顺序颠倒为pvm,且放在列向量的左边,属于左乘。


    OpenGL角度
OpenGL矩阵堆栈中矩阵相乘
矩阵左乘
  1. 从栈顶获取栈顶矩阵 复制到 mTemp
  2. 将栈顶矩阵 mTemp 左乘 mMatrix
  3. 将结果放回栈顶空间⾥里里;

矩阵堆栈代码体现

矩阵堆栈变化
首先 在ChangeSize函数中,得到投影矩阵,将投影矩阵压入投影矩阵堆栈栈顶,并与模型视图矩阵栈顶相乘,将结果覆盖栈顶,即 投影矩阵 * 单元矩阵 = 投影矩阵
RenderScene函数中,将栈顶矩阵copy一份,然后将观察者矩阵与模型视图矩阵堆栈栈顶相乘,其结果覆盖栈顶矩阵,即投影矩阵 * 视图矩阵 = 视图投影矩阵
得到模型矩阵,将模型矩阵与栈顶矩阵相乘,其结果覆盖栈顶矩阵,即 栈顶 = 模型视图投影矩阵。
由此可知,在实际的代码中,mvp矩阵的计算顺序是pvm,最后再将mvp矩阵与顶点矩阵相乘,得到物体变换后的顶点和位置。

相关文章

  • NO.10 - OpenGL中向量、矩阵

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

  • OpenGL--向量和矩阵

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

  • OpenGL中的向量、矩阵

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

  • OpenGL中的向量,矩阵

    一.向量 如图: 在3D笛卡尔坐标系中,A点在XYZ轴上对应的位置分别为OC,OD,OB,在X轴上,我们用X(蓝色...

  • OpenGL中的向量、矩阵

    向量 了解向量之前,先了解什么是标量 标量:只有大小,例如:1,12,13等 向量是有方向的标量,即不仅有大小,还...

  • OpenGL 向量、矩阵

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

  • OpenGL向量、矩阵

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

  • OpenGL 向量/矩阵

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

  • OpenGL 矩阵基础变化

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

  • OpenGL中的向量和矩阵

    OpenGL坐标变化时经常用到矩阵来计算变化后点的位置,为了更好的理解3D数学在OpenGL中的作用,本文将简单地...

网友评论

    本文标题:NO.10 - OpenGL中向量、矩阵

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