Bullet 中的凹面碰撞检测

Nic*_*Nic 6 c# concave collision-detection bulletphysics

我是 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]
Run Code Online (Sandbox Code Playgroud)

并将我的 CollisionObjects 加载为BvhTriangleMeshShape.

为了检测碰撞,我使用了:

contactTest(object, callback)
Run Code Online (Sandbox Code Playgroud)

这段代码的结果ContactResultCallback::NeedsCollision是每次两个边界框截取时都会调用该函数,但如果两个网格相交,则找不到流形。

其次:

    bt_collision_world.PerformDiscreteCollisionDetection();
    int numManifolds = bt_collision_world.Dispatcher.NumManifolds; 
Run Code Online (Sandbox Code Playgroud)

使用此二级代码,根本找不到流形。

Est*_*iny 6

As you've already read in manual, btBvhTriangleMeshShape can be used for static objects only. This means that there is no collision algorithm for two objects of this type (because if all of them are static, they cannot collide). As you tried, you can test the intersection of their bounding boxes, but no collision manifold will be ever created.

If you wonder what is the use of btBvhTriangleMeshShape, it is meant for detecting precise collision between convex dynamic objects and static concave environment.

Bullet 建议的官方解决方案是对用于移动物体的每个凹模型进行凸分解。凸分解的首选方法是HACD (Hierarchical Approximate Convex Decomposition)。可以在 Bullet 示例中找到一个示例。

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