cocos2dx物理引擎和碰撞检测(五)框架Fixtures

来源:互联网 发布:网络大电影演员 编辑:程序博客网 时间:2024/05/22 06:53

框架Fixture是动态模块中的一个重要的概念,它和形状Shape将来都是要附加到物体Body上。在一开始介绍Box2D引擎时,就曾说过物理引擎可以被看作是两部分:碰撞检测和物理模拟。形状Shape是用来进行碰撞检测的,那么框架Fixture就是用来进行物理模拟的。在介绍框架之前,先来了解一下动态模块的组成部分。

动态模块(Dynamics Module)

动态模块是我们将要介绍的最后一个模块。它也是Box2D引擎张最为复杂的一个。在游戏制作中,开发者使用最多的也是这个模块之中的。动态模块建立在通用和碰撞模块的基础之上。它包含的内容有:框架(Fixtures)、物体(Bodies)、接触(Contacts)、关节(Joints)、世界(world)、监听器(Listener)。这些内容彼此相互依赖,很难再不提及其他类的情况下单独描述一个类,在明确了动态模块组成后,下面首先介绍第一个框架类。

框架(Fixtures)

在上节讲了形状Shape,那么大家想下,形状虽然明确了物体的外形,但是并不知道物体的存在,形状只是用来进行碰撞检测,物理模拟谁来负责呢以及如何让物体和形状联系在一起呢?Box2D引擎提供了类b2Fixture,这个类用来将形状附加到物体上进行物理模拟,同时具备了一些物理属性。下面列出框架Fixture的属性:密度(density)、摩擦(friction)、恢复(restitution)、碰撞筛选标记(collision filtering flags)、感应器标记(sensor flag)。

密度(density)

密度这个没什么好说的,只要学过物理知识的人,都应该知道雾都是用来计算物体的质量的。同样形状尺寸的物体,在其密度提升一倍的情况下,其质量也会提升一倍。

摩擦(Friction)

摩擦也是一个简单的物理学概念。它可以使对象逼真地沿对象滑动或者反向的摩擦力。Box2D引擎支持静态摩擦和动态摩擦,两者都使用相同的摩擦系数为参数。摩擦系数经常会设置在0-1之间。0意味着没有摩擦,1会产生强摩擦。读者也可以使用其他的非负数作为摩擦系数。当计算两个形状之间的摩擦时,引擎必须计算两个形状的摩擦系数,公式如下:

float32 firction;firction = sqrtf(shape1->firction * shape2->firction);


恢复(Restitution)

恢复可以理解为一个反弹,它可以使对象弹起,它的值设置在0-1之间。恢复就是一个物体碰撞后反弹大小的参数,值为0表示小球不会弹起,称为非弹性碰撞;为1表示小球的速度和原来的一样,只是方向相反,称为完全弹性碰撞。恢复通过下面的公式合成:

float32 restitution;restitution = b2MAX(shape1->restitution,shape2->restitution);

当一个形状多次碰撞时,恢复会近似的模拟,Box2Dy引擎使用了迭代求解器,逐步递归计算恢复的数值,另外一点,当碰撞的速度很小时,为了防止抖动,引擎也会使用非弹性碰撞。

筛选(Filtering)

碰撞筛选是一个防止某些形状发生碰撞的系统。框架Fixture会携带碰撞筛选信息,让开发者来设置某些游戏对象相互碰撞的关系。也就是设置哪些可以存在碰撞检测,哪些不存在碰撞检测。
在形状创建之后,开发者也可以去改变其碰撞筛选。此时可以使用函数b2Shape::GetFilterData以及b2Shape::SetFilterData来访问及设置已存在框架的b2FilterData结构。也就是说,无论在任何时候,开发者都可以修改碰撞筛选的设置。

注意:就算修改了筛选数据,到下一个时间步为止,现在的接触并不会增加或删除。

感应器:

感应器是用来检测两个框架是否相交的对象。游戏逻辑当中有的时候只需要判断两个框架是否相交,但却不应该有碰撞反应。最常见的情况,就是角色失去道具的时候,比如在魂斗罗中,玩家控制的角色可以拾取道具来更换武器,此时就会通过感应器来完成。

注意:感应器对象也是个框架,但只会侦测碰撞而不产生其他反应。

开发者可以将任何一个框架对象设置为感应器,感应器可以是静态的也可以是动态的。因为引擎当中允许在一个物体上附加多个框架对象,所以感应器和实体框架是可以混合存在的。从代码的角度来看,感应器在发生碰撞时,是不会生成接触点的,这里有两种函数来得到感应器的状态:

//是否接触b2Contact::IsTouching//开始接触点和结束接触点b2ContactListener::BeginContact和EndContact


 

 

0 0