setting mass on the body after loading all components;
translating mass so the center of mass is at the origin for ODE; when modeling make sure models have their COM at the origin or they may behave strangely! git-svn-id: svn://anubis/misc/OdeWorld@169 bd8a9e45-a331-0410-811e-c64571078777
This commit is contained in:
parent
2828194715
commit
8f95a9fed4
16
OdeWorld.cc
16
OdeWorld.cc
@ -116,6 +116,7 @@ OdeWorld::Object::Object(bool is_static, dWorldID world, dSpaceID space)
|
|||||||
m_world = world;
|
m_world = world;
|
||||||
m_space = space;
|
m_space = space;
|
||||||
m_body = 0;
|
m_body = 0;
|
||||||
|
dMassSetZero(&m_mass);
|
||||||
}
|
}
|
||||||
|
|
||||||
OdeWorld::Object::Object(const OdeWorld::Object & orig)
|
OdeWorld::Object::Object(const OdeWorld::Object & orig)
|
||||||
@ -127,9 +128,8 @@ OdeWorld::Object::Object(const OdeWorld::Object & orig)
|
|||||||
if (orig.m_body != 0)
|
if (orig.m_body != 0)
|
||||||
{
|
{
|
||||||
m_body = dBodyCreate(m_world);
|
m_body = dBodyCreate(m_world);
|
||||||
dMass mass;
|
m_mass = orig.m_mass;
|
||||||
dBodyGetMass(orig.m_body, &mass);
|
dBodySetMass(m_body, &m_mass);
|
||||||
dBodySetMass(m_body, &mass);
|
|
||||||
const dReal * pos = dBodyGetPosition(orig.m_body);
|
const dReal * pos = dBodyGetPosition(orig.m_body);
|
||||||
dBodySetPosition(m_body, pos[0], pos[1], pos[2]);
|
dBodySetPosition(m_body, pos[0], pos[1], pos[2]);
|
||||||
const dReal * rot = dBodyGetRotation(orig.m_body);
|
const dReal * rot = dBodyGetRotation(orig.m_body);
|
||||||
@ -340,6 +340,11 @@ void OdeWorld::Object::loadPhy(const std::string & path)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (m_body != 0)
|
||||||
|
{
|
||||||
|
dMassTranslate(&m_mass, -m_mass.c[0], -m_mass.c[1], -m_mass.c[2]);
|
||||||
|
dBodySetMass(m_body, &m_mass);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OdeWorld::Object::addCube(const vector<float> args)
|
void OdeWorld::Object::addCube(const vector<float> args)
|
||||||
@ -436,10 +441,7 @@ void OdeWorld::Object::setupGeom(dGeomID geom, dMass * mass,
|
|||||||
|
|
||||||
dMassRotate(mass, rot);
|
dMassRotate(mass, rot);
|
||||||
dMassTranslate(mass, locx, locy, locz);
|
dMassTranslate(mass, locx, locy, locz);
|
||||||
dMass origmass;
|
dMassAdd(&m_mass, mass);
|
||||||
dBodyGetMass(m_body, &origmass);
|
|
||||||
dMassAdd(&origmass, mass);
|
|
||||||
dBodySetMass(m_body, &origmass);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ class OdeWorld
|
|||||||
protected:
|
protected:
|
||||||
bool m_is_static;
|
bool m_is_static;
|
||||||
dBodyID m_body;
|
dBodyID m_body;
|
||||||
|
dMass m_mass;
|
||||||
dWorldID m_world;
|
dWorldID m_world;
|
||||||
dSpaceID m_space;
|
dSpaceID m_space;
|
||||||
std::vector<dGeomID> m_geoms;
|
std::vector<dGeomID> m_geoms;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user