Bullet中的凹面碰撞检测

时间:2015-09-19 12:27:24

标签: c# collision-detection bulletphysics concave

我是一名子弹新秀,所以如果我的问题听起来微不足道,我会提前道歉。

我需要从.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; 

使用此辅助代码,根本找不到歧管。

1 个答案:

答案 0 :(得分:4)

正如您已经在手册中读到的那样,awk -i inplace '{ sub(/ID>NA/,"ID>NA"++n); print }' "$file" 只能用于静态对象。这意味着这种类型的两个对象没有碰撞算法(因为如果它们都是静态的,它们就不会发生碰撞)。正如您所尝试的那样,您可以测试它们的边界框的交集,但是不会创建任何碰撞流形。

如果你想知道btBvhTriangleMeshShape的用途是什么,它就是为了检测凸动态物体和静态凹面环境之间的精确碰撞。

Bullet建议的官方解决方案是对用于移动物体的每个凹模型执行凸分解。凸分解的首选方法是btBvhTriangleMeshShape。一个例子可以在子弹示例中找到。

另一个值得尝试的算法是HACD (Hierarchical Approximate Convex Decomposition),它产生的拓扑结构比前一个更好,但凸包的精度更低 - 结果碰撞形状比原始网格更大。错误率可以通过分辨率控制,但会减慢过程。