开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天
1 矩阵
矩阵是3D数学的重要基础,在前面已经提到,利用矩阵变换可以进行各种图形变换:同时,矩阵也可以描述坐标系之间的关系,实现坐标系之间的变换。矩阵已经广泛用于其他领域,而不限于计算机图形学,如信息统计和预测等。
矩阵与向量一样存在两种不同但意义相关的定义,即数学定义和几何定义。从数学意义上来讲,矩阵是一个以行和列形式组织数据的集合,可以理解为程序开发中的二维数组,也可以理解为多个向量叠加(注意不是相加)。
2 几何意义
从几何意义上来讲,它表示一组与坐标轴平行的向量,这里说的矩阵是3x3的方阵,表示基于坐标系坐标轴(X/Y/Z)上的位移。
矩阵可以分解为多个沿不同坐标轴的单位向量的叠加,因此利用矩阵可以方便地进行各种图形变换以及坐标系之间的变换。
或许读者还是不理解矩阵,确实,很难具体告诉读者矩阵像什么,只有真正去感受矩阵,才能明白矩阵。
3x3的矩阵可以分解为沿X/Y/Z轴的单位向量分别在坐标系上偏移的向量,即物体坐标系的偏移。
例如:
可以表示3个如下的向量:
X方向的单位向量(1,0,0)--(1,2,3).
Y方向的单位向量(0,1,0)--(4,5,6).
Z方向的单位向量(0,0,1)--(7,8,9).
通过这个简单的举例,基本说明了图形变换时矩阵是如何工作的。
在OSG中定义了一些相关的类用来保存矩阵数据,如物体的方位、摄像机方位和位置等信息。基本的矩阵类如下:
osg::Matrix2
osg::Matrix3
osg::Matrixd
osg::Matrixf
这些矩阵类除了可以进行简单的矩阵存储以外,还定义了矩阵的基本运算、矩阵与向量的乘法、矩阵的平移、旋转与缩放、逆矩阵,重载了矩阵的比较判断等函数,例如:
void operator*=(const Matrixf&other)//乘法
Matrixf operator*(const Matrixf &m)const
bool invert(const Matrixf &rhs)//逆矩阵
void makeScale(const Vec3f&)//缩放
......
void makeTranslate(const Vec3f&)//平移
void makeRotate(const Vec3f&from,const Vec3f&to)//旋转
bool operator<(const Matrixf &m)const//比较判断
bool operator==(const Matrixf &m) const
bool operator!=(const Matrixf &m)const
通过对矩阵的基本介绍,相信读者已经了解了什么是矩阵及矩阵的基本作用。但值得注意的是,在使用矩阵进行图形变换时,要先确定变换的过程,再确定矩阵变换,需要保证过程清晰。
复杂的矩阵变换需要一定的数学技巧,同时也需要一定的经验。在进行矩阵变换时,要按部就班,以便实现正确的符合要求的矩阵变换。