[1.9] Problem with the Ogre and (Ogre)Bullet

Problems building or running the engine, queries about how to use features etc.
Post Reply
Initerworker
Gnoblar
Posts: 1
Joined: Sun Jun 18, 2017 9:36 am

[1.9] Problem with the Ogre and (Ogre)Bullet

Post by Initerworker »

Hello,

I need help on a problem in Ogre implementation of bullet Physics.

I want to create a Racing Game with OgreBullet and Ogre3d. But, when I use bullet to my vehicle, I do not understand why my car has 140 km / hour and move slowly in the Ogre3d World.

My Circuit implementation with StaticShape :

Code: Select all

...
BaseCircuit::BaseCircuit(Ogre::SceneManager*                    sceneManager,
                         OgreBulletDynamics::DynamicsWorld*     world,
                         const std::string&                     name,
                         const std::string&                     file,
                         const std::vector<Ogre::Vector3>&      startEmplacements,
                         const std::array<Ogre::Vector3, 2>&    startLine,
                         const std::vector<Ogre::Vector3>&      points,
                         size_t                                 nbLaps):
  BaseObject(sceneManager, world, "circuit_" + name, MAP),
  _startEmplacements(startEmplacements),
  _startLine(startLine),
  _points(points),
  _nbLaps(nbLaps)
{
  // Entity
  _map = sceneManager->createEntity(file);
  _mainNode->attachObject(_map);

  // Collision
  OgreBulletCollisions::StaticMeshToShapeConverter *floorShape =
          new OgreBulletCollisions::StaticMeshToShapeConverter(_map, Ogre::Matrix4::IDENTITY);

  _shape = (OgreBulletCollisions::CollisionShape *) floorShape->createTrimesh();
  delete floorShape;

  // Physic Body
  _body = new OgreBulletDynamics::RigidBody(_name + "_body", _world);
  _body->setStaticShape(_mainNode,
                        _shape,
                        Ogre::Real(1.0f), // restitution
                        Ogre::Real(0.0f), // friction
                        Ogre::Vector3(14500, -1220, 4000), // pos
                        Ogre::Quaternion(Ogre::Degree(-270), // rotation
                                         Ogre::Vector3::UNIT_X));
  _body->setActivationState(true);
}

BaseCircuit::~BaseCircuit() {
    delete _body;
}

...

My car implementation:

Code: Select all

OgreKart::OgreKart(Ogre::SceneManager *sceneManager, OgreBulletDynamics::DynamicsWorld *world, const std::string &name)
        : BaseKart(sceneManager, world, "kart_" + name),
          _chassisShift(0, 1.0, 0),
          _steeringIncrement(0.05f),
          _steeringClamp(0.4f),
          _maxEngineForce(3000),
          _maxBreakingForce(100),
          _wheelFriction(1000.0f),
          _suspensionStiffness(40.0f),
          _suspensionDamping(2.30f),
          _suspensionCompression(2.40f),
          _rollInfluence(0.2f),
          _suspensionRestLength(0.100f),
          _maxSuspensionTravelCm(20.0f),
          _frictionSlip(10.5f),
          _vehicleSteering(0),
          _breakingForce(0),
          _engineForce(0),
          _mass(800.0f),
          _wheelRadius(35.0f),
          _wheelWidth(20.0f) {

    // Entity
    _chassis = _sceneManager->createEntity(_name + "_chassis", "chassis.mesh");

    _chassis->setCastShadows(true);
    _cameraNode->translate(Ogre::Vector3(10, 0, (const Ogre::Real) -12.0));
    Ogre::Matrix3 mat;
    mat.FromEulerAnglesXYZ(Ogre::Degree(-21), Ogre::Degree(0), Ogre::Degree(0));
    const Ogre::Vector3 vector = _cameraNode->getPosition() * mat;
    _cameraNode->setPosition(vector);

    _mainNode->attachObject(_chassis);
    _mainNode->setPosition(_chassisShift);
    _mainNode->setScale(50, 50, 50);
    _chassis->setQueryFlags(1 << 2);

    // Collision
    Ogre::Vector3 position = _mainNode->_getDerivedPosition();
    Ogre::Vector3 size = Ogre::Vector3::ZERO;

    Ogre::AxisAlignedBox boundingB = _chassis->getBoundingBox();
    size = boundingB.getSize() * Ogre::Vector3(50, 50, 50);
    size /= 2.0f;   // only the half needed
    size *= 0.80f;  // Bullet margin is a bit bigger so we need a smaller size

    _shape = new OgreBulletCollisions::BoxCollisionShape(size); // and the Bullet rigid body

    _wheelBody = new OgreBulletDynamics::WheeledRigidBody(_name + "_wheeledBoyd", _world);
    _wheelBody->setShape(_mainNode,
                         _shape,
                         0.3f,            // dynamic body restitution
                         0.1f,            // dynamic body friction
                         _mass,           // dynamic bodymass
                         position,        // starting position of the box
                         Ogre::Quaternion::IDENTITY);// orientation of the box
    _wheelBody->setDamping(0.1, 0.1);

    _wheelBody->disableDeactivation();
    _wheelBody->getBulletRigidBody()->setCenterOfMassTransform(btTransform(btQuaternion(0, 0, 0), btVector3(0, -9.f, 0.f)));


    _vt = new OgreBulletDynamics::VehicleTuning(_suspensionStiffness,
                                                _suspensionCompression,
                                                _suspensionDamping,
                                                _maxSuspensionTravelCm,
                                                6000.f,
                                                _frictionSlip);

    _rvehicle = new OgreBulletDynamics::RaycastVehicle(_wheelBody, _vt);


    const Ogre::Vector3 wheelDirectionCS0(0, -1, 0);
    const Ogre::Vector3 wheelAxleCS(-1, 0, 0);
    const float connectionHeight = -35.0f;

    int rightIndex = 0;
    int upIndex = 1;
    int forwardIndex = 2;

    _rvehicle->setCoordinateSystem(rightIndex, upIndex, forwardIndex);
    _wheelNode[0] = 0;
    _wheelNode[1] = 0;
    _wheelNode[2] = 0;
    _wheelNode[3] = 0;

    size_t i = 0;
    for (i = 0; i < 4; i++) {
        _wheelEntity[i] = _sceneManager->createEntity(_name + "wheel" + Ogre::StringConverter::toString(i),
                                                      "wheel.mesh");

        _wheelEntity[i]->setQueryFlags(1 << 2);
        _wheelEntity[i]->setCastShadows(true);

        _wheelNode[i] = _sceneManager->getRootSceneNode()->createChildSceneNode();
        _wheelNode[i]->attachObject(_wheelEntity[i]);
        _wheelNode[i]->setScale(50, 50, 50);
    }


    bool isFrontWheel = true;
#define CUBE_HALF_EXTENTS 50

    Ogre::Vector3 connectionPointCS0(
            (const Ogre::Real) (CUBE_HALF_EXTENTS - (0.3 * _wheelWidth)),
            connectionHeight,
            2 * CUBE_HALF_EXTENTS - _wheelRadius);


    _rvehicle->addWheel(
            _wheelNode[0],
            connectionPointCS0,
            wheelDirectionCS0,
            wheelAxleCS,
            _suspensionRestLength,
            _wheelRadius,
            isFrontWheel, _wheelFriction, _rollInfluence);

    connectionPointCS0 = Ogre::Vector3(
            (const Ogre::Real) (-CUBE_HALF_EXTENTS + (0.3 * _wheelWidth)),
            connectionHeight,
            2 * CUBE_HALF_EXTENTS - _wheelRadius);


    _rvehicle->addWheel(
            _wheelNode[1],
            connectionPointCS0,
            wheelDirectionCS0,
            wheelAxleCS,
            _suspensionRestLength,
            _wheelRadius,
            isFrontWheel, _wheelFriction, _rollInfluence);


    connectionPointCS0 = Ogre::Vector3(
            (const Ogre::Real) (-CUBE_HALF_EXTENTS + (0.3 * _wheelWidth)),
            connectionHeight,
            -2 * CUBE_HALF_EXTENTS + _wheelRadius);

    isFrontWheel = false;
    _rvehicle->addWheel(
            _wheelNode[2],
            connectionPointCS0,
            wheelDirectionCS0,
            wheelAxleCS,
            _suspensionRestLength,
            _wheelRadius,
            isFrontWheel, _wheelFriction, _rollInfluence);

    connectionPointCS0 = Ogre::Vector3(
            (const Ogre::Real) (CUBE_HALF_EXTENTS - (0.3 * _wheelWidth)),
            connectionHeight,
            -2 * CUBE_HALF_EXTENTS + _wheelRadius);

    _rvehicle->addWheel(_wheelNode[3], connectionPointCS0, wheelDirectionCS0, wheelAxleCS,
                        _suspensionRestLength, _wheelRadius, isFrontWheel, _wheelFriction, _rollInfluence);

    _rvehicle->setWheelsAttached();

    turnAngle = 0;
}

OgreKart::~OgreKart() {
    delete _chassis;
}

void OgreKart::update(Ogre::Real elapsedTime, OIS::Keyboard *input) {
    _exCamera->update(elapsedTime, _cameraNode->_getDerivedPosition(), _mainNode->_getDerivedPosition());

    _rvehicle->applyEngineForce(0, 2);
    _rvehicle->applyEngineForce(0, 3);

    if (input->isKeyDown(OIS::KC_Q)) {
        _vehicleSteering += _steeringIncrement;
        if (_vehicleSteering > _steeringClamp)
            _vehicleSteering = _steeringClamp;
    } else if (input->isKeyDown(OIS::KC_D)) {
        _vehicleSteering -= _steeringIncrement;
        if (_vehicleSteering < -_steeringClamp)
            _vehicleSteering = -_steeringClamp;
    }

    if (input->isKeyDown(OIS::KC_Z)) {
        _engineForce = _maxEngineForce;
        _breakingForce = 0;
    } else if (input->isKeyDown(OIS::KC_S)) {
        _breakingForce += _maxBreakingForce;
        _engineForce = 0;
    }

    _rvehicle->applyEngineForce(_engineForce, 0);
    _rvehicle->getBulletVehicle()->setBrake(_breakingForce, 2);
    _rvehicle->applyEngineForce(_engineForce, 1);
    _rvehicle->getBulletVehicle()->setBrake(_breakingForce, 3);
    _rvehicle->setSteeringValue(_vehicleSteering, 0);
    _rvehicle->setSteeringValue(_vehicleSteering, 1);
}
...
Peraphs an person with another perspective can be help me to undestand the problem with the OgreBullet.

Many thanks in advance for your assistance.
Post Reply