首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法把发生碰撞的碰撞对退回到子弹头?

有没有办法把发生碰撞的碰撞对退回到子弹头?
EN

Stack Overflow用户
提问于 2019-07-16 11:56:12
回答 1查看 207关注 0票数 0

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

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

我已经浏览了Bullet物理文档,但找不到任何有用的东西。

EN

回答 1

Stack Overflow用户

发布于 2019-11-08 22:02:00

在创建碰撞对象时,您可以将CollisionObject.UserObject设置为id、名称、...或者网格本身。

如果您使用的是自定义ContactResultCallback,您将获得碰撞对象和碰撞点作为AddSingleResult()方法的参数。现在,先前设置的用户对象可以帮助您识别碰撞的网格:

代码语言:javascript
复制
/// <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)进行“实时”碰撞检测,您还将获得用户对象:

代码语言:javascript
复制
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;

        // ...
    }

    // ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57049797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档