子弹物理:身体在跌倒后移动(摇动并向侧面移动)

时间:2014-05-19 12:11:29

标签: c++ game-physics physics-engine bulletphysics

我有一个问题,我很难解决几天。

我正在尝试使用子弹物理进行保龄球比赛,但是在我放置它之后,针会摇晃,摇晃并向侧面移动并落到地板上。

以下是发生的事情的GIF: http://imgur.com/7Mg41sf

以下是我创建Pin的方法:

btCollisionShape* shape = createShape(pinVertices);
btScalar bodyMass = 1.6f;
btVector3 bodyInertia(0,0,0);
shape->calculateLocalInertia(bodyMass, bodyInertia);

btRigidBody::btRigidBodyConstructionInfo bodyCI = btRigidBody::btRigidBodyConstructionInfo(bodyMass, nullptr, shape, bodyInertia);
bodyCI.m_restitution = 0.7;
bodyCI.m_friction = 0.9f;

_physicsBody = std::unique_ptr<btRigidBody>(new btRigidBody(bodyCI));
_physicsBody->setUserPointer(this);

以下是我如何创建一个楼层:

btCollisionShape* shape = createShape(laneVertices);
btScalar bodyMass = 0.0f;
btVector3 bodyInertia(0,0,0);
shape->calculateLocalInertia(bodyMass, bodyInertia);

btRigidBody::btRigidBodyConstructionInfo bodyCI = btRigidBody::btRigidBodyConstructionInfo(bodyMass, nullptr, shape, bodyInertia);
bodyCI.m_restitution = 0.6;
bodyCI.m_friction = 0.5;

_physicsBody = std::unique_ptr<btRigidBody>(new btRigidBody(bodyCI));
_physicsBody->setUserPointer(this);

现在地板是btBoxShape,针脚是btConvexHullShape,但我尝试使用圆柱或圆锥体,它们也会滑动。

一直在努力争取几天,特别是考虑到Bullet Physics网站和论坛已经失败。

2 个答案:

答案 0 :(得分:2)

对我来说看起来完全合情合理。僵硬的身体不会完全反弹,也不会破碎。

你对现实的不完美近似还有其他问题。你的销钉的底部可能是平的,这意味着它理论上会在多个点上立即撞到地板上。此外,由于FP精度有限,引脚不会完全圆,但那部分是现实的。

所以水平运动可能是因为一小部分自由落体引起了与纯垂直坠落的微小偏差。当击中地面时,这个部件没有被取消,但是移动时的摩擦最终导致销停止。由于销的水平速度很小,因此摩擦力不足以推翻销钉。

答案 1 :(得分:1)

也许您应该将引脚和地板的恢复原状(反弹)设置为较低的值(首先尝试使用0.0)如果引脚弹跳,这应该可以解决。

您可以尝试的另一件事是在创建后停用它。我不知道在Bullet中,但在JBullet中,它是这样做的:

body.setActivationState( CollisionObject.WANTS_DEACTIVATION );

这将停止您的引脚,直到其他物体如球或其他针击中它。