Come utilizzare Input.GetAxis ("Mouse X / Y") per ruotare la videocamera?


13

Voglio fare una fotocamera in prima persona che ruota con il mouse.

Ho guardato la pagina API Scripting Input.GetAxis e ho trovato un codice di esempio, che ho incluso nella parte inferiore del mio post. Dopo averlo provato, mi sono reso conto che, sebbene abbia le stesse funzionalità di base che speravo potesse avere, non mantiene la fotocamera parallela al piano xz, in particolare quando si sposta il mouse in cerchio. Dopo un po 'la telecamera si troverebbe ad un'angolazione dispari e il giocatore sarebbe completamente scomposto!

Esiste una soluzione rapida a questo codice che limiterebbe in qualche modo il movimento della videocamera o esiste un modo migliore per ruotare la videocamera?

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

Quello che stai vivendo suona come il gimbal lock. Succede quando si utilizzano gli angoli di eulero per la rotazione. Dovrei fare dei test per offrire una soluzione. Fondamentalmente, devi usare i quaternioni. Non soffrono di blocco del gimbal.
Fuzzy Logic,

Come userei un quaternione per fare la rotazione? Ho provato transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse X"), Time.deltaTime * freeLookTurningSpeed); , ma questo mi ha dato errori.
reincarnazione dello

Ok, ho fatto un test. Fortunatamente, non è il blocco del gimbal. Pubblicherò la soluzione come risposta per te.
Fuzzy Logic,

Risposte:


18

Il problema è che stai aggiornando la rotazione esistente invece di rintracciarla tu stesso e sostituirla ad ogni aggiornamento.

Quando aggiorni la rotazione, essa combina la nuova rotazione con quella precedente, il che porta a comportamenti imprevisti.

La soluzione è tenere traccia della rotazione accumulata e reimpostare completamente la rotazione ogni aggiornamento con i nuovi valori.

Ringrazio dove dovuto, ho trovato la risposta qui: Unity Answers: come-bloccare-o-impostare-le-telecamere-z-rotazione-a-zero

Codice di lavoro:

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

Differenze chiave:

  • Memorizza yaw e pitch come membri della classe, piuttosto che variabili del metodo locale in modo da poter tenere traccia dei valori accumulati.
  • Usa + = e / o - = per accumulare ogni aggiornamento.
  • Usa eulerAngles (per sovrascrivere il valore di rotazione ogni aggiornamento) invece di Ruota (che applica la tua nuova rotazione a quella precedente).

Prego. Se questa soluzione che ho pubblicato ha risolto il problema originale che stavi riscontrando, dovresti accettarlo come risposta. Se desideri ricevere assistenza per il tuo nuovo problema, dovresti pubblicare una nuova domanda per mantenere le cose in ordine e più probabilità per gli altri di aiutarti o trovare la tua domanda se hanno un problema simile. Le aree dei commenti non sono pensate per la finestra di dialogo estesa. Saluti.
Fuzzy Logic,

0

Che cosa succede se rendi la fotocamera figlia di un oggetto di gioco vuoto. Quindi con uno script gestisci la rotazione dell'oggetto di gioco vuota rispetto al vettore UP. (MouseX) Con un altro script collegato all'oggetto di gioco della fotocamera gestisci la rotazione rispetto al vettore destro (MouseY)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.