写在前面
keikainEngine是在开发中的一款3D游戏引擎,基本上是照着鬼火引擎(Irrlicht)抄的。这么做的目的很简单,就是对一款游戏引擎有一个全面的,深刻的理解。当然这里边会加入一些我自己的内容,如脚本系统,更丰富的动作系统,更好的3D显示效果(这块儿我现在还没有太多头绪)。开发(抄)期间我会详细的记录下所遇到的问题,涉及到的数学知识。尤其会将所用到的数学知识结合代码逐一列举出来。
开发一款3D引擎是一个长期的工作,Irrlicht从2003年发布第一个版本以来到写这篇博文时已有12个年头了。当然,我是站在Irrlicht的肩膀上的,希望我会尽快做出一个能够基本运行的系统来。
二维空间中的旋转推导
如下图所示,在平面直角坐标系中,线段OA逆时针旋转ɛ度后转到OB位置。其中点A坐标是(x,y),点B坐标是(p,q)。
以下是推导过程(公式编辑器太麻烦了,就直接在word里边写了公式然后转图片了):
CODE
1 //! rotates the point anticlockwise around a center by an amount of degrees. 2 /** \param degrees Amount of degrees to rotate by, anticlockwise. 3 \param center Rotation center. 4 \return This vector after transformation. */ 5 // 本函数为二维空间顶点类vector2d的成员函数。 6 // 传入参数degrees为角度,center为旋转的中心点,在求旋转后的坐标时,要转到局部坐标系,即以center为原点。 7 vector2d<T>& rotateBy(f64 degrees, const vector2d<T>& center=vector2d<T>()) 8 { 9 degrees *= DEGTORAD64; // DEGTORAD = PI / 180.0 将角度转成弧度 10 const f64 cs = cos(degrees); 11 const f64 sn = sin(degrees); 12 // 从全局坐标系转变到局部坐标系 13 X -= center.X; 14 Y -= center.Y; 15 16 set((T)(X*cs - Y*sn), (T)(X*sn + Y*cs)); // set函数用来设置坐标x,y的值 17 // 从局部坐标系转到全局坐标系 18 X += center.X; 19 Y += center.Y; 20 return *this; 21 }