有什么方法可以返回子弹中发生碰撞的碰撞对吗?

时间:2019-07-16 03:56:12

标签: c++ simulation game-physics mesh bulletphysics

我目前正在构建用于机器人技术的仿真软件。我正在使用子弹物理学来执行碰撞检测和机器人刚体动力学。

我能够成功检测到两个三角形碰撞网格何时发生碰撞。现在,我想通过在发生碰撞时将网格的颜色更改为红色来突出显示碰撞对。为此,我需要知道哪些两个网格正在碰撞。有没有办法返回子弹中发生碰撞的碰撞对?

我浏览了Bullet Physics文档,找不到有用的东西。

1 个答案:

答案 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;

        // ...
    }

    // ...
}