OpenGL坐标变化时经常用到矩阵来计算变化后点的位置,为了更好的理解3D数学在OpenGL中的作用,本文将简单地介绍一些概念。
向量
在3D笛卡尔坐标系中,一个坐标为(x, y, z)的顶点就是坐标系中的位置,坐标系每个位置都有一个唯一的坐标与之对应,一个xyz坐标我们可以认为他是一个有几何意义(在坐标轴中的位置),有模(到原点的的距离)的一个向量。
向量的模计算公式为:
这个公式可以通过勾股定理求的
单位化向量
我们将模为1的向量(即m=1)成为单位向量,将一个向量缩放至模为1,这个过程称为标准化向量,也称为单位化向量
由以上公式可以推导出单位化向量的公式为:
m 为向量的模
向量点乘
点乘也叫数量积,它的结果代表意义是一个向量在另一个向量方向上的投影,是一个标量。
点乘.png
公式为:
如果向量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的常见矩阵和变化
网友评论