2017-10-06 14 views
0

Je travaille sur un jeu en 3D dans LWJGL, et je voudrais ajouter une première caméra de style personne avec l'aide de la souris. J'en ai un actuellement, mais ce n'est pas lisse et ne fonctionne pas très bien du tout. J'aimerais vraiment que la fenêtre soit aussi focalisée, donc la souris est engagée et ne plane pas sur la fenêtre. Comment puis-je l'implémenter?Une caméra à la première personne Style pour LWJGL (souris Support)

Voici mon implémentation actuelle de la caméra:

public class Camera { 

private Vector3f position = new Vector3f(0,5,0); 
private float pitch = 10; 
private float yaw; 
private float roll; 

private float speed = 0.2f; 

public Camera() { 

} 

public void move() { 

    yaw = - (Display.getWidth() - Mouse.getX()/4); 
    pitch = (Display.getHeight()/1000) - Mouse.getY(); 

    if (pitch >= 90) { 
     pitch = 90; 
    } 
    else if (pitch <= -90) { 
     pitch = -90; 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_W)) { 

     position.z += -(float)Math.cos(Math.toRadians(yaw)) * speed; 
     position.x += (float)Math.sin(Math.toRadians(yaw)) * speed; 

    } 
    else if (Keyboard.isKeyDown(Keyboard.KEY_S)) { 

     position.z -= -(float)Math.cos(Math.toRadians(yaw)) * speed; 
     position.x -= (float)Math.sin(Math.toRadians(yaw)) * speed; 

    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_D)) { 

     position.z += (float)Math.sin(Math.toRadians(yaw)) * speed; 
     position.x += (float)Math.cos(Math.toRadians(yaw)) * speed; 

    } 
    else if (Keyboard.isKeyDown(Keyboard.KEY_A)) { 

     position.z -= (float)Math.sin(Math.toRadians(yaw)) * speed; 
     position.x -= (float)Math.cos(Math.toRadians(yaw)) * speed; 

    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { 

     position.y -= speed; 

    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) { 

     position.y += speed; 

    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { 
     System.exit(0); 
    } 

} 

public Vector3f getPosition() { 
    return position; 
} 

public float getPitch() { 
    return pitch; 
} 

public float getYaw() { 
    return yaw; 
} 

public float getRoll() { 
    return roll; 
} 

} 

Répondre

0

Vous faites la division entière lors du calcul de lacet et de tangage, cela est mauvais parce que le résultat sera également un entier. Pour changer cela, vous avez juste à faire une valeur d'un flotteur comme celui-ci:

yaw = - (Display.getWidth() - Mouse.getX()/4f); 
pitch = (Display.getHeight()/1000f) - Mouse.getY(); 

Maintenant, le résultat sera beaucoup plus précis.

Bien que je recommande d'utiliser ce code pour calculer votre tangage et lacet:

float rotationSpeed = 1.0; //You probably need to change this factor 
yaw -= Mouse.getDX()/rotationSpeed; 
pitch += Mouse.getDY()/rotationSpeed; 

getDX/Y() retourne le mouvement sur x/axe y depuis la dernière fois getDX/Y() a été appelée.

Si vous voulez vous concentrer sur la fenêtre il suffit d'appeler Mouse.setGrabbed (true).