Пример #1
0
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);
}
Пример #2
0
// 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 &currentSpeed, 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;
}