Dirso
06-06-2007 23:30:01
Hi,
I'm using most of the StuntPlayground code for my vehicle class, since it's amazingly complete but I had a problem.
If I don't use m_chassis->setMassMatrix(800, Ogre::Vector3(352.494, 1776.1, 1570.06)) the car floats, but if I use it, it follows to the ground as it's suppose to, but the wheels are not displayed. Do you know what could I be doing wrong?
Here it's part of the code
Thanks you very much,
Dirso.
I'm using most of the StuntPlayground code for my vehicle class, since it's amazingly complete but I had a problem.
If I don't use m_chassis->setMassMatrix(800, Ogre::Vector3(352.494, 1776.1, 1570.06)) the car floats, but if I use it, it follows to the ground as it's suppose to, but the wheels are not displayed. Do you know what could I be doing wrong?
Here it's part of the code
void CarUSC::_init( OgreNewt::World* world, Ogre::SceneNode* parentnode, Ogre::SceneManager* mgr,
Ogre::String filename, Ogre::Vector3 pos )
{
mTakeOffPos = Ogre::Vector3::ZERO;
Ogre::Vector3 comOffset = Ogre::Vector3::ZERO;
mNumFlips = 0;
mLastY = Ogre::Vector3::ZERO;
mCollisions = 0;
mTireState = TS_ONROAD;
// temp stuff
mFilename = eCGFW::HelperClass::getInstance()->getFileFromResource(filename);
TiXmlDocument doc;
doc.LoadFile( mFilename.c_str() );
// find the vehicle in the file!!
TiXmlElement* vehicle = doc.FirstChildElement( "vehicle" );
// vehicle name...
mName = (Ogre::String)vehicle->Attribute( "name" );
TiXmlElement* elem = vehicle->FirstChildElement( "chassis" );
Ogre::String rigidfile = (Ogre::String)elem->Attribute( "filename" );
// possible offset for center of mass.
elem = elem->FirstChildElement("CenterOfMass");
if (elem)
{
comOffset = Ogre::StringConverter::parseVector3( elem->Attribute( "offset" ) );
}
// make the rigid body!
m_chassis = eCGFW::RBD::getInstance()->createBody(world, mSceneMgr, rigidfile, mName + "Ent");
//m_chassis->setMassMatrix(800, Ogre::Vector3(352.494, 1776.1, 1570.06));
_carNode = (Ogre::SceneNode*)m_chassis->getOgreNode();
// now initialize the vehicle.
init( m_chassis, Ogre::Vector3(0,1,0) );
if (comOffset != Ogre::Vector3::ZERO)
m_chassis->setCenterOfMass( comOffset );
mLookNode = ((Ogre::SceneNode*)m_chassis->getOgreNode())->createChildSceneNode();
// okay, load the torque curve.
elem = vehicle->FirstChildElement( "torque_curve" );
// loop through the points on the curve.
mMinRPM = 15000.0;
mMaxRPM = 0.0;
TiXmlElement* point = elem->FirstChildElement( "point" );
while (point)
{
TorquePoint temp;
temp.rpm = Ogre::StringConverter::parseReal( (Ogre::String)point->Attribute("rpm") );
temp.torque = Ogre::StringConverter::parseReal( (Ogre::String)point->Attribute("torque") );
if (temp.rpm < mMinRPM) { mMinRPM = temp.rpm; }
if (temp.rpm > mMaxRPM) { mMaxRPM = temp.rpm; }
mTorqueCurve.push_back( temp );
// get the next point.
point = point->NextSiblingElement( "point" );
}
mRPMRange = mMaxRPM - mMinRPM;
// time to get the gears.
elem = vehicle->FirstChildElement( "gearbox" );
// loop through the gears
TiXmlElement* gear = elem->FirstChildElement( "gear" );
while (gear)
{
Ogre::Real ratio = Ogre::StringConverter::parseReal( (Ogre::String)gear->Attribute("ratio") );
mGears.push_back( ratio );
//get the next gear.
gear = gear->NextSiblingElement( "gear" );
}
// engine settings
mEngineMass = 100.0;
elem = vehicle->FirstChildElement( "engine" );
mEngineMass = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("rotating_mass") );
mEngineBaseRPM = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("base_rpm") );
mEngineScale = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("scale_factor") );
// shift delay
elem = vehicle->FirstChildElement( "shift" );
mShiftDelay = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "delay" ) );
mShiftTime = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "time" ) );
// differential ratio.
elem = vehicle->FirstChildElement( "differential" );
mDifferentialRatio = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "ratio" ) );
// transmission efficiency
elem = vehicle->FirstChildElement( "transmission" );
mDifferentialRatio = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "efficiency" ) );
// drag coefficient
elem = vehicle->FirstChildElement( "drag" );
mDragCoefficient = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "coefficient" ) );
// brake strength
elem = vehicle->FirstChildElement( "brake" );
mBrakeStrength = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "strength" ) );
// steering settings.
mSteerMaxAngle = Ogre::Radian(0.0);
mSteerSpeed = Ogre::Radian(0.0);
mSteerLossPercent = 0.0;
mSteerFromSpeed = 0.0;
mSteerToSpeed = 0.0;
elem = vehicle->FirstChildElement( "steering" );
mSteerMaxAngle = Ogre::Radian(Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("angle") ) );
mSteerSpeed = Ogre::Radian(Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("speed") ) );
mSteerLossPercent = (Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("percent_drop") ) / 100.0);
mSteerFromSpeed = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("from_speed") );
mSteerToSpeed = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute("to_speed") );
mSteerSpeedRange = mSteerToSpeed - mSteerFromSpeed;
// finally, go through the tires.
TiXmlElement* tire_elem = vehicle->FirstChildElement( "tire" );
int tirecount = 0;
// loop through the tires
while (tire_elem)
{
Ogre::Quaternion orient;
Ogre::Vector3 rot, pos, pin;
Ogre::Real rad, height, mass;
Ogre::Real damp, spring, length;
Ogre::Real grip;
int steer, drive;
// get visual mesh.
elem = tire_elem->FirstChildElement( "visual" );
CarUSC::MyTire* tire;
// setup the mesh...
Ogre::String meshfile = (Ogre::String)elem->Attribute( "mesh" );
Ogre::Entity* ent = mSceneMgr->createEntity( mName+"_Tire"+Ogre::StringConverter::toString(tirecount++), meshfile );
ent->setNormaliseNormals( true );
// set defaults in case data is missing
orient = Ogre::Quaternion::IDENTITY;
rot = pos = pin = Ogre::Vector3::ZERO;
rad = height = mass = 1.0;
damp = spring = length = 1.0;
grip = 1.0;
steer = drive = 0;
// position, rotation, pin
elem = tire_elem->FirstChildElement( "location" );
rot = Ogre::StringConverter::parseVector3( (Ogre::String)elem->Attribute( "orient" ) );
Ogre::Matrix3 mat;
mat.FromEulerAnglesXYZ( Ogre::Degree(rot.x), Ogre::Degree(rot.y), Ogre::Degree(rot.z) );
orient.FromRotationMatrix( mat );
pos = Ogre::StringConverter::parseVector3( (Ogre::String)elem->Attribute( "pos" ) );
pin = Ogre::StringConverter::parseVector3( (Ogre::String)elem->Attribute( "pin" ) );
// size
elem = tire_elem->FirstChildElement( "size" );
rad = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "radius" ) );
height = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "height" ) );
mass = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "mass" ) );
// suspension
elem = tire_elem->FirstChildElement( "suspension" );
damp = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "damp" ) );
spring = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "spring" ) );
length = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "length" ) );
// settings
elem = tire_elem->FirstChildElement( "settings" );
grip = Ogre::StringConverter::parseReal( (Ogre::String)elem->Attribute( "grip" ) );
steer = Ogre::StringConverter::parseInt( (Ogre::String)elem->Attribute( "steer" ) );
drive = Ogre::StringConverter::parseInt( (Ogre::String)elem->Attribute( "drive" ) );
// make the tire!
//tire = new CarUSC::MyTire( mSceneMgr, node, this, orient, pos, pin, mass, height, rad, damp, spring, length, eCGFW::CT_TIRE );
tire = new CarUSC::MyTire( mSceneMgr, _carNode, this, orient, pos, pin, mass, height, rad, damp, spring, length, eCGFW::CT_TIRE );
tire->setDrive( drive );
tire->setSteer( steer );
tire->setGrip( grip );
tire->getOgreNode()->attachObject( ent );
// get the next tire.
tire_elem = tire_elem->NextSiblingElement( "tire" );
}
mLastOmega = 0.0;
mBrakesOn = false;
mSteering = mThrottle = 0.0f;
mCurrentGear = 1;
m_chassis->setPositionOrientation(pos, Ogre::Quaternion::IDENTITY);
}
void CarUSC::setup()
{
// setup the chassis a bit.
m_chassis->setUserData( this );
m_chassis->setType( eCGFW::BT_CAR );
m_chassis->setStandardForceCallback();
m_chassis->setCustomTransformCallback( CarUSC::Transform );
m_chassis->setAutoFreeze( 0 );
m_chassis->setLinearDamping( 0.001f );
}
OgreNewt::Body* RBD::createBody(OgreNewt::World *world, Ogre::SceneManager *mgr, Ogre::String mesh,
Ogre::String entName, Ogre::Real mass, Ogre::SceneNode *parent,
Ogre::Vector3 pos, Ogre::Quaternion or)
{
Ogre::Entity *ent = mgr->createEntity(entName, mesh);
Ogre::SceneNode *node;
if(parent)
node = parent->createChildSceneNode(pos, or);
else
node = mgr->getRootSceneNode()->createChildSceneNode(pos, or);
node->attachObject(ent);
OgreNewt::CollisionPrimitives::Box *box;
box = new OgreNewt::CollisionPrimitives::Box(world, ent->getBoundingBox().getSize());
OgreNewt::Body* res = new OgreNewt::Body(world, box);
res->attachToNode(node);
if(mass > 0.0f)
{
Ogre::Vector3 inertia = OgreNewt::MomentOfInertia::CalcBoxSolid(mass, ent->getBoundingBox().getSize());
res->setMassMatrix(mass, inertia);
}
res->setPositionOrientation(pos, or);
delete box;
return res;
}
Thanks you very much,
Dirso.