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?
Répondre
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.
"Il serait également judicieux d'étendre la classe MotionState pour contenir la transformation" Comment dois-je faire cela? – Sierox
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
- 1. Faire entrer en collision deux objets mais se déplacer comme des objets cinématiques
- 2. Comment créer des objets dans Dojo
- 3. Créer des objets complexes
- 4. Créer des objets numériques
- 5. Créer des objets "durables"
- 6. Python, créer des objets
- 7. Comment créer des widgets et des objets réutilisables dans GWT?
- 8. Comment créer des classes et des objets dans PHP
- 9. Comment créer des événements pour des objets dans un tableau?
- 10. créer des objets déplaçables iPhone
- 11. IoC: Comment créer des objets dynamiquement
- 12. Comment créer des objets dynamiquement avec C#?
- 13. Comment créer des objets Threadsafe sur C#?
- 14. Comment créer correctement des objets de jeu
- 15. Comment créer des objets lors de l'exécution?
- 16. Comment créer dynamiquement des objets JSON imbriqués?
- 17. python: Comment créer prévu des objets unicode
- 18. Comment créer des objets de classe dynamiquement?
- 19. Comment créer des objets avec javascript/jquery
- 20. créer dynamiquement des objets dans une boucle
- 21. Créer liste des objets différents
- 22. Comment créer des objets Domaine valides à l'exécution dans Grails
- 23. Comment créer des objets de test dans les tests?
- 24. Comment créer des objets personnalisés dans xcode 4 pour iPhone
- 25. Comment créer des objets personnalisés/liste d'objets personnalisés dans VB.NET?
- 26. Fonction pour créer des objets?
- 27. Détection de collision dans les corps cinématiques LIBGDX
- 28. Comment faire des objets créer Zend_Json plutôt que des tableaux
- 29. Comment créer dynamiquement des objets avec des variables?
- 30. créer des objets de perspective avec jquery
Pourquoi cela a-t-il été réduit? – Prior99