36
36
ODEPhysicsEnvironment::ODEPhysicsEnvironment()
38
38
m_OdeWorld = dWorldCreate();
39
m_OdeSpace = dHashSpaceCreate();
39
m_OdeSpace = dHashSpaceCreate(0);
40
40
m_OdeContactGroup = dJointGroupCreate (0);
41
41
dWorldSetCFM (m_OdeWorld,1e-5f);
43
43
m_JointGroup = dJointGroupCreate(0);
45
setFixedTimeStep(true,1.f/60.f);
55
56
dWorldDestroy (m_OdeWorld);
58
void ODEPhysicsEnvironment::proceed(double timeStep)
60
// ode collision update
61
dSpaceCollide (m_OdeSpace,this,&ODEPhysicsEnvironment::OdeNearCallback);
63
int m_odeContacts = GetNumOdeContacts();
65
//physics integrator + resolver update
66
dWorldStep (m_OdeWorld,timeStep);
68
//clear collision points
69
this->ClearOdeContactGroup();
61
void ODEPhysicsEnvironment::setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep)
63
m_useFixedTimeStep = useFixedTimeStep;
67
m_fixedTimeStep = fixedTimeStep;
70
m_fixedTimeStep = 0.f;
74
//todo:implement fixed timestepping
77
float ODEPhysicsEnvironment::getFixedTimeStep()
79
return m_fixedTimeStep;
84
bool ODEPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep1)
87
float deltaTime = timeStep1;
90
if (m_useFixedTimeStep)
92
m_currentTime += timeStep1;
93
// equal to subSampling (might be a little smaller).
94
numSteps = (int)(m_currentTime / m_fixedTimeStep);
95
m_currentTime -= m_fixedTimeStep * (float)numSteps;
96
deltaTime = m_fixedTimeStep;
97
//todo: experiment by smoothing the remaining time over the substeps
100
for (int i=0;i<numSteps;i++)
102
// ode collision update
103
dSpaceCollide (m_OdeSpace,this,&ODEPhysicsEnvironment::OdeNearCallback);
105
int m_odeContacts = GetNumOdeContacts();
107
//physics integrator + resolver update
108
dWorldStep (m_OdeWorld,deltaTime);
110
//clear collision points
111
this->ClearOdeContactGroup();
72
116
void ODEPhysicsEnvironment::setGravity(float x,float y,float z)
169
PHY_IPhysicsController* ODEPhysicsEnvironment::rayTest(void* ignoreClient,float fromX,float fromY,float fromZ, float toX,float toY,float toZ,
213
PHY_IPhysicsController* ODEPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient,float fromX,float fromY,float fromZ, float toX,float toY,float toZ,
170
214
float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ)
172
218
//collision detection / raytesting