详解游戏中的旋转坐标变换

这里介绍一个在游戏开发的时候常用的一个旋转坐标变换的计算方法。

我们看下面这张图:

【原创】详解游戏中的旋转坐标变换 - 远行的风 - 风的驿站

我们将游戏当中的物体抽象成图中的矩形区域,实线矩形为物体的初始位置(或者说是水平位置),虚线矩形为旋转后的位置,旋转角度大小为 a,绕原点(0,0)进行顺时针旋转(我们假定顺时针方向为正,逆时针方向为负,旋转角在正负180°之间)。

旋转前物体上的一点坐标为(x0,y0),也就是它到y轴的距离为|x0|,到x轴的距离为|y0|。旋转后该点的坐标为(x1,y1),我们看到可以将x1分为两部分计算,m1m2,其中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,我们定义一个新的参考系D2D2的坐标原点为(x3,y3)x轴和y轴分别与D1的两个轴同向。那么对于D2中的任何一个点(a,b),将其坐标转换到D1中的坐标为(a+x3,b+y3)

接着我们在D2中分析问题,我们将(x0,y0)点叫做点M0,将(x1,y1)点叫做M1,那么M0D2中的坐标为(x0-x3,y0-y3)M1D2中的坐标为(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)

旋转变换在很多游戏设计中非常有用,可以将上面的公式提炼成一个函数方便使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值