Comment utiliser Input.GetAxis («Souris X / Y») pour faire pivoter la caméra?

13

Je veux faire un appareil photo à la première personne qui tourne avec la souris.

J'ai regardé la page API Input.GetAxis Scripting et trouvé un exemple de code, que j'ai inclus au bas de mon message. En l'essayant, j'ai réalisé que bien qu'il ait les mêmes fonctionnalités de base que j'espérais, il ne maintient pas la caméra parallèle au plan xz, en particulier lorsque vous déplacez la souris en cercles. Au bout d'un moment, la caméra serait à un angle étrange et le joueur serait complètement décomposé!

Existe-t-il une solution rapide à ce code qui restreindrait en quelque sorte le mouvement de la caméra, ou existe-t-il une meilleure façon de faire pivoter la caméra?

 using UnityEngine;
 using System.Collections;

     public class ExampleClass : MonoBehaviour {
         public float horizontalSpeed = 2.0F;
         public float verticalSpeed = 2.0F;
         void Update() {
             float h = horizontalSpeed * Input.GetAxis("Mouse X");
             float v = verticalSpeed * Input.GetAxis("Mouse Y");
             transform.Rotate(v, h, 0);
         }
     }
réincarnation de l'échange de pile
la source
Ce que vous ressentez ressemble à un verrouillage de cardan. Cela se produit lorsque vous utilisez des angles d'euler pour la rotation. Il faudrait que je fasse quelques tests pour proposer une solution. Fondamentalement, vous devez utiliser des quaternions. Ils ne souffrent pas de blocage du cardan.
Fuzzy Logic
Comment utiliser un quaternion pour faire une rotation? J'ai essayé transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse X"), Time.deltaTime * freeLookTurningSpeed); , mais cela m'a donné des erreurs.
reincarnationofstackexchange
Ok, j'ai fait un test. Heureusement, ce n'est pas un verrou de cardan. Je posterai la solution comme réponse pour vous.
Fuzzy Logic

Réponses:

18

Le problème est que vous mettez à jour la rotation existante au lieu de la suivre vous-même et de la remplacer à chaque mise à jour.

Lorsque vous mettez à jour la rotation, elle combine votre nouvelle rotation avec l'ancienne, ce qui entraîne un comportement inattendu.

La solution est de garder une trace de votre rotation accumulée et de réinitialiser entièrement la rotation à chaque mise à jour avec vos nouvelles valeurs.

C'est à cause de cela, j'ai trouvé la réponse ici: Réponses Unity: comment verrouiller ou régler les caméras sur la rotation z à zéro

Code de travail:

using UnityEngine;
using System.Collections;

public class FirstPersonCam : MonoBehaviour {

    public float speedH = 2.0f;
    public float speedV = 2.0f;

    private float yaw = 0.0f;
    private float pitch = 0.0f;

    void Update () {
        yaw += speedH * Input.GetAxis("Mouse X");
        pitch -= speedV * Input.GetAxis("Mouse Y");

        transform.eulerAngles = new Vector3(pitch, yaw, 0.0f);
    }
}

Différences clés:

  • Stockez le lacet et le tangage en tant que membres de la classe, plutôt que comme variables de méthode locales afin de pouvoir suivre les valeurs accumulées.
  • Utilisez + = et / ou - = pour accumuler chaque mise à jour.
  • Utilisez eulerAngles (pour écraser la valeur de rotation à chaque mise à jour) au lieu de Rotate (qui applique votre nouvelle rotation à l'ancienne).
Logique floue
la source
Vous êtes le bienvenu. Si cette solution que j'ai publiée a résolu le problème d'origine que vous rencontriez, vous devez l'accepter comme réponse. Si vous souhaitez obtenir de l'aide pour votre nouveau problème, vous devez publier une nouvelle question pour garder les choses en ordre et plus susceptibles que les autres puissent vous aider ou trouver votre question s'ils ont un problème similaire. Les zones de commentaire ne sont pas destinées à une boîte de dialogue étendue. À votre santé.
Fuzzy Logic
0

Que se passe-t-il si vous faites de l'enfant caméra d'un objet de jeu vide. Ensuite, avec un script, vous gérez la rotation de l'objet de jeu vide par rapport au vecteur UP. (MouseX) Avec un autre script attaché à l'objet de jeu de la caméra, vous gérez la rotation par rapport au vecteur Right (MouseY)

dnk drone.vs.drones
la source