这里介绍一个在游戏开发的时候常用的一个旋转坐标变换的计算方法。
我们看下面这张图:
我们将游戏当中的物体抽象成图中的矩形区域,实线矩形为物体的初始位置(或者说是水平位置),虚线矩形为旋转后的位置,旋转角度大小为 a,绕原点(0,0)进行顺时针旋转(我们假定顺时针方向为正,逆时针方向为负,旋转角在正负180°之间)。
旋转前物体上的一点坐标为(x0,y0),也就是它到y轴的距离为|x0|,到x轴的距离为|y0|。旋转后该点的坐标为(x1,y1),我们看到可以将x1分为两部分计算,m1和m2,其中m1=|y0|×sin(a),m2=|x0|×cos(a),因此x1=|y0|×sin(a)+|x0|×cos(a)。
接着我们计算y1:
由图中可以看出,y1=m2-m1,其中m1=|x0|×sin(a),m2=|y0|×cos(a),因此y1=|y0|×cos(a)-|x0|×sin(a)。
由此我们得到,物体以其左下角为坐标原点和旋转轴做旋转(顺时针角度为正,逆时针为负),旋转角为a时,其上面一点(x0,y0)旋转后的坐标为(|y0|×sin(a)+|x0|×cos(a), |y0|×cos(a)-|x0|×sin(a))。
这一结论对于-180°到180°这个区间都有效。
我们接着做一下推广,如果物体的旋转轴不在坐标原点,并且其左下角也不与坐标原点重合,那结论有是什么样子呢?
我们来看下面的图:
其中(x3,y3)为旋转轴,点(x0,y0)旋转角度a后得到(x1,y1)。其实不用很复杂的计算,我们使用相对坐标来看,结果就非常简单了。
假设我们默认的参考系或者坐标系为D1,我们定义一个新的参考系D2,D2的坐标原点为(x3,y3),x轴和y轴分别与D1的两个轴同向。那么对于D2中的任何一个点(a,b),将其坐标转换到D1中的坐标为(a+x3,b+y3)。
接着我们在D2中分析问题,我们将(x0,y0)点叫做点M0,将(x1,y1)点叫做M1,那么M0在D2中的坐标为(x0-x3,y0-y3),M1在D2中的坐标为(x1-x3,y1-y3),从我们前面已经得到的结论我们可以知道:
x1-x3=|y0-y3|×sin(a)+|x0-x3|×cos(a)
y1-y3=|y0-y3|×cos(a)-|x0-x3|×sin(a)
由此,我们得到(x1,y1)的坐标为:
(|y0-y3|×sin(a)+|x0-x3|×cos(a) + x3, |y0-y3|×cos(a)-|x0-x3|×sin(a)+ y3)
旋转变换在很多游戏设计中非常有用,可以将上面的公式提炼成一个函数方便使用。