OpenGL 的向量和矩阵

2020-07-18  本文已影响0人  lkm_0bdc

GLTools库中有一个组件叫Math3d,其中包含了大量好用的OpenGl含有3d数学和数据类型。
在开发过程中我们涉及到的图形变换,就会涉及矩阵/向量的计算。

向量

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

在x轴上的向量(1,0,0)向量长度为1,我们称长度1的向量为\color{red}{单位向量}.

向量长度(向量模)计算公式
计算公式

如果一个向量不是单位向量,而我们把它缩放到1的过程叫做\color{red}{标准化}。将一个向量进行标准化就是将它缩为1也叫\color{red}{单位化向量}

OpenGL如何定义向量【math3d 库】

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

点乘

2个向量之间的夹角

向量可以进行加法,减法计算。但是点乘在开发中使用价值非常高的操作,点乘只能发生在2个向量之间进行。
标量:2个(三维向量)单元向量之间进行点乘运算,它表示两个向量之间的夹角。

前提条件:2个向量必须为单位向量
动作:2个三维向量之间进行点乘
结构:返回一个【-1,1】范围的值,这个值就是夹角的cos值(余弦)

如何单位化向量?
(x/xyz,y/xyz,z/xyz)
使用一个非零向量除以它的模(向量的长度),就可以得到方向相同的单位向量。

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

m3dDotProduct3 函数获得2个向量量之间的点乘结果;

float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);

m3dGetAngleBetweenVector3 即可获取2个向量之间夹⻆角的弧度值;

float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);

叉乘

向量之间的叉乘(cross product)也是在业务开发里非常有用的一个计算方式;两个向量之间叉乘就可以得到另外一个向量,新的向量会与原来两个向量定义的平面垂直\color{red}{同时进行叉乘,不必为单元向量}

前提条件:2个普通向量
动作:向量与向量叉乘
结构:向量(垂直与原来2个向量定义的平面的向量)

math3d 库中提供了了关于叉乘的API,m3dCrossProduct3 函数获得2个向量之间的叉乘结果得到一个新的向量

void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);

矩阵(Matrix)

矩阵只有一行或者一列都是合理的。只有一行或者一列数字可以成为向量,也可以叫一个向量。


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

单元矩阵

一个向量x单元矩阵 = 向量x1,不会发生改变


矩阵规则
线性代数角度

为了便于书写,坐标计算都是从左往右顺序计算,如下公式:

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


OpenGL角度公式

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


上一篇 下一篇

猜你喜欢

热点阅读