您的位置:首页 > 其它

Bullet 引擎 详解 碰撞事件 回调函数

2010-03-28 22:44 483 查看
在bullet中一个非常普遍的应用是 针对两个物体发生碰撞时调用开发者自己提供的回调函数

比如球体碰撞到另一个球体 发出声音

下面是一个例子, 场景中有3种物体 球(动态),地板(静态),墙壁(静态)

球碰到墙和地板发出的声音不同。

所以需要设置这三种对象为不同类别,利用 collisionobj的userpointer来完成



int objclass[3] ={0,1,2};

boxBody->setUserPointer(&objclass[0]);

ground->setUserPointer(&objclass[1]);

wall->setUserPointer(&objclass[2]);



然后在update or render 中调用如下回调函数

主要的想法是从btPersistentManifold 中去获取当前narrowphase的碰撞对

但是要检查接触点,如果接触点大于0,则开始检查碰撞对象类别

根据类别再做不同的动作。



例子视频 http://www.youtube.com/watch?v=XXEClJjR05w
声音没录好, 等最近两天更新

-(void) Collide_callback{
	int type_obj1, type_obj2;
	int numManifolds = sDynamicsWorld->getDispatcher()->getNumManifolds();
	for(int i=0;i<numManifolds;i++)
	{
		btPersistentManifold * contactManifold = sDynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i);
	    int numContacts= contactManifold->getNumContacts();
		if(numContacts>0)
		{	
			btCollisionObject * obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
			btCollisionObject * obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
			type_obj1 = * (int *)obA->getUserPointer();
			type_obj2 = * (int *)obB->getUserPointer();
			if((type_obj1==0)&&(type_obj2==1))
			{
				[g_ResManager playSound:@"test.caf"];
			}
			if((type_obj1==0)&&(type_obj2==2))
			{
				[g_ResManager playSound:@"test2.caf"];
			}			
		}
	}
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: