OSG之矩阵

259 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天

1 矩阵

矩阵是3D数学的重要基础,在前面已经提到,利用矩阵变换可以进行各种图形变换:同时,矩阵也可以描述坐标系之间的关系,实现坐标系之间的变换。矩阵已经广泛用于其他领域,而不限于计算机图形学,如信息统计和预测等。

矩阵与向量一样存在两种不同但意义相关的定义,即数学定义和几何定义。从数学意义上来讲,矩阵是一个以行和列形式组织数据的集合,可以理解为程序开发中的二维数组,也可以理解为多个向量叠加(注意不是相加)。

2 几何意义

从几何意义上来讲,它表示一组与坐标轴平行的向量,这里说的矩阵是3x3的方阵,表示基于坐标系坐标轴(X/Y/Z)上的位移。

矩阵可以分解为多个沿不同坐标轴的单位向量的叠加,因此利用矩阵可以方便地进行各种图形变换以及坐标系之间的变换。

或许读者还是不理解矩阵,确实,很难具体告诉读者矩阵像什么,只有真正去感受矩阵,才能明白矩阵。

3x3的矩阵可以分解为沿X/Y/Z轴的单位向量分别在坐标系上偏移的向量,即物体坐标系的偏移。

例如:

3.png

可以表示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 

通过对矩阵的基本介绍,相信读者已经了解了什么是矩阵及矩阵的基本作用。但值得注意的是,在使用矩阵进行图形变换时,要先确定变换的过程,再确定矩阵变换,需要保证过程清晰。

复杂的矩阵变换需要一定的数学技巧,同时也需要一定的经验。在进行矩阵变换时,要按部就班,以便实现正确的符合要求的矩阵变换。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天