8.5.5 旋转
围绕任意一个轴进行旋转的数学算法比前面介绍的要复杂得多。知道旋转的具体工作原理并不重要,重要的是知道旋转的结果。旋转矩阵由一个轴u和一个标量值(θ)构成,其中u被定义为一个归一化向量,而θ用弧度作为单位描述了旋转量。如果想要旋转的模型是一个瓶塞,那么归一化向量u可以用一个穿过瓶塞的针表示。角度(θ)代表针的旋转量,针的旋转会带动瓶塞的旋转。
public void SetRotate(Vector axis, double angle)
{
double angleSin = Math.Sin(angle);
double angleCos = Math.Cos(angle);
double a = 1.0 - angleCos;
double ax = a * axis.X;
double ay = a * axis.Y;
double az = a * axis.Z;
_m11 = ax * axis.X + angleCos;
_m12 = ax * axis.Y + axis.Z * angleSin;
_m13 = ax * axis.Z - axis.Y * angleSin;
_m21 = ay * axis.X - axis.Z * angleSin;
_m22 = ay * axis.Y + angleCos;
_m23 = ay * axis.Z + axis.X * angleSin;
_m31 = az * axis.X + axis.Y * angleSin;
_m32 = az * axis.Y - axis.X * angleSin;
_m33 = az * axis.Z + angleCos;
}
如果在一帧中多次使用正弦和余弦函数,开销是很大的,因此,代码中将它们的使用降到了最低。轴向量应该被归一化,但是SetRotate中没有对此进行检查。