2015-09-19 196 views
3

我是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; 

使用这种辅助码,无歧管在所有发现。

回答

3

正如您已阅读手册,btBvhTriangleMeshShape只能用于静态对象。这意味着这种类型的两个对象没有碰撞算法(因为如果它们都是静态的,它们不会相互碰撞)。正如你试过的,你可以测试它们的边界框的交集,但是不会创建碰撞流形。

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

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

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

+0

非常感谢@Estiny。然后我将使用凸分解。还有一个问题。你提到:“btBvhTriangleMeshShape是为了检测凸起动态物体和静态凹陷环境之间的精确碰撞。“为了清楚起见,说OB1凸,OB2是凹的,我明白这将工作: - 进口OB1和OB2碰撞世界 - 改变OB1转型 - ‘contactTest(OB1,回调)’ 而这是行不通的:? - 进口OB1和OB2碰撞世界 - 改变OB2转型 - “contactTest(OB2,回调)” 是我错了 – Nic

+1

@Nic你理解正确的话假设OB1任何凸形和ob2是'btBvhTriangleMeshShape',第二种情况将无法正常工作,因为Bullet会认为ob2仍然在同一个位置,所以它会与之前的位置相冲突而不是新的。 – Estiny