¿Cómo usar Input.GetAxis (“Mouse X / Y”) para rotar la cámara?

13

Quiero hacer una cámara en primera persona que gire con el mouse.

Miré la página API de scripts de Input.GetAxis y encontré un código de muestra, que he incluido al final de mi publicación. Al probarlo, me di cuenta de que, aunque tiene la misma funcionalidad básica que esperaba que tuviera, no mantiene la cámara paralela al plano xz, especialmente al mover el mouse en círculos. Después de un tiempo, la cámara estaría en un ángulo extraño, ¡y el jugador estaría completamente descombobulado!

¿Existe una solución rápida para este código que restringiría el movimiento de la cámara de alguna manera, o hay una mejor manera de rotar la cámara?

 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);
         }
     }
reencarnación de intercambio de pila
fuente
Lo que estás experimentando suena como un bloqueo de cardán. Ocurre cuando usa ángulos de Euler para la rotación. Tendría que hacer algunas pruebas para ofrecer una solución. Básicamente, necesitas usar cuaterniones. No sufren de bloqueo de cardán.
Fuzzy Logic
¿Cómo usaría un quaternion para hacer rotación? Intenté transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse X"), Time.deltaTime * freeLookTurningSpeed); , pero eso me dio errores.
reincarnationofstackexchange
Ok, hice una prueba. Afortunadamente, no es un bloqueo de cardán. Publicaré la solución como respuesta para usted.
Fuzzy Logic

Respuestas:

18

El problema es que está actualizando la rotación existente en lugar de rastrearla usted mismo y reemplazarla en cada actualización.

Cuando actualiza la rotación, combina su nueva rotación con la anterior, lo que conduce a un comportamiento inesperado.

La solución es realizar un seguimiento de su rotación acumulada y restablecer la rotación por completo cada actualización con sus nuevos valores.

Crédito debido, encontré la respuesta aquí: Respuestas de Unity: cómo-bloquear-o-configurar-las-cámaras-z-rotación-a-cero

Código de trabajo

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

Diferencias clave

  • Almacene el guiñada y el tono como miembros de la clase, en lugar de variables de método locales para que pueda realizar un seguimiento de los valores acumulados.
  • Use + = y / o - = para acumular cada actualización.
  • Utilice eulerAngles (para sobrescribir el valor de rotación de cada actualización) en lugar de Rotar (que aplica su nueva rotación a la anterior).
Lógica difusa
fuente
De nada. Si esta solución que publiqué resolvió el problema original que tenía, debería aceptarlo como respuesta. Si desea obtener ayuda con su nuevo problema, debe publicar una nueva pregunta para mantener las cosas ordenadas y es más probable que otros puedan ayudarlo o encontrar su pregunta si tienen un problema similar. Las áreas de comentarios no están destinadas a un diálogo extendido. Salud.
Fuzzy Logic
0

¿Qué pasa si haces que la cámara sea hija de un objeto de juego vacío? Luego, con un script, administra la rotación del objeto del juego vacío en relación con el vector UP. (MouseX) Con otro script conectado al objeto del juego de la cámara, administra la rotación en relación con el vector Right (MouseY)

dnk drone.vs.drones
fuente