Visual C++ .NET - Integrar OpenGL con Bullet Physics

 
Vista:
sin imagen de perfil

Integrar OpenGL con Bullet Physics

Publicado por Juan (3 intervenciones) el 03/11/2013 22:04:39
Estoy intentando que el ejemplo de Hello World de Bullet Physics sea grafico por medio de OpenGL.
El Hola Mundo lo que hace es dejar caer una esfera hasta que colisiona con un plano, pero a la hora de capturar ese dato de la altura no puedo debido a que hace todo el calculo en el main del programa, y para hacerlo con openGL lo necesito afuera, ¿Alguno sabe como puedo hacer que la esfera se visualice por medio de OpenGL en el ejemplo de Bullet Physics?

#include <iostream>

#include <btBulletDynamicsCommon.h>

int main (void)
{

btBroadphaseInterface* broadphase = new btDbvtBroadphase();

btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);

btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;

btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);

dynamicsWorld->setGravity(btVector3(0,-10,0));


btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);

btCollisionShape* fallShape = new btSphereShape(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);


btDefaultMotionState* fallMotionState =
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,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);

std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}

dynamicsWorld->removeRigidBody(fallRigidBody);
delete fallRigidBody->getMotionState();
delete fallRigidBody;

dynamicsWorld->removeRigidBody(groundRigidBody);
delete groundRigidBody->getMotionState();
delete groundRigidBody;


delete fallShape;

delete groundShape;


delete dynamicsWorld;
delete solver;
delete collisionConfiguration;
delete dispatcher;
delete broadphase;

return 0;
}

En esta linea:
std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;

es donde se captura el dato de la altura de la esfera, pero está dentro del main, como hago para asignar ese dato para poder dibujar con OpenGL?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Integración de Bullet Physics y OpenGL para visualización de simulación con captura de datos

Publicado por Alejandro (265 intervenciones) el 13/02/2024 19:09:45
Juan, para lograr que la esfera se visualice por medio de OpenGL y al mismo tiempo capture los datos de altura, puedes seguir estos pasos:

1. Separar la lógica de Bullet Physics de la lógica de OpenGL:
- Crea una clase o una función que se encargue de la simulación de física con Bullet Physics. Esta clase o función debería proporcionar métodos para obtener la información necesaria, como la altura de la esfera.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class BulletSimulator {
public:
    BulletSimulator();
    ~BulletSimulator();
 
    void initialize();
    void stepSimulation();
    float getSphereHeight() const;
 
private:
    // Incluye las variables y métodos de Bullet Physics necesarios
    btDiscreteDynamicsWorld* dynamicsWorld;
    btRigidBody* fallRigidBody;
    // ...
 
    // Puedes tener variables privadas para almacenar información necesaria, como la altura
    float sphereHeight;
};

2. Actualizar la altura y dibujar con OpenGL:
- Después de cada paso de simulación en Bullet Physics, actualiza la altura de la esfera y utiliza OpenGL para visualizarla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <GL/glut.h>  // Asegúrate de tener las bibliotecas necesarias para OpenGL
 
BulletSimulator bulletSimulator;
 
void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    // Aquí puedes agregar el código para visualizar la esfera utilizando OpenGL
    // Utiliza la información de altura de bulletSimulator.getSphereHeight()
 
    glutSwapBuffers();
}
 
void update(int value) {
    bulletSimulator.stepSimulation();
    glutPostRedisplay();
    glutTimerFunc(16, update, 0);  // 60 FPS
}
 
int main(int argc, char** argv) {
    // Configuración de OpenGL y ventana
    glutInit(&argc, argv);
    // ...
 
    // Inicializa el simulador de Bullet Physics
    bulletSimulator.initialize();
 
    // Configura las funciones de visualización y actualización
    glutDisplayFunc(display);
    glutTimerFunc(25, update, 0);  // Inicia la simulación con 40 FPS
 
    // ...
 
    glutMainLoop();
 
    return 0;
}

3. Actualizar la altura en la clase BulletSimulator:
- Dentro de tu bucle de simulación de Bullet Physics, actualiza la altura y cualquier otra información necesaria.

1
2
3
4
5
6
7
8
9
void BulletSimulator::stepSimulation() {
    dynamicsWorld->stepSimulation(1/60.f, 10);
 
    btTransform trans;
    fallRigidBody->getMotionState()->getWorldTransform(trans);
 
    // Actualiza la altura de la esfera en la clase BulletSimulator
    sphereHeight = trans.getOrigin().getY();
}

Con esta estructura, puedes mantener separada la lógica de Bullet Physics de la lógica de OpenGL. La función `display` se encarga de la visualización en OpenGL, y la función `update` se encarga de avanzar la simulación y actualizar la información necesaria. La clase `BulletSimulator` encapsula la lógica de Bullet Physics y proporciona métodos para obtener la información relevante.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar