注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风的驿站

一徐清风,半指烛光,觥筹已净,只余茶香。残卷一章,妙趣非常,忽闻帘响,愿闻其详?

 
 
 

日志

 
 
关于我

喜欢写生 编程 音乐 设计 喜欢把自己的想法变成实实在在的东西 喜欢安静的做一些事情 CSDN博客:http://blog.csdn.net/qwertyupoiuytr

网易考拉推荐

【原创】详解游戏中的旋转坐标变换  

2014-06-11 13:51:22|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

我们看下面这张图:

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

我们将游戏当中的物体抽象成图中的矩形区域,实线矩形为物体的初始位置(或者说是水平位置),虚线矩形为旋转后的位置,旋转角度大小为 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)

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

  评论这张
 
阅读(305)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017