基于2D多边形的碰撞检测和响应(五)

五、处理旋转

在许多游戏中都可以发现一些旋转的物体。与它们的碰撞会有一点复杂。旋转精灵的标准做法是通过一个简单的角度,通常的区间是[0,2*PI]。可以使用矩阵来存贮三角操作,因此一个角度可以被转化为2*2的矩阵
一个简单的处理旋转物体碰撞的方法是保存一个原始多边形的副本,并将其转化到当前位置和角度。这是非常简单的,因此我决定详细描述并给出一个通用的碰撞检测系统,这个系统同样可以用于3D的情况
如果你对于矩阵数学,向量,线形代数和三角学不是很熟悉,你可以看看下边的文章。
为了简化,通常的做法是将一个物体转化到另一个物体的坐标系中,因此在碰撞检阶段仅仅需要一个转化过程。转化到模型空间非常容易使人混淆,但是如果你对于基础代数比较熟悉,它会变得非常简单。
进行坐标转化后还要计算一个物体相对于另一个物体的相对位置和速度,加入方向将使得事情变得稍微复杂一些。
考虑两个物体A和B,分别位于PA和PB,方向分别为OA和OB,并且位移为DA和DB。转化物体A到它自己的模型空间中,这里 PA=Origin,OA=IdentityMatix,VA=Vector(0,0),我们需要应用转化到物体A上,考虑如下的前向转化,并将其反向, 将一个点从局部坐标转化到世界坐标:

Pworld = Plocal * OA + PA
(Pworld – PA) = Plocal * OA
(Pworld – PA) * OAT = Plocal * OA * OAT

Plocal = (Pworld – PA) * OAT

同样使用,前向变换来转换方向向量

Dworld = Dlocal * OA
Dworld * OAT = Dlocal * OA * OAT

D local = D world * OA T
同样方向

Oworld = Olocal * OA
Oworld * OAT= Olocal * OA * OAT

O local = O world * OA T
现在我们将物体B的位置转化到A的局部坐标空间中

PB’ = (PB – PA) * OAT
DB’ = (DB – DA) * OAT
OB’ = (OB) * OAT

同样,当我们测试分离轴时,需要注意的是我们还在局部坐标中,并且需要将分离轴从B的局部坐标中转换到A的局部坐标空间中。并且为了计算物体B的局部间隔,使用转化到物体A的局部坐标空间的轴,我们需要将其反向转化到B的坐标空间中。
这些会使你觉得迷惑,另一个解决方案基本上不会被局部坐标所迷惑,即所有的操作都在全局坐标中完成。这个方法的确定就是你不得不保持一个多边形 的副本,因为每一个多边形需要分别在世界坐标中计算一次。好处是你不需要再每次处理碰撞的时候重新计算变换。这个对2D游戏来数是非常好的,但是在3D 中,你不会想在每一帧中变换一次物体仅仅为了碰撞检测的目的,尤其是当物体存储在树中并有一个非常复杂的形状的时候。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值