Reputation: 2685
I have got some problem implementing bullet physics into my opengl game. The thing is that it doesn't want to update my translatef value continously but only at the end. The code for bullet looks like this:
void CGL::initPhysics( void ) {
broadphase = new btDbvtBroadphase();
collisionConfiguration = new btDefaultCollisionConfiguration();
dispatcher = new btCollisionDispatcher(collisionConfiguration);
solver = new btSequentialImpulseConstraintSolver;
dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
dynamicsWorld->setGravity(btVector3(0,-10,0));
ballShape = new btSphereShape(1);
pinShape = new btCylinderShape(btVector3(1,1,1));
pinShape->setMargin(0.04);
fallMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,10,0)));
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
ballShape->calculateLocalInertia(mass,fallInertia);
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
dynamicsWorld->addRigidBody(groundRigidBody);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,ballShape,fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
dynamicsWorld->addRigidBody(fallRigidBody);
for (int i=0 ; i<300 ; i++) {
dynamicsWorld->stepSimulation(1/60.f,10);
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
fallY = trans.getOrigin().getY();
}
state_list.remove( STATE_FALL_BALL );
printf("stoped\n");
}
And the drawing function which is called at the beginning looks like this:
void CGL::fallingBall( void ) {
glPushMatrix();
float colBall2[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
glMaterialfv( GL_FRONT, GL_AMBIENT, colBall2);
glTranslatef(0.0f,fallY,0.0f);
printf("fallY: %f\n",fallY);
glutSolidSphere(1.0f,20,20);
glPopMatrix();
}
The thing is that it shows correct value in this function's printf but translation is called only at the beginning I mean I can only see the last state.
EDIT
This is changed function and loop. Gathering all the info I supose it should now work but it doesn't. It doesn't draw anything.
initPhysics(){
for (int i=0 ; i<500 ; i++)
{
draw();
}
state_list.remove( STATE_FALL_BALL );
printf("stoped\n");
}
void CGL::draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
current_time = getTime();
since_update = current_time - last_update;
printf("time: %f\n",since_update);
if(since_update>timestep)
{
dynamicsWorld->stepSimulation(timestep,10);
last_update = current_time;
}
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
fallY = trans.getOrigin().getY();
fallingBall();
printf("fallY: %f\n",fallY);
glFlush();
}
And beginning variable declaratins look like that:
last_update = 0;
timestep = 100;
current_time = 0;
since_update = 0;
Upvotes: 0
Views: 4970
Reputation: 8284
That looks a little disorganized. I guess the basic mistake to remedy the immediate problem without delving into multithreading would be to do something like this:
//pseudo-code to get the idea
void draw(){
// clear Buffers and setup matricies
....
//calculate the time that has pased since the last time that the physics have been calculated
time_t current_time = getCurrentTime();
time_t since_update = current_time - last_update;
//if enough time has passed since the last redraw calculate physics
if(since_update>timestep)
{
dynamicsWorld->stepSimulation(timestep,10);
last_update = current_time;
}
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
fallY = trans.getOrigin().getY();
//draw various object
....
fallingBall();
//swap buffers or flush()
glSwapBuffers();
}
Unless there is a distinct reason for using OpenGL directly I'd suggest that you use a higher level toolkit. Also the usual disclaimer that you are currently using an old version of OpenGL.
Upvotes: 1