美文网首页
OpenGL 中的向量与矩阵

OpenGL 中的向量与矩阵

作者: 远方竹叶 | 来源:发表于2020-07-16 13:53 被阅读0次

向量

在 3D 笛卡尔坐标系,一个顶点,就是 XYZ 坐标空间上的一个位置。而这个位置是由一个唯一的 XYZ 定义的,而这样的 XYZ 就是向量。

  • 标量:只有大小,没有方向。
  • 矢量:既有大小,又有方向(有方向的标量)

向量的模计算公式:

单位向量

(1,0,0), (0,1,0), (0,0,1),分别称为 X 轴,Y 轴,Z 轴上的单位向量。

如果一个向量不是单位向量,而我们把它缩放到 1,这个过程叫做标准化。(x, y, z),x,y,z不全为0,它的标准化计算:

向量点乘

对于向量 A = (x1, y1, z1) ,向量 B = (x2, y2, z2), 则向量A点乘向量 B:

A·B = x1 * x2 + y1 * y2 + z1 * z2

同时有

A·B = |A||B|Cosθ

以上可见,向量的点乘结果为一个标量,即一个数值。向量点乘符合乘法交换律,即:A·B = B·A。

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

向量叉乘

  • 向量 A 叉乘 B 的结果为一个新的向量C;
  • 且向量 C 的长度:|C| = |A||B|Sinθ;
  • 向量 C 的方向垂直于向量 A 且垂直于向量 B,即垂直于 A,B 形成的平面。
A x B = C
OpenGL 对于叉乘相应的 API:
//1.m3dCrossProduct3 函数获得2个向量量之间的叉乘结果得到一个新的向量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f  u ,const M3DVector3f v);

OpenGL 中的向量

有两个数据类型:

  • M3DVector3f 表示一个三维向量(x, y, z)
  • M3DVector4f 表示一个四维向量(x, y, z, w)

代码示例:

//三维向量
M3DVector3f[3] vVertex = {0, 0, 1};

//四维向量
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
};

矩阵(Matrix)

矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。

分类

  • 行优先矩阵:逐行读取
  • 列优先矩阵:逐列读取
  • 行优先矩阵经过转置可得到列优先矩阵

例如:一个3x4 的数组:

通过行优先机制的编译器,意思为优先保留第1行的所有元素

通过列优先机制的编译器,意思为优先保留第1列的所有元素

单元矩阵

  • 主对角线上数据都是1,其余元素都是0
  • 向量 X 单元矩阵 = 向量,不会发生任何变化

矩阵的点乘

  • 两个矩阵的行数和列数必须相等才能进行点乘
  • 两个矩阵相乘,结果为两个矩阵对应元素相乘组成的矩阵,即

矩阵的叉乘

  • 两个矩阵叉乘必须满足第一个矩阵的列数与第二个矩阵的行数相等
  • 矩阵叉乘不满足交换律

OpenGL 中的矩阵

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

OpenGL 中的 4x4 的矩阵,每一列都是由4个元素组成的向量,第一列表示x轴方向,第二列表示y轴方向,第三列表示z轴方向,第四列表示交换位置

一个4*4矩阵是如何在3D空间中表示一个位置和方向的,列向量进行了特别的标注:矩阵的最后一⾏都为0,只有最后一个元素为1。

初始化一个单元矩阵
  1. 通过GLFloat定义一个一维数组
GLfloat vMatrix[] = {
        1, 0, 0, 0, // X Column
        0, 1, 0, 0, //Y Column
        0, 0, 1, 0, //Z Column
        0, 0, 0, 1 //Translation
    };
  1. 通过 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
    };
  1. 通过 m3dLoadIdentity44f 创建
void m3dLoadIdentity44f(M3DMatrix44f m);
矩阵变换
  1. 数学角度

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

变换后顶点向量 = V_local * M_model * M_view * M_pro
变换后顶点向量量 = 顶点 ✖ 模型矩阵 ✖ 观察矩阵 ✖ 投影矩阵

  1. OpenGL 的维度

变换顶点向量量 = M_pro * M_view * M_model * V_local
变换顶点向量量 = 投影矩阵 ✖ 视图变换矩阵 ✖ 模型矩阵 ✖ 顶点

相关文章

  • OpenGL--向量和矩阵

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

  • OpenGL 中的向量与矩阵

    向量 在 3D 笛卡尔坐标系,一个顶点,就是 XYZ 坐标空间上的一个位置。而这个位置是由一个唯一的 XYZ 定义...

  • OpenGL(六) OpenGL中的向量与矩阵

    向量 在高中时期,其实大家就已经学过向量的相关知识了,这儿我们再复习一遍。 什么是向量? 在数学中,向量(也称为欧...

  • OpenGL 向量与矩阵

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

  • OpenGL矩阵与向量

    对于学习OpenGL有一个误区,就是大家认为,如果不能精通那些3D图形数学知识,会让我们寸步难行,其实不然。就像我...

  • OpenGL 向量与矩阵

    原文地址 OpenGL 向量与矩阵 注:本文旨在记录笔者的学习过程,仅代表笔者个人的理解,如果有表述不准确的地方,...

  • OpenGL -- 向量与矩阵

    向量 单位向量 长度为1的向量,向量长度通过下列公式计算 向量 点乘 点乘只能在两个向量之间进行 两个单位向量进行...

  • OpenGL中的向量、矩阵

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

  • OpenGL中的向量,矩阵

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

  • OpenGL中的向量、矩阵

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

网友评论

      本文标题:OpenGL 中的向量与矩阵

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