2012-01-06 2 views
0

У меня есть проблема с реализацией физики пули в моей игре opengl. Дело в том, что он не хочет постоянно обновлять значение translatef, но только в конце. Код пули выглядит следующим образом:Физика пули с OpenGL

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"); 

}

И функция рисования, которая вызывается в начале выглядит следующим образом:

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(); 

}

Дело в том, что он показывает правильное значение в printf этой функции, но перевод называется только в начале, я имею в виду, что я могу видеть только последнее состояние.

РЕДАКТИРОВАТЬ

Это изменяется функция и цикл. Собирая всю информацию, которую я полагаю, она должна работать, но это не так. Он ничего не рисует.

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(); 
    } 

И начиная переменная declaratins выглядеть:

last_update = 0; 
timestep = 100; 
current_time = 0; 
since_update = 0; 
+1

Это не связано с opengl, это связано с циклами. Вы запускаете свой цикл 300 раз, но вы никогда не говорите ему, чтобы перерисовать пулю? – deanWombourne

+0

@deanWombourne функция fallBall() работает все время, поэтому она должна хотя бы нарисовать 300 шариков рядом друг с другом. Но это не так. – sebap123

+0

Действительно ли он «работает все время» в той же теме? Если вы не выполняете вычисления в фоновом потоке, он будет ждать завершения цикла, прежде чем ему будет предоставлена ​​возможность запуска. – deanWombourne

ответ

1

Это выглядит немного дезорганизованы. Я предполагаю, что основную ошибку устранить непосредственную проблему, не вникая в многопоточный бы сделать что-то вроде этого:

//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(); 
} 

Если не является отчетливой причиной для использования OpenGL непосредственно я хотел бы предложить вам использовать более высокий уровень инструментарий , Также обычный отказ от ответственности, что в настоящее время вы используете старую версию OpenGL.

+0

Проект разработан в OpenGL, поэтому я должен его использовать. Это выглядит хорошо, но у меня есть один вопрос - эта функция drwa используется или внедряется внутри цикла for или где? – sebap123

+0

Да, если вы не используете отдельный поток для вычисления физики, вы должны проверить каждый кадр (внутри цикла рисования), если вы должны продвигать физику и продвигать их, если прошло достаточно времени. – PeterT

+0

@ sebap123 Я думаю, что у вас есть какое-то фундаментальное непонимание того, что такое рисование-петли и как их использовать? Где вы используете 'glClear (...)' и 'glFlush()' или 'glSwapBuffers()' и вы их называли, прежде чем пытались интегрировать физику? – PeterT

Смежные вопросы