我目前正在构建用于机器人技术的仿真软件。我正在使用子弹物理学来执行碰撞检测和机器人刚体动力学。
我能够成功检测到两个三角形碰撞网格何时发生碰撞。现在,我想通过在发生碰撞时将网格的颜色更改为红色来突出显示碰撞对。为此,我需要知道哪些两个网格正在碰撞。有没有办法返回子弹中发生碰撞的碰撞对?
我浏览了Bullet Physics文档,找不到有用的东西。
答案 0 :(得分:0)
在创建碰撞对象时,您可以使用ID,名称,...或网格物体本身来设置CollisionObject.UserObject
。
如果您使用的是自定义ContactResultCallback
,您将获得碰撞的对象和碰撞点作为AddSingleResult()
方法的参数。先前设置的用户对象现在可以帮助您识别碰撞的网格:
/// <inheritdoc cref="ContactResultCallback"/>
public override double AddSingleResult(ManifoldPoint manifoldPoint,
CollisionObjectWrapper collisionObjectWrapper1,
int partId1,
int index1,
CollisionObjectWrapper collisionObjectWrapper2,
int partId2,
int index2)
{
var mesh1 = collisionObjectWrapper1.CollisionObject.UserObject as Mesh;
var mesh2 = collisionObjectWrapper2.CollisionObject.UserObject as Mesh;
// ...
return 0;
}
如果您正在使用CollisionWorld.StepSimulate(...)
和CollisionWorld.SetInternalTickCallback(OnSimualtionTick)
进行“实时”碰撞检测,则还将获得用户对象:
private void OnSimualtionTick(DynamicsWorld world, float timeStep)
{
for (int i = 0; i < world.Dispatcher.NumManifolds; i++)
{
PersistentManifold contactManifold = world.Dispatcher.GetManifoldByIndexInternal(i);
var mesh1 = contactManifold.Body0.UserObject as Mesh;
var mesh2 = contactManifold.Body1.UserObject as Mesh;
// ...
}
// ...
}