代码之家  ›  专栏  ›  技术社区  ›  livin_amuk

子弹物理-门的物体放在地上时无法控制地旋转

  •  0
  • livin_amuk  · 技术社区  · 8 年前

    我试着用铰链约束来模拟子弹物理中的一扇门。下面的代码如预期的那样工作,因为立方体在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";
    

    我怎么能阻止门在地上旋转呢?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Andres Traks    8 年前

    您可以编写自己版本的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演示框架,则必须修改该框架以支持此功能。

    推荐文章