void FractureBodyInfo::addBody( int shape_id, const btVector3& inertia, btScalar mass, btScalar elasticLimit, btScalar plasticLimit) { btCollisionShape* shape = m_shape->getChildShape(shape_id); btAssert(!shape->isCompound()); // compound children not suported setConId(*shape, m_connections.size()); btVector3 shape_inertia(inertia); if (inertia.isZero()) { shape->calculateLocalInertia(mass, shape_inertia); } btRigidBody::btRigidBodyConstructionInfo info(mass, 0, shape, shape_inertia); btRigidBody* body = new btRigidBody(info); FractureBody::Connection connection; connection.m_body = body; connection.m_elasticLimit = elasticLimit; connection.m_plasticLimit = plasticLimit; connection.m_accImpulse = 0; connection.m_shapeId = shape_id; m_connections.push_back(connection); }
// Movement for free moving cameras void _Camera::HandleMove(const btVector3 &Direction, float Speed) { switch(Type) { case FREEMOVE: { if(!Direction.isZero()) { btVector3 Move(Direction); Move.normalize(); Move *= Speed; btQuaternion Orientation(Game.Camera->getOrientation().x, Game.Camera->getOrientation().y, Game.Camera->getOrientation().z, Game.Camera->getOrientation().w); Velocity = quatRotate(Orientation, Move); } else Velocity.setZero(); } break; } }
void ComputeController(btVector3 ¤tSpeed, const btVector3 &delta, const btVector3 &maxSpeed, float scaleDelta, float damping) { // Timestep scale btVector3 acceleration = delta * scaleDelta; if (currentSpeed.fuzzyZero() && !currentSpeed.isZero()) { currentSpeed.setZero(); } acceleration += currentSpeed * -damping; // Clamp the acceleration to max speed for(int i = 2; i >= 0; i--) { if (fabs(acceleration[i]) < maxSpeed[i]) continue; acceleration[i] = (acceleration[i] < 0) ? -maxSpeed[i] : maxSpeed[i]; } currentSpeed += acceleration; }