OpenGL

OpenGL中的向量和矩阵

2020-07-17  本文已影响0人  iOSer_jia

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

向量

在3D笛卡尔坐标系中,一个坐标为(x, y, z)的顶点就是坐标系中的位置,坐标系每个位置都有一个唯一的坐标与之对应,一个xyz坐标我们可以认为他是一个有几何意义(在坐标轴中的位置),有模(到原点的的距离)的一个向量。
向量的模计算公式为:
m = \sqrt{ x^2 + y^2 + z^2 }

这个公式可以通过勾股定理求的

单位化向量

我们将模为1的向量(即m=1)成为单位向量,将一个向量缩放至模为1,这个过程称为标准化向量,也称为单位化向量

由以上公式可以推导出单位化向量的公式为:
(\dfrac{x}{m}, \dfrac{y}{m}, \dfrac{z}{m})

m 为向量的模

向量点乘

点乘也叫数量积,它的结果代表意义是一个向量在另一个向量方向上的投影,是一个标量。


点乘.png

公式为:
A·B = |A||B|cosθ

如果向量A和向量B均为单位向量,那么A·B = cosθ,所以,两个单位向量的点乘结果是它们之间的夹角值的余弦值,范围为[-1, 1]。

OpenGL中可以用 float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v); 函数获得两个向量的点乘结果,也可以用 float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v); 得到两个向量之间夹角的弧度值

向量叉乘

点乘也叫向量积,它的结果代表的几何意义是一个和两个向量都垂直的向量,向量的模长是两个向量组成的平行形的面积。

叉乘.png
它的公式为:

OpenGL中可以用void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);得到两个的叉乘结果。

矩阵

矩阵在数学中的定义是一个按照长方阵列排列的复数或实数集合,在OpenGL中我们经常用来计算物体位置或旋转后的位置。
OpenGL中经常使用以为数组表示一个矩阵(因为OpenGL是使用以列为主的矩阵排序的),

行优先和列优先

如下图,一个矩阵按照从左往右排序的称为行优先矩阵排序,从上往下的称为列优先矩阵排序。

行优先和列优先

矩阵的叉乘

矩阵的相乘是有规则,一个m*n矩阵只能和n*x的矩阵相乘,得到的结果是一个m*x的矩阵,从这里也可以看出矩阵相乘不满足交换律。

矩阵变换顶点的奥秘

一个4*4的矩阵,可以表示三维空间中x,y,z,w要变化的位置和方向。


4*4矩阵.png

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

OpenGL一个4*4的矩阵中,每一列都表示一个向量,如果将一个物体的所有顶点乘以一个这个矩阵,从叉乘的性质可以知道每个顶点表示的向量将会得到一个新的向量,从而变化到另一个给定的位置和方向。

矩阵的使用

平移

void m3dTranslationMatrix44(M3DMatrix44f m, floata x, float y, float z);

旋转

M3DMatrix44f m3dRotationMatrix44(m3dDegToRad(45.0), floata x, float y, float z);

缩放

void m3dScaleMatrix44(M3DMatrix44f m, floata xScale, float yScale, float zScale);

综合变化

void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const M3DMatrix44f b);

更多关于OpenGL中的矩阵和矩阵堆栈可以参考OpenGL的常见矩阵和变化

上一篇下一篇

猜你喜欢

热点阅读