今天豁然开朗来记录一下我理解的矩阵以及四元数和点乘与叉乘的理解。
首先说矩阵以及四元数
矩阵的乘法是根据n*m列来获取的,n的行数是代表结果的行数,m的列数代表结果的列数。
红色与黑色表示第一个矩阵中的4个数,紫色和灰色表示第二个矩阵的4个数,矩阵的乘法是第一个矩阵的n行与第二个矩阵的m列想乘并把乘机相加的到结果矩阵 第(n,m)位置的结果。
而四元数表示一个[x,y,z,1] * 4*4的矩阵。每组的矩阵正好只有一个有值。[1 ,0,0,0] [0,1,0,0][0,0,1,0][Tx,Ty,Tz,1].其实我们可以看作不同维度的4条线。其实矩阵就是方程式的变换表达方式。具体理解参见http://www.ruanyifeng.com/blog/2015/09/matrix-multiplication.html
当我们从4维空间的向量表示一个旋转的角度就不会出现欧拉旋转那样的万象限死锁。原因是,一个一维度的四元素与一个4*4的矩阵相乘的话,我们就能够获得一个新的一维度的四元数。
这就是为什么要加一个维度来解决三维旋转死锁的原因。如果有四维空间的话,我们如果要解决四维空间死锁的问题我觉得也需要再加一个维度来解决。
从矩阵的乘法,我们来讲点乘与叉乘,点乘很简单就是两个向量的每个元素的乘法,符合我们平常的理解。就是x*x+y*y+z*z通过也可以是a·b=|a|·|b|cos<a,b>这种表示。通过点乘得到的结果是标量不能代表方向。
而叉乘,如维基百科https://en.wikipedia.org/wiki/Cross_product每个维度的坐标都先与xyz的单位向量相乘后在做运算,所以得到的结果可以描述一个向量。(具体自己也没看太明白)
而在Unity中通过点乘描述旋转角度,而叉乘描述的是方位,这里方位的理解是,因为点乘是有方向的,如果点乘得到的结果是一个面积,而这个面正好是我们原始朝向转向点需要转向的方向,这里不再需要通过角度来做正向与反向的判断(如果用点乘的角度来计算转的方向的话当然会出现我们是正向转还是逆向转的问题。)而叉乘得到的结果是个一个面积,也就是说转向扫过的面,只会有一个朝向,逆向朝向的话面积与算出来的面积不对称。这样我们省略掉了一个点乘得到角度向左还是向右转的步骤。
Thinkings and Tips:
1.还有个猜想x,y,z的值表示一个空间点。当我们在通过另一个维度w。来计算空间点的时候,是否不会影响x,y,z空间点的位置呢。也就是四元素的数学原理到底是怎么样子的呢。
2.矩阵的表达方式并不能用加减乘除的普通四维来理解,因为矩阵是线与面的表达计算方式,而我们普通的运算只是点而已。矩阵的出现是为方程式的表达简化而出现的。也就是线性映射。