00001
00002 #ifndef _VRSODE_PHYSICS_BODY_H_
00003 #define _VRSODE_PHYSICS_BODY_H_
00004
00005 #include <ode/ode.h>
00006 #include <vrs/sharedobj.h>
00007
00008 #include "CollisionBody.h"
00009
00010 namespace vrsode
00011 {
00012
00016 class PhysicsBody : public CollisionBody
00017 {
00018 dBodyID m_bodyId;
00019
00020 bool m_highSpeedRotationMode;
00021 VRS::Vector m_highSpeedRotationAxis;
00022
00023 bool m_forceSync;
00024
00025 public:
00029 PhysicsBody(VRS::SO<VRS::SceneThing>, CollisionShape,
00030 bool forceSync = false);
00031
00035 PhysicsBody(VRS::SO<VRS::SceneThing>, VRS::SO<Shape>,
00036 bool forceSync = false);
00037
00041 ~PhysicsBody();
00042
00047 dBodyID bodyId();
00048
00054 double mass();
00055
00060 void setMass(double, VRS::Vector = VRS::Vector(0,0,0));
00061
00066 bool isEnabled() const;
00067
00072 void setEnabled(bool);
00073
00078 void setAutoDisableMode(bool);
00079
00085 void setAutoDisableLinearThreshold(double);
00086
00092 void setAutoDisableAngularThreshold(double);
00093
00098 void setAutoDisableTime(double);
00099
00104 void setAutoDisableSteps(unsigned int);
00105
00112 void setHighSpeedRotationMode(bool = true);
00113
00120 void setHighSpeedRotationAxis(VRS::Vector);
00121
00127 void setHighSpeedRotationAxis(double, double, double);
00128
00134 void setIgnoreGravity(bool = true);
00135
00141 void syncTransformationsToODE();
00142
00148 void syncTransformationsToVRS();
00149
00154 void update();
00155
00161 void setAngularVelocity(VRS::Vector);
00162
00168 void setLinearVelocity(VRS::Vector);
00169
00174 VRS::Vector angularVelocity();
00175
00180 VRS::Vector linearVelocity();
00181
00186 void addForce(VRS::Vector);
00187
00192 void addTorque(VRS::Vector);
00193
00198 void addRelativeForce(VRS::Vector);
00199
00204 void addRelativeTorque(VRS::Vector);
00205
00210 void addForceAtPosition(VRS::Vector, VRS::Vector);
00211
00216 void addRelativeForceAtPosition(VRS::Vector, VRS::Vector);
00217
00222 void addForceAtRelativePosition(VRS::Vector, VRS::Vector);
00223
00229 void addRelativeForceAtRelativePosition(VRS::Vector, VRS::Vector);
00230
00231 virtual void destroy();
00232 };
00233
00234 }
00235
00236 #endif