如何防止刚体穿过墙壁?

3
我有一艘飞船,它是一个刚体 Rigidbody。 飞船上有一个MeshCollider。该碰撞器设置为凸形。
我有一块地面,它是通过编程创建的Mesh。该网格上有一个MeshCollider。该碰撞器未设置为凸形。
大多数情况下,这可以解决问题。我不会掉落到地面下。但有40%的时间我可以穿过墙壁。
为了解决这个问题,对于每个墙壁部分,我添加了一个标记为静态的子GameObject。该游戏对象具有BoxCollider。我调整了碰撞器的大小,使其比墙壁部分大0.1。这意味着碰撞器重叠,不应有缺口可供穿越。
如下图所示,我仍然能够有时穿过墙壁。
我应该做些什么才能避免穿过墙壁?

enter image description here

我已经尝试过以下方法:
  • Rigidbody添加到地面上,并标记为动力学。为此,我完全删除了MeshCollider并使用了所有的BoxCollider。由于可以拥有凸多边形刚体,因此必须使用所有的BoxCollider这并没有解决问题。

  • 从玩家中删除MeshCollider并使用单个BoxCollider。此时场景中不再有MeshCollider这并没有解决问题。

  • 两个Rigidbody都设置为连续碰撞检测。

我开始怀疑Unity3d物理系统是否起作用:/


你是如何移动飞船的?你是直接移动飞船的位置,还是使用Rigidbody方法,比如AddForce?顺便说一句,不用担心,Unity的3D物理引擎“Nvidia PhysX”实际上非常强大。不幸的是,由于用户错误,有很多事情可能会出错(这种情况发生在我们所有人身上)。 - AquaGeneral
@AquaGeneral - 我正在使用 Rigidbody.MovePositionRigidbody.MoveRotation 来控制飞船的移动。 - Justin808
2个回答

2

有太多的东西可能会出问题,一次尝试一个并查看哪个适合您。

  1. 如果要使用网格碰撞器(Mesh Colliders)与凸形(convex)一起使用,则必须将RigidBody附加到它上面。将RigidBody附加两个对象中

  2. 因为您正在使用代码生成墙壁,请确保您分配网格碰撞器的墙壁具有<= 255个三角形。凸形网格碰撞器(Convex Mesh Colliders)仅限于255个三角形。如果墙壁的三角形数量> 255,则凸形将失败

  3. 由于有时可用但有时失败,请将墙壁和飞船的RigidBody Collision Detection(碰撞检测)都更改为Continuous Dynamic(连续动态)

  4. 使用复合碰撞器(Compound Colliders)。删除飞船上的网格碰撞器,并使用多个框碰撞器(Box Colliders)来得到所需的感觉。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接