当前位置: 首页 > 知识库问答 >
问题:

子弹中的凹面碰撞检测

申查猛
2023-03-14

我是Bullet新手,如果我的问题对你来说听起来微不足道,我提前道歉。

我需要从.stl文件加载一组凹三角形网格,并执行碰撞检测。用户可以移动对象。在用户手册中,我读到:“凹形三角形网格:对于静态世界环境,表示静态三角形网格的一种非常有效的方法是使用btBvhTriangleMeshShape。”

因此,我的问题是:Bullet可以检测使用BvhTriangleMeshShape建模的凹形网格对象之间的碰撞吗?contactTest和CollisionWorld的真正区别是什么::performdiscrecollisiondetection()-凹面碰撞检测需要指定不同的碰撞算法吗?

我正在与BulletSharp合作,这是一个维护的子弹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作为< code > BvhTriangleMeshShape 加载。

为了检测碰撞,我使用了:

contactTest(object, callback)

此代码的结果是,每次两个边界框相交时都会调用<code>ContactResultCallback::NeedsCollision

其次:

    bt_collision_world.PerformDiscreteCollisionDetection();
    int numManifolds = bt_collision_world.Dispatcher.NumManifolds; 

使用此辅助代码,根本找不到歧管。

共有1个答案

左丘宜年
2023-03-14

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

如果您想知道btBvhTriangleMeshShape有什么用,它旨在检测凸起动态物体与静态凹面环境之间的精确碰撞。

Bullet建议的官方解决方案是对用于移动对象的每个凹模型执行凸分解。凸分解的首选方法是HACD(分层近似凸分解)。在项目符号示例中可以找到一个示例。

另一种值得尝试的算法是V-HACD(体积分层近似凸分解),它生成的形状具有比前一种更好的拓扑结构,但凸壳精度较低-结果碰撞形状大于原始网格。错误率可以由分辨率控制,但会减慢过程。

 类似资料:
  • 问题内容: 我正在打乒乓球,发现很难编写一种算法来正确地使球从四壁弹回(我将在稍后处理得分,因为只有西+东双方会成为进球)。所以此刻,我希望球在盒子周围弹跳。 检测球是否撞到墙壁很容易,但是我在计算新角度时遇到了麻烦。 到目前为止,这是我想出的: 这仅适用于大约一半的碰撞,并且看起来非常难看。我确信这应该非常简单,并且之前已经做过很多次了。 在我的代码中,dstX / dstY是X / Y目标坐标

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得

  • 所以我用Box2D在游戏中进行冲突检测。我有一个包含地形信息的地图:现在它只是一个有道路或草地的字符[][]。现在,在每个关卡开始时,我想创建矩形来描述不同的地形,但是我希望这些矩形得到优化,显然这需要相当多的算法。 我的第一个方法是在关卡开始时为地图上的每一个区块创建一个单独的地形。FPS降低到了5。 我的第二个想法是当玩家沿着地图移动时,简单地为地形创建不同的矩形,删除看不见的矩形。虽然它仍然

  • 我的问题主要与它背后的理论有关。我为一个项目制作了一个2D游戏,通过使用Rectangle类中的.overlapps方法检测碰撞,碰撞处理得很好。首先,被认为是连续或离散碰撞技术。当我读到这个理论时,我说它是离散的,但我在网上的文章中读到离散的主要缺点是它在实际发生碰撞后检测到碰撞。所以,我的问题是:它实际上是离散的吗?如果是这样的话,我看不出它有什么缺点吗?谢谢