C# 子弹凹面碰撞检测

C# 子弹凹面碰撞检测,c#,collision-detection,bulletphysics,concave,C#,Collision Detection,Bulletphysics,Concave,我是子弹新手,所以如果我的问题对你来说微不足道,我会提前道歉 我需要从.stl文件加载一组凹面三角形网格并执行碰撞检测。用户可以移动对象。从用户手册中,我读到: “凹面三角形网格: 对于静态世界环境,表示静态三角形网格的一种非常有效的方法是使用BTBVHTTriangleMeshShape。” 因此,我的问题是: -Bullet能否检测使用BvhTriangleMeshShape建模的凹面网格对象之间的碰撞? -contactTest和CollisionWorld::PerformDiscret

我是子弹新手,所以如果我的问题对你来说微不足道,我会提前道歉

我需要从.stl文件加载一组凹面三角形网格并执行碰撞检测。用户可以移动对象。从用户手册中,我读到: “凹面三角形网格: 对于静态世界环境,表示静态三角形网格的一种非常有效的方法是使用BTBVHTTriangleMeshShape。”

因此,我的问题是: -Bullet能否检测使用BvhTriangleMeshShape建模的凹面网格对象之间的碰撞? -contactTest和CollisionWorld::PerformDiscreteCollisionDetection()之间的真正区别是什么 -是否需要为凹面碰撞检测指定不同的碰撞算法

我正在使用一个维护好的子弹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]
并将我的碰撞对象加载为
BvhTriangleMeshShape

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

contactTest(object, callback)
此代码的结果是每次两个边界框截取时都会调用
ContactResultCallback::NeedsCollision
函数,但如果两个网格相交,则找不到流形

第二:

    bt_collision_world.PerformDiscreteCollisionDetection();
    int numManifolds = bt_collision_world.Dispatcher.NumManifolds; 

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

正如您在手册中已经阅读的那样,
btBvhTriangleMeshShape
只能用于静态对象。这意味着这种类型的两个对象没有碰撞算法(因为如果所有对象都是静态的,它们就不能碰撞)。尝试时,可以测试它们边界框的交点,但不会创建碰撞流形

如果您想知道
btbvhttrianglemeshshape
的用途,它是用来检测凸面动态对象和静态凹面环境之间的精确碰撞

Bullet建议的官方解决方案是对用于移动对象的每个凹模型执行凸分解。凸分解的首选方法是
HACD(分层近似凸分解)
。可以在项目符号示例中找到一个示例


另一个值得尝试的算法是
V-HACD(体积层次近似凸分解)
,该算法生成的形状具有比前一个更好的拓扑结构,但凸壳精度较低-结果碰撞形状比原始网格更大。错误率可以通过分辨率控制,但会减慢处理过程。

非常感谢@Estiny。我将使用凸分解。还有一个问题。您提到:“BTBVHTTriangelMeshShape用于检测凸面动态对象和静态凹面环境之间的精确碰撞。”为了清晰起见,假设ob1是凸面的,ob2是凹面的,我理解这将起作用:-将ob1和ob2导入碰撞世界-更改ob1转换-'contactTest(ob1,回调)'这不起作用:-将ob1和ob2导入碰撞世界-更改ob2转换-'contactTest(ob2,回调)'我弄错了吗?@Nic您理解正确。假设ob1是任何凸面形状,而ob2是
BTBVHTTriangleMeshShape
,第二种情况将无法正常工作,因为Bullet会认为ob2仍在同一位置,因此它将与其以前的位置而不是新位置碰撞。