变量如下定义:
代码语言:javascript复制mat3 m3a, m3b, m3c;vec3 v3a, v3b, v3c;
float t;
矢量和浮点数的运算
代码语言:javascript复制v3b = v3a f;
其效果是为矢量的每一个分量加上浮点数f,与下面代码相同:
代码语言:javascript复制v3b.x = v3a.x f;
v3b.y = v3a.y f;
v3b.z = v3a.z f;
其它操作符 -、*、/ 效果一样。
矢量与矢量运算
代码语言:javascript复制v3c = v3a v3b;
矢量运算操作发生在矢量的每个分量上,与下面代码相同:
代码语言:javascript复制v3c.x = v3a.x v3b.x;
v3c.y = v3a.y v3b.y;
v3c.z = v3a.z v3b.z;
其它操作符 -、*、/ 效果一样。
矩阵与浮点数的运算
m3b = m3a * f;
矩阵与浮点数的运算发生在矩阵的每个分量上,与下面等价:
代码语言:javascript复制m3b[0].x = m3a[0].x * f;
m3b[0].y = m3a[0].y * f;
m3b[0].x = m3a[0].y * f;
m3b[1].x = m3a[1].x * f;
m3b[1].y = m3a[1].y * f;
m3b[1].x = m3a[1].y * f;
m3b[2].x = m3a[2].x * f;
m3b[2].y = m3a[2].y * f;
m3b[2].x = m3a[2].y * f;
矩阵右乘矢量
v3b = m3a * v3a;
矩阵右乘矢量的结果是矢量,其中每个分量都是原矢量中的对应分量,乘上矩阵对应行的每个元素的积的加和, 与下面等价:
代码语言:javascript复制v3b.x = m3a[0].x * v3a.x m3a[1].x * v3a.y m3a[2].x * v3a.z;
v3b.y = m3a[0].y * v3a.x m3a[1].y * v3a.y m3a[2].y * v3a.z;
v3b.z = m3a[0].z * v3a.x m3a[1].z * v3a.y m3a[2].z * v3a.z;
矩阵左乘矢量
v3b = v3a * m3a;
矩阵也可以与矢量左乘,但与左乘不同,规则如下:
代码语言:javascript复制v3b.x = v3a.x * m3a[0].x v3a.y * m3a[0].y v3a.z * m3a[0].z;
v3b.y = v3a.x * m3a[1].x v3a.y * m3a[1].y v3a.z * m3a[1].z;
v3b.z = v3a.x * m3a[2].x v3a.y * m3a[2].y v3a.z * m3a[2].z;
矩阵与矩阵相乘
m3c = m3a * m3b;
矩阵相乘在变换和动画中会用到,看下面规则:
代码语言:javascript复制m3c[0].x = m3a[0].x * m3b[0].x m3a[1].x * m3b[0].y m3a[2].x * m3b[0].z
m3c[1].x = m3a[0].x * m3b[1].x m3a[1].x * m3b[1].y m3a[2].x * m3b[1].z
m3c[2].x = m3a[0].x * m3b[2].x m3a[1].x * m3b[2].y m3a[2].x * m3b[2].z
m3c[0].y = m3a[0].y * m3b[0].x m3a[1].y * m3b[0].y m3a[2].y * m3b[0].z
m3c[1].y = m3a[0].y * m3b[1].x m3a[1].y * m3b[1].y m3a[2].y * m3b[1].z
m3c[2].y = m3a[0].y * m3b[2].x m3a[1].y * m3b[2].y m3a[2].y * m3b[2].z
m3c[0].z = m3a[0].z * m3b[0].x m3a[1].z * m3b[0].y m3a[2].z * m3b[0].z
m3c[1].z = m3a[0].z * m3b[1].x m3a[1].z * m3b[1].y m3a[2].z * m3b[1].z
m3c[2].z = m3a[0].z * m3b[2].x m3a[1].z * m3b[2].y m3a[2].z * m3b[2].z