2012-10-17 10 views
5

Próbuję nauczyć się, jak używać jBullet w projekcie, nad którym pracuję, a także przejrzałem wersję demo dostarczoną przez źródło, ale nie mogę pojąć, w jaki sposób wyświetlają się te demo. Czy ktoś ma dobry zasób, na który mógłby mnie wskazać, lub podać podstawowy przykład wyświetlający jeden lub dwa obiekty na ekranie?jBullet example

Z góry dziękuję, przykro mi, nie mam żadnego kodu do pokazania Mogę szybko napisać kilka, jeśli to konieczne, ale tak naprawdę szukam kierunku.

Dziękuję

kod na Cube, że używam, więc staram się dodać kolizji z nim, ale jestem pewien, w jaki sposób za pomocą jbullet:

public void Draw() { 
    // center point posX, posY, posZ 
    float radius = size/2; 

    //top 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
     { 
      glColor3f(1.0f,0.0f,0.0f); // red 
      glVertex3f(posX + radius, posY + radius, posZ - radius); 
      glVertex3f(posX - radius, posY + radius, posZ - radius); 
      glVertex3f(posX - radius, posY + radius, posZ + radius); 
      glVertex3f(posX + radius, posY + radius, posZ + radius); 
     } 
    glEnd(); 
    glPopMatrix(); 

    //bottom 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
     { 
      glColor3f(1.0f,1.0f,0.0f); // ?? color 
      glVertex3f(posX + radius, posY - radius, posZ + radius); 
      glVertex3f(posX - radius, posY - radius, posZ + radius); 
      glVertex3f(posX - radius, posY - radius, posZ - radius); 
      glVertex3f(posX + radius, posY - radius, posZ - radius); 
     } 
    glEnd(); 
    glPopMatrix(); 

    //right side 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
     { 
      glColor3f(1.0f,0.0f,1.0f); // ?? color 
      glVertex3f(posX + radius, posY + radius, posZ + radius); 
      glVertex3f(posX + radius, posY - radius, posZ + radius); 
      glVertex3f(posX + radius, posY - radius, posZ - radius); 
      glVertex3f(posX + radius, posY + radius, posZ - radius); 
     } 
    glEnd(); 
    glPopMatrix(); 

    //left side 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
     { 
      glColor3f(0.0f,1.0f,1.0f); // ?? color 
      glVertex3f(posX - radius, posY + radius, posZ - radius); 
      glVertex3f(posX - radius, posY - radius, posZ - radius); 
      glVertex3f(posX - radius, posY - radius, posZ + radius); 
      glVertex3f(posX - radius, posY + radius, posZ + radius); 
     } 
    glEnd(); 
    glPopMatrix(); 

    //front side 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
     { 
      glColor3f(0.0f,0.0f,1.0f); //blue 
      glVertex3f(posX + radius, posY + radius, posZ + radius); 
      glVertex3f(posX - radius, posY + radius, posZ + radius); 
      glVertex3f(posX - radius, posY - radius, posZ + radius); 
      glVertex3f(posX + radius, posY - radius, posZ + radius); 
     } 
    glEnd(); 
    glPopMatrix(); 

    //back side 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
     { 
      glColor3f(0.0f,1.0f,0.0f); // green 
      glVertex3f(posX + radius, posY - radius, posZ - radius); 
      glVertex3f(posX - radius, posY - radius, posZ - radius); 
      glVertex3f(posX - radius, posY + radius, posZ - radius); 
      glVertex3f(posX + radius, posY + radius, posZ - radius); 
     } 
    glEnd(); 
    glPopMatrix(); 
} 

Oto mój przerobiony kod z kodu testowego cześć świata, czy to wygląda poprawnie dla wszystkich? :

public static void HelloWorld() { 

    BroadphaseInterface broadphase = new DbvtBroadphase(); 
    DefaultCollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration(); 
    CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration); 

    SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver(); 

    DiscreteDynamicsWorld dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); 

    // set the gravity of our world 
    dynamicsWorld.setGravity(new Vector3f(0, -10, 0)); 

    // setup our collision shapes 
    CollisionShape groundShape = new StaticPlaneShape(new Vector3f(0, 1, 0), 1); 
    CollisionShape fallShape = new SphereShape(1); 

    // setup the motion state 
    DefaultMotionState groundMotionState = new DefaultMotionState(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(0, -1, 0), 1.0f))); 

    RigidBodyConstructionInfo groundRigidBodyCI = new RigidBodyConstructionInfo(0, groundMotionState, groundShape, new Vector3f(0,0,0)); 
    RigidBody groundRigidBody = new RigidBody(groundRigidBodyCI); 

    dynamicsWorld.addRigidBody(groundRigidBody); // add our ground to the dynamic world.. 

    // setup the motion state for the ball 
    DefaultMotionState fallMotionState = new DefaultMotionState(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(0, 50, 0), 1.0f))); 

    //This we're going to give mass so it responds to gravity 
    int mass = 1; 

    Vector3f fallInertia = new Vector3f(0,0,0); 
    fallShape.calculateLocalInertia(mass,fallInertia); 

    RigidBodyConstructionInfo fallRigidBodyCI = new RigidBodyConstructionInfo(mass,fallMotionState,fallShape,fallInertia); 
    RigidBody fallRigidBody = new RigidBody(fallRigidBodyCI); 

    //now we add it to our physics simulation 
    dynamicsWorld.addRigidBody(fallRigidBody); 

    for (int i=0 ; i<300 ; i++) { 
     dynamicsWorld.stepSimulation(1/60.f, 10); 

     Transform trans = new Transform(); 
     fallRigidBody.getMotionState().getWorldTransform(trans); 


     System.out.println("sphere height: " + trans.origin.y); 
    } 

} 
+0

Być może link do dema ty patrzysz? – theJollySin

+0

Patrzyłem na dema, które są dołączone do biblioteki, przepraszam, ale nie mają ich z linkami. Chciałbym opublikować kod, ale jest on podzielony na wiele plików klasy i byłoby to uciążliwe.Przeglądałem samouczki, ale naprawdę nie pasują one do jBullet, ponieważ nazwy funkcji są różne: http://bulletphysics.org/mediawiki-1.5.8/index.php/Hello_World – Kenneth

+0

Jeśli mówisz o wyświetleniu na ekranie informacji dotyczących debugowania fizyki, musisz zaimplementować własną klasę "IDebugDraw". Jeśli mówisz o rysowaniu obiektów, które chcesz kontrolować za pomocą fizyki, robisz to bez udziału biblioteki fizyki. jBullet powinien być używany tylko do kontrolowania fizyki twoich obiektów, tj. poruszania nimi i zderzania się ze sobą. Rysowanie modeli lub obiektów powinno odbywać się za pomocą własnego kodu. Jeśli określisz, co chcesz zrobić, podam odpowiedź, jak to zrobić. – MichaelHouse

Odpowiedz

4

kod Przykład jBullet HelloWorld:

public static void HelloWorld() { 

BroadphaseInterface broadphase = new DbvtBroadphase(); 
DefaultCollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration(); 
CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration); 

SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver(); 

DiscreteDynamicsWorld dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); 

// set the gravity of our world 
dynamicsWorld.setGravity(new Vector3f(0, -10, 0)); 

// setup our collision shapes 
CollisionShape groundShape = new StaticPlaneShape(new Vector3f(0, 1, 0), 1); 
CollisionShape fallShape = new SphereShape(1); 

// setup the motion state 
DefaultMotionState groundMotionState = new DefaultMotionState(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(0, -1, 0), 1.0f))); 

RigidBodyConstructionInfo groundRigidBodyCI = new RigidBodyConstructionInfo(0, groundMotionState, groundShape, new Vector3f(0,0,0)); 
RigidBody groundRigidBody = new RigidBody(groundRigidBodyCI); 

dynamicsWorld.addRigidBody(groundRigidBody); // add our ground to the dynamic world.. 

// setup the motion state for the ball 
DefaultMotionState fallMotionState = new DefaultMotionState(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(0, 50, 0), 1.0f))); 

//This we're going to give mass so it responds to gravity 
int mass = 1; 

Vector3f fallInertia = new Vector3f(0,0,0); 
fallShape.calculateLocalInertia(mass,fallInertia); 

RigidBodyConstructionInfo fallRigidBodyCI = new RigidBodyConstructionInfo(mass,fallMotionState,fallShape,fallInertia); 
RigidBody fallRigidBody = new RigidBody(fallRigidBodyCI); 

//now we add it to our physics simulation 
dynamicsWorld.addRigidBody(fallRigidBody); 

for (int i=0 ; i<300 ; i++) { 
    dynamicsWorld.stepSimulation(1/60.f, 10); 

    Transform trans = new Transform(); 
    fallRigidBody.getMotionState().getWorldTransform(trans); 


    System.out.println("sphere height: " + trans.origin.y); 
} 

}

1

Czy wyrejestrowany jMonkeyEngine demos i przykładowy kod?

Sporo z nich używa jBullet jako silnika fizyki, zdecydowanie wartego zabawy.

+0

Spojrzałem na kilka rzeczy z jMonkeyEngine, ale ciężko jest mi zrozumieć, co tak naprawdę dotyczy mnie, odkąd używam LWJGL do napisania mojej gry. Naprawdę, gdybym mógł zobaczyć podstawowy przykład kogoś używającego jBullet do dodania fizyki do kostki lub kulki, a następnie wyświetlenie tej kostki lub kulki byłbym solidny. Mój problem polega na tym, że gdy próbowałem to napisać, nic nie jest wyświetlane, więc dobrze byłoby zobaczyć, jak zrobił to ktoś inny. Chyba powinienem napisać jakiś kod testowy i opublikować go, żeby móc mi powiedzieć, co robię źle, wiem, że powinienem był to zrobić w pierwszej kolejności. – Kenneth

+0

Naprawdę doceniam twoje dane wejściowe pod warunkiem, że będę nadal patrzył na rzeczy JME, aby zobaczyć, czy mogę dowiedzieć się, jak to robią minus specyficzne dla JME. – Kenneth

1

Przyjrzyjmy się przykładowemu kodowi z samouczka, z którym pracujesz. Dodałem komentarze w kodzie, aby lepiej określić, co się dzieje i jak skonfigurować kod. Ważne jest, aby pamiętać, że poniższy kod w rzeczywistości niczego nie wyświetli. Zasadniczo po prostu tworzy obiekt fizyki, ziemię i pozwala obiektowi spaść na ziemię, wyprowadzając wysokość obiektu podczas przechodzenia przez symulację.

int main (void) 
{ 
    //Set up all the required objects and controllers for simulating the physics 
    //all this stuff would actually go into whatever initialize function you have 
    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)); 

    //Create our physics objects, the planeShape is the ground 
    btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1); 

    //A sphere that will be dropping to the ground, 
    btCollisionShape* fallShape = new btSphereShape(1); 

    //Create motion states for our objects 
    //First the ground object. It will be in the XZ plane at -1 Y 
    //note that we're not giving it any mass 
    //zero mass in a physics simulation means it won't move when collided with 
    //it also means that it won't respond to gravity 
    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); 

    //Add the ground to the simulation 
    dynamicsWorld->addRigidBody(groundRigidBody); 

    //now set up the motion state for our sphere, we'll put it at 50 Y 
    btDefaultMotionState* fallMotionState = 
       new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0))); 
    //This we're going to give mass so it responds to gravity 
    btScalar mass = 1; 
    btVector3 fallInertia(0,0,0); 
    fallShape->calculateLocalInertia(mass,fallInertia); 
    btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia); 
    btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI); 

    //now we add it to our physics simulation 
    dynamicsWorld->addRigidBody(fallRigidBody); 


    //Here's where the magic happens. The physics simulation is stepped. 
    //for each step, we're going to get the balls current position and write it out. 
    //Everything inside this for loop would actually go into your *update* loop 
    //your update loop would step the physics simulation 
    //after stepping the simulation, you get the positions of your physics bodies 
    //and make sure your object positions match those. 

    for (int i=0 ; i<300 ; i++) { 
      dynamicsWorld->stepSimulation(1/60.f,10); 

      btTransform trans; 
      fallRigidBody->getMotionState()->getWorldTransform(trans); 

      //so you would take `trans` and use it to set the position of your cube 
      //then your cube position would be updated to the same position as 
      //this physics object that's representing it. 

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

    //everything else is clean up 

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

Zasadniczo chcesz odtworzyć swój świat gry w symulacji fizyki. Następnie, gdy podejdziesz do symulacji fizyki, zaktualizujesz świat gry o nowe pozycje z symulacji. Symulacja fizyki mówi ci, jak przenieść obiekty gry, aby wyglądały, jakby kolidowały ze sobą.

Tak więc, aby skonfigurować, można przenieść rzeczy w pętli for do pętli aktualizacji. Zamiast zapisywać pozycję kuli na konsoli, aktualizujesz swoje położenie z kulą. Teraz twój sześcian porusza się tak samo jak kula w symulacji!

Po prostu ostatni krok w tym kierunku. Tworzysz dwa światy. Ten, w którym rysujesz szczegółową grafikę i taką, w której masz proste kształty reprezentujące fizyczne kształty twoich szczegółowych obiektów graficznych. Świat fizyki symuluje interakcje wszystkich twoich obiektów, a szczegóły obiektów graficznych po prostu odzwierciedlają pozycje tych prostych fizycznych kształtów.

Mam nadzieję, że dzięki temu sprawy będą bardziej przejrzyste.

+0

To pomogło dużo Byte56, teraz mam wyjście i myślę, że rozumiem, co masz na myśli, tworząc dwa światy. W zasadzie bałem się, że będę musiał napisać dużo kodu, ale twoje wyjaśnienie sprawia, że ​​myślę, że nie będę musiał tego robić, co jest niesamowite! Obiecaj, że uzyskasz pierwszy dostęp do przetestowania moich rzeczy, jak tylko wykonam część tworzenia postaci. – Kenneth

+0

Kod nie jest błąd, po prostu nie działa tak jak się spodziewałem, kiedy przeniosłem go do mojej rzeczywistej gry. Kod testowy działa jednak świetnie. – Kenneth

Powiązane problemy