正文

游戏数学(38)

精通C#游戏编程 作者:(英)斯库勒


 

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中没有对此进行检查。


上一章目录下一章

Copyright © 读书网 www.dushu.com 2005-2020, All Rights Reserved.
鄂ICP备15019699号 鄂公网安备 42010302001612号