2013-08-23 3 views
0

J'essaie de faire un moteur de jeu et je veux une caméra contrôlée par le joueur et également effectuée par d'autres entités jBullet dans Java. J'ai été suggéré d'utiliser objets cinématiques alors j'ai levé les yeux à leur sujet. Je n'ai trouvé aucune documentation que je pouvais comprendre. Est-ce que quelqu'un peut expliquer comment installer et utiliser des objets cinématiques ou au moins me montrer où je peux commencer?Comment créer des objets cinématiques dans jBullet?

+0

Pourquoi cela a-t-il été réduit? – Prior99

Répondre

2

La documentation pour KinematicCharacterController, trouvée here n'est pas trop utile, mais la source dans le CharacterDemo peut l'être. Deux propriétés principales sont définies dans la démo. Le fantôme peut être utilisé pour la détection de collision dynamique, car il ne réagit pas automatiquement à ces événements. Le personnage peut être déplacé en changeant la transformation.

//from the source src\com\bulletphysics\demos\character\CharacterDemo.java 
    Transform startTransform = new Transform(); 
    startTransform.setIdentity(); 
    startTransform.origin.set(0.0f, 4.0f, 0.0f); 

    Vector3f worldMin = new Vector3f(-1000f,-1000f,-1000f); 
    Vector3f worldMax = new Vector3f(1000f,1000f,1000f); 
    AxisSweep3 sweepBP = new AxisSweep3(worldMin, worldMax); 

    ghostObject = new PairCachingGhostObject(); 
    ghostObject.setWorldTransform(startTransform); 
    sweepBP.getOverlappingPairCache().setInternalGhostPairCallback(new GhostPairCallback()); 
    float characterHeight = 1.75f * characterScale; 
    float characterWidth = 1.75f * characterScale; 
    ConvexShape capsule = new CapsuleShape(characterWidth, characterHeight); 
    ghostObject.setCollisionShape(capsule); 
    ghostObject.setCollisionFlags(CollisionFlags.CHARACTER_OBJECT); 

    float stepHeight = 0.35f * characterScale; 
    character = new KinematicCharacterController(ghostObject, capsule, stepHeight); 


    dynamicsWorld.addCollisionObject(ghostObject, CollisionFilterGroups.CHARACTER_FILTER, (short)(CollisionFilterGroups.STATIC_FILTER | CollisionFilterGroups.DEFAULT_FILTER)); 

    dynamicsWorld.addAction(character); 

Il serait également judicieux d'étendre la classe MotionState pour maintenir la transform

public class MyMotionState extends MotionState { 
     private Transform worldTransform; 
     public MyMotionState() 
     { 
      worldTransform = new Transform(); 
      worldTransform.setIdentity(); 
     } 

     @Override 
     public Transform getWorldTransform(Transform worldTrans) 
     { 
      worldTrans.set(worldTransform); 
      return worldTrans; 
     } 

     @Override 
     public void setWorldTransform(Transform worldTrans) 
     { 
      worldTransform.set(worldTrans); 
     } 
} 

et reliant le Cinématique à un modèle du solide indéformable pour appliquer la physique au caractère et obtenir des infos sur le rendu. N'oubliez pas de mettre à jour le moteur physique une fois toutes les itérations de la boucle de jeu. N'oubliez pas de mettre à jour le moteur physique.

Transform transform = new Transform(); 
    transform.setIdentity(); 
    transform.origin.set(input.getX(), input.getY(), input.getZ()); 
    myMotionState.setWorldTransform(transform); 
    rigidBody.setCenterOfMassTransform(myMotionState.getWorldTransform()); 

Si vous préférez, vous pouvez mettre ces derniers dans votre classe MainCharacter ou tout ce que vous appelez (je l'aime pour l'objet orienté sensation et la facilité à comprendre)

public class MainCharacter implements KeyListener, MouseListener 
    { 
     private DynamicsWorld world; 
     private MyMotionState myMotionState; 
     private RigidBody rigidBody; 
     private KinematicCharacterController character; 
     private ConvexShape shape; 
     private Texture texture; 
     private GhostObject ghost; 
     private Vector3f pos; 
     public MainCharacter(DynamicsWorld world, Vector3f initialPosition, ConvexShape shape, Texture texture) 
     { 
      this.world = world; 
      RigidBodyConstructionInfo constructInfo = new RigidBodyConstructionInfo(...); 
      this.myMotionState = myMotionState; 
      rigidBody = new RigidBody(constructInfo); 
      ghost = new GhostObject(); 
      character = new KinematicCharacterController(ghost,shape,1); 
     } 
     public void render() 
     { 
      glBegin(GL_QUADS); 
       glVertex3f(... 
       ... 
      glEnd(); 
     } 
     public void mouseMoved(MouseEvent e) 
     { 
       //pseudocode 
       this.yaw = e.getDX(); 
       this.pitch = e.getDY(); 
     } 
     public void keyPressed(KeyEvent e) 
     { 
      Vector3f dPos = null; 
      if(e.getKeyChar() == 'W') 
      { 
       dPos.x = 10; 
      } 
      else if(e.getKeyChar() == 'S') 
      { 
       dPos.x = -10; 
      } 
      etc... 

      move(dPos.x,dPos.y,dPos.z); 
     } 
     public void move(float dx, float dy, float dz) { 
      pos.z += dx * (float) Math.cos(Math.toRadians(yaw - 90)) + dz *  Math.cos(Math.toRadians(yaw)); 
      pos.x -= dx * (float) Math.sin(Math.toRadians(yaw - 90)) + dz * Math.sin(Math.toRadians(yaw)); 
      pos.y += dy * (float) Math.sin(Math.toRadians(pitch - 90)) + dz * Math.sin(Math.toRadians(pitch)); 
      //pseudocode 
      rigidBody.update(pos); 
      world.update(pos); 
     } 
    } 

J'espère avoir aidé toi.

+0

"Il serait également judicieux d'étendre la classe MotionState pour contenir la transformation" Comment dois-je faire cela? – Sierox

+0

Modifié pour afficher l'ensemble de la classe MyMotionState. De plus, le MotionState envoie ses données au monde à chaque itération de la boucle, donc si vous avez les vôtres, vous pouvez changer ses données (c'est-à-dire la position) – user2727804

Questions connexes