猿问

BulletPhysics - 门物体放置在地面上时会不受控制地旋转

我正在尝试使用 HingeConstraint 在 BulletPhysics 中模拟一扇门。下面的代码按预期工作,因为立方体围绕 Y 轴在它的拐角处旋转,有效地像门一样打开,但是一旦我将物体放在地面上,它就会开始不受控制地四处飞舞。


RigidBody body = physics.LocalCreateRigidBody(mass, Matrix4.CreateTranslation(new Vector3(0, 0.5f, 0)), new BoxShape(1, 1, 1));

body.UserObject = "Door";


Vector3 pivotInA = new Vector3(1, 1, 1);

Vector3 axisInA = new Vector3(0, 1, 0);

var hinge = new HingeConstraint(body, pivotInA, axisInA);


const float targetVelocity = 1.0f;

const float maxMotorImpulse = 1.0f;

hinge.EnableAngularMotor(true, targetVelocity, maxMotorImpulse);

physics.World.AddConstraint(hinge);

禁用门和地面之间的碰撞可以解决问题,但我也在努力实现这一目标。文档说您可以为身体设置碰撞类型和掩码,但只有World.AddRigidBody()构造函数似乎采用此类参数,据我所知,我的门作为铰链添加到世界中,并且在调用时会自动添加地面LocalCreateRigidBody(),如图所示以下。


CollisionShape groundShape = new BoxShape(10, 1, 10);

CollisionObject ground = LocalCreateRigidBody(0, Matrix4.CreateTranslation(0, -1, 0), groundShape);

ground.UserObject = "Ground";

当门位于地面上时,如何阻止门旋转?


小怪兽爱吃肉
浏览 310回答 1
1回答

MYYA

您可以编写自己的 LocalCreateRigidBody 版本来设置碰撞掩码。LocalCreateRigidBody 是 BulletSharp 演示中的辅助函数,而不是 Bullet 中的内置函数。这是设置碰撞过滤器的一种方法:const CollisionFilterGroups groundGroup = (CollisionFilterGroups)0x40000000;var groundMask = CollisionFilterGroups.AllFilter ^ CollisionFilterGroups.StaticFilter;World.AddRigidBody(ground, groundGroup, groundMask);var doorMask = CollisionFilterGroups.AllFilter ^ groundGroup;World.AddRigidBody(door, CollisionFilterGroups.DefaultFilter, doorMask);解决这个问题的另一种方法是使门更短,这样它就不会离地面足够近以产生碰撞。然后渲染一个较大的图形对象来代替较小的物理对象。如果您使用 BulletSharp 演示框架,则必须修改框架以支持这一点。
随时随地看视频慕课网APP
我要回答