是否有办法返回在Bullet中发生碰撞的碰撞对?

问题描述 投票:0回答:1

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

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

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

c++ simulation game-physics mesh bulletphysics
1个回答
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;

        // ...
    }

    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.