8.5.5 旋轉
圍繞任意一個軸進行旋轉的數(shù)學算法比前面介紹的要復雜得多。知道旋轉的具體工作原理并不重要,重要的是知道旋轉的結果。旋轉矩陣由一個軸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;
}
如果在一幀中多次使用正弦和余弦函數(shù),開銷是很大的,因此,代碼中將它們的使用降到了最低。軸向量應該被歸一化,但是SetRotate中沒有對此進行檢查。