我是Bullet的新手,所以如果我的问题对你来说听起来微不足道,我很抱歉。Bullet中的凹面碰撞检测
我需要从.stl文件加载一组凹三角形网格并执行碰撞检测。对象可以由用户移动。从用户手册中,我阅读: “凹面三角网格: 对于静态世界环境,表示静态三角网格的一种非常有效的方法是使用btBvhTriangleMeshShape。”
因此,我的问题是: - Bullet能检测使用BvhTriangleMeshShape建模的凹面网格物体之间的碰撞吗? - contactTest和CollisionWorld之间的真正区别是什么:: PerformDiscreteCollisionDetection() - 我需要指定一个不同的碰撞算法来进行凹面碰撞检测吗?
我正在与BulletSharp保持一个Bullet的C#包装。我做什么,成立我的子弹环境:
CollisionConfiguration bt_collision_configuration;
CollisionDispatcher bt_dispatcher;
BroadphaseInterface bt_broadphase;
CollisionWorld bt_collision_world;
double scene_size = 500;
uint max_objects = 16000;
bt_collision_configuration = new DefaultCollisionConfiguration();
bt_dispatcher = new CollisionDispatcher(bt_collision_configuration);
float sscene_size = (float)scene_size;
Vector3 worldAabbMin = new Vector3(-sscene_size, -sscene_size, -sscene_size);
Vector3 worldAabbMax = new Vector3(sscene_size, sscene_size, sscene_size);
bt_broadphase = new AxisSweep3_32Bit(worldAabbMin, worldAabbMax, max_objects);
bt_collision_world = new CollisionWorld(bt_dispatcher, bt_broadphase, bt_collision_configuration); [/code]
和负载我CollisionObjects为BvhTriangleMeshShape
。
检测碰撞,我使用:
contactTest(object, callback)
这段代码的结果是ContactResultCallback::NeedsCollision
函数被调用每次两个边框截距,但是如果2个网格相交没有歧管被发现。
其次:
bt_collision_world.PerformDiscreteCollisionDetection();
int numManifolds = bt_collision_world.Dispatcher.NumManifolds;
使用这种辅助码,无歧管在所有发现。
非常感谢@Estiny。然后我将使用凸分解。还有一个问题。你提到:“btBvhTriangleMeshShape是为了检测凸起动态物体和静态凹陷环境之间的精确碰撞。“为了清楚起见,说OB1凸,OB2是凹的,我明白这将工作: - 进口OB1和OB2碰撞世界 - 改变OB1转型 - ‘contactTest(OB1,回调)’ 而这是行不通的:? - 进口OB1和OB2碰撞世界 - 改变OB2转型 - “contactTest(OB2,回调)” 是我错了 – Nic
@Nic你理解正确的话假设OB1任何凸形和ob2是'btBvhTriangleMeshShape',第二种情况将无法正常工作,因为Bullet会认为ob2仍然在同一个位置,所以它会与之前的位置相冲突而不是新的。 – Estiny