矩阵在游戏开发中的平移变换:
刚开始看3D数学学了矩阵之后并不明白他在游戏中的实际应用到底是怎么回事。
比如(1,0,0)可以表示一个点,也可以表示一个向量,当作为一个点沿x轴平移一个单位之后他的结果是(2,0,0),但是作为一个向量平移之后他的结果是不变的。因此我们需要用到矩阵去进行变换。
一般使用4*4的矩阵进行变换,可能会有人想为什么不用3*3,那样不正好吗?首先先设置一个矩阵M,把一个点放在一个向量v中,v*M=w,w就是变换之后的矩阵,但是还是如上面的例子一样,作为一个点和向量平移之后的结果不同,因此不能用3*3矩阵去表示。
那为什么用4*4就可以呢,请继续往下看。
平移
比如一个点D(x,y,z)要进行平移,我们只要将一个平移向量Q(tx,ty,tz)与其相加就行了,平移之后就是(x+tx,y+ty,z+tz),但是是4*4的矩阵所以我们要增加一个维度w,则行向量为[x,y,z,w]。
设位移向量b=(tx,ty,tz),点(x,y,z)经过位移之后的点为(x+tx,y+ty,z+tz).
如果我们把偏移量放在斜边上的三个位置,则变换后只是简单的倍数关系
如果把偏移量放在最后一行的三个位置则是于位移偏量的相加,第四个数为w*w
这样就很明显看出(x,y,z)的变换。
如果(x,y,z)是坐标就让w=1;
如果(x,y,z)是向量就让w=0
unity中输出物体矩阵信息测试:
缩放:
缩放可以改变一个物体的大小形状,在unity中进行变化就可以通过倍数关系的矩阵,可以采用下面的形式:
这样就放大了a倍。
举个例子,比如通过一个最小点(-4,-4,0)和一个最大点(4,4,0)来定义一个正方形,希望将其沿x轴缩小0.5倍,y轴放大2倍,z轴不变,则我们对应的缩放矩阵则是:
旋转:
先说下旋转该怎么表示,在2D旋转中:
p旋转到q可以得到以下形式的构造矩阵:
所以在3D旋转中一个轴的旋转可以得出:
那么最后三个轴,也就是一个物体的旋转可以推导为:
推导过程很复杂,有兴趣可以看一下。
参考文献:《3D数学:图形与游戏开发》