| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- #include "StdAfx.h"
- #include <ode/ode.h>
- #include "Body.h"
- namespace ODEManaged
- {
- //Constructors
- Body::Body(void)
- {
- _id = 0;
- }
- Body::Body(World &world)
- {
- _id = dBodyCreate(world.Id());
- }
- //Destructor
- Body::~Body(void)
- {
- dBodyDestroy(this->_id);
- }
- //Methods
- //Id
- dBodyID Body::Id()
- {
- return _id;
- }
- //SetData
- void Body::SetData(void *data)
- {
- dBodySetData(this->_id, data);
- }
- //GetData
- void *Body::GetData(void)
- {
- return dBodyGetData(this->_id);
- }
- //SetPosition
- void Body::SetPosition (double x, double y, double z)
- {
- dBodySetPosition(this->_id, x, y, z);
- }
- //Overloaded GetPosition
- Vector3 Body::GetPosition(void)
- {
- Vector3 retVal;
- const dReal *temp;
- temp = dBodyGetPosition(this->_id);
- retVal.x = temp[0];
- retVal.y = temp[1];
- retVal.z = temp[2];
- return retVal;
- };
- void Body::GetPosition(double position __gc[])
- {
- const dReal *temp;
- temp = dBodyGetPosition(this->_id);
- position[0] = temp[0];
- position[1] = temp[1];
- position[2] = temp[2];
- }
- //SetRotationIdentity
- void Body::SetRotationIdentity(void)
- {
- dMatrix3 temp;
- dRSetIdentity(temp);
- dBodySetRotation(this->_id, temp);
- }
-
- //SetRotation (left handed system=>transpose)
- void Body::SetRotation(Matrix3 rotation)
- {
- dMatrix3 temp;
- temp[0] = rotation.m11;
- temp[4] = rotation.m12;
- temp[8] = rotation.m13;
- temp[1] = rotation.m21;
- temp[5] = rotation.m22;
- temp[9] = rotation.m23;
- temp[2] = rotation.m31;
- temp[6] = rotation.m32;
- temp[10] = rotation.m33;
- dBodySetRotation(this->_id, temp);
- }
- //GetRotation (left handed system=>transpose)
- Matrix3 Body::GetRotation(void)
- {
- Matrix3 retVal;
- //const dMatrix3 *m;
- const dReal *temp;
- temp = dBodyGetRotation(this->_id);
- retVal.m11 = temp[0];
- retVal.m12 = temp[4];
- retVal.m13 = temp[8];
- retVal.m21 = temp[1];
- retVal.m22 = temp[5];
- retVal.m23 = temp[9];
- retVal.m31 = temp[2];
- retVal.m32 = temp[6];
- retVal.m33 = temp[10];
- return retVal;
- }
- //Overloaded SetMass
- void Body::SetMass(double mass, Vector3 centerOfGravity, Matrix3 inertia)
- {
- dMass *temp = new dMass();
- dMassSetParameters(temp, mass,
- centerOfGravity.x,
- centerOfGravity.y,
- centerOfGravity.z,
- inertia.m11, inertia.m22,
- inertia.m33, inertia.m12,
- inertia.m13, inertia.m23);
- dBodySetMass(this->_id, temp);
- }
- //SetMassSphere
- void Body::SetMassSphere(double density, double radius)
- {
- dMass *temp = new dMass();
- dMassSetSphere(temp, density, radius);
- dBodySetMass(this->_id, temp);
- }
- //SetMassBox
- void Body::SetMassBox(double density, double sideX, double sideY, double sideZ)
- {
- dMass *temp = new dMass();
- dMassSetBox(temp, density, sideX, sideY, sideZ);
- dBodySetMass(this->_id, temp);
- }
- //SetMassCappedCylinder
- void Body::SetMassCappedCylinder(double density, int axis, double cylinderRadius, double cylinderLength)
- {
- dMass *temp = new dMass();
- dMassSetCappedCylinder(temp, density, axis,
- cylinderRadius,
- cylinderLength);
- dBodySetMass(this->_id, temp);
- }
- //AddForce
- void Body::AddForce(double fX, double fY, double fZ)
- {
- dBodyAddForce(this->_id, fX, fY, fZ);
- }
- //AddRelForce
- void Body::AddRelForce(double fX, double fY, double fZ)
- {
- dBodyAddRelForce(this->_id, fX,fY,fZ);
- }
- //AddForceAtPos
- void Body::AddForceAtPos(double fX, double fY, double fZ, double pX, double pY, double pZ)
- {
- dBodyAddForceAtPos(this->_id, fX, fY, fZ, pX, pY, pZ);
- }
- //AddRelForceAtPos
- void Body::AddRelForceAtPos(double fX, double fY, double fZ, double pX, double pY, double pZ)
- {
- dBodyAddRelForceAtPos(this->_id, fX, fY, fZ, pX, pY, pZ);
- }
- //AddRelForceAtRelPos
- void Body::AddRelForceAtRelPos(double fX, double fY, double fZ, double pX, double pY, double pZ)
- {
- dBodyAddRelForceAtRelPos(this->_id, fX, fY, fZ, pX, pY, pZ);
- }
- //ApplyLinearVelocityDrag
- void Body::ApplyLinearVelocityDrag(double dragCoef)
- {
- const dReal *temp;
- double fX;
- double fY;
- double fZ;
- temp = dBodyGetLinearVel(this->_id);
- fX = temp[0]*dragCoef*-1;
- fY = temp[1]*dragCoef*-1;
- fZ = temp[2]*dragCoef*-1;
- dBodyAddForce(this->_id, fX, fY, fZ);
- }
- //ApplyAngularVelocityDrag
- void Body::ApplyAngularVelocityDrag(double dragCoef)
- {
- const dReal *temp;
- double fX;
- double fY;
- double fZ;
- temp = dBodyGetAngularVel(this->_id);
- fX = temp[0]*dragCoef*-1;
- fY = temp[1]*dragCoef*-1;
- fZ = temp[2]*dragCoef*-1;
- dBodyAddTorque(this->_id, fX, fY, fZ);
- }
- //AddTorque
- void Body::AddTorque(double fX, double fY, double fZ)
- {
- dBodyAddTorque(this->_id, fX, fY, fZ);
- }
- //AddRelTorque
- void Body::AddRelTorque(double fX, double fY, double fZ)
- {
- dBodyAddRelTorque(this->_id, fX,fY,fZ);
- }
- //SetLinearVelocity
- void Body::SetLinearVelocity(double x, double y, double z)
- {
- dBodySetLinearVel(this->_id, x, y, z);
- }
- //GetLinearVelocity
- Vector3 Body::GetLinearVelocity(void)
- {
- Vector3 retVal;
- const dReal *temp;
- temp = dBodyGetLinearVel(this->_id);
- retVal.x = temp[0];
- retVal.y = temp[1];
- retVal.z = temp[2];
- return retVal;
- }
- //SetAngularVelocity
- void Body::SetAngularVelocity(double x, double y, double z)
- {
- dBodySetAngularVel(this->_id, x, y, z);
- }
- //GetAngularVelocity
- Vector3 Body::GetAngularVelocity(void)
- {
- Vector3 retVal;
- const dReal *temp;
- temp = dBodyGetAngularVel(this->_id);
- retVal.x = temp[0];
- retVal.y = temp[1];
- retVal.z = temp[2];
- return retVal;
- }
-
- //GetRelPointPos
- Vector3 Body::GetRelPointPos(double pX, double pY, double pZ)
- {
- Vector3 retVal;
- dVector3 temp;
- dBodyGetRelPointPos(this->_id, pX, pY, pZ, temp);
- retVal.x = temp[0];
- retVal.y = temp[1];
- retVal.z = temp[2];
- return retVal;
- }
- //GetRelPointVel
- Vector3 Body::GetRelPointVel(double pX, double pY, double pZ)
- {
- Vector3 retVal;
- dVector3 temp;
- dBodyGetRelPointVel(this->_id, pX, pY, pZ, temp);
- retVal.x = temp[0];
- retVal.y = temp[1];
- retVal.z = temp[2];
- return retVal;
- }
- //ConnectedTo
- int Body::ConnectedTo(const Body &b)
- {
- return dAreConnected(this->_id, b._id);
- }
- }
|