Bullet 中的凹面碰撞检测
Concave collision detection in 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;
使用这个二级代码,根本找不到流形。
正如您在手册中所读到的,btBvhTriangleMeshShape
只能用于静态对象。这意味着对于这种类型的两个对象没有碰撞算法(因为如果它们都是静态的,它们就不会发生碰撞)。正如您所尝试的,您可以测试它们的边界框的交集,但不会创建任何碰撞流形。
如果你想知道btBvhTriangleMeshShape
有什么用,它是用来检测凸动态物体和静态凹环境之间的精确碰撞。
Bullet官方给出的解决方案是对每一个用于移动物体的凹模型进行凸分解。凸分解的首选方法是HACD (Hierarchical Approximate Convex Decomposition)
。可以在项目符号示例中找到示例。
另一种值得尝试的算法是 V-HACD (Volumetric Hierarchical Approximate Convex Decomposition)
,它生成的形状具有比前一个更好的拓扑结构,但凸包不太精确 - 结果碰撞形状比原始网格大。错误率可以通过分辨率来控制,但它会减慢进程。
我是 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;
使用这个二级代码,根本找不到流形。
正如您在手册中所读到的,btBvhTriangleMeshShape
只能用于静态对象。这意味着对于这种类型的两个对象没有碰撞算法(因为如果它们都是静态的,它们就不会发生碰撞)。正如您所尝试的,您可以测试它们的边界框的交集,但不会创建任何碰撞流形。
如果你想知道btBvhTriangleMeshShape
有什么用,它是用来检测凸动态物体和静态凹环境之间的精确碰撞。
Bullet官方给出的解决方案是对每一个用于移动物体的凹模型进行凸分解。凸分解的首选方法是HACD (Hierarchical Approximate Convex Decomposition)
。可以在项目符号示例中找到示例。
另一种值得尝试的算法是 V-HACD (Volumetric Hierarchical Approximate Convex Decomposition)
,它生成的形状具有比前一个更好的拓扑结构,但凸包不太精确 - 结果碰撞形状比原始网格大。错误率可以通过分辨率来控制,但它会减慢进程。