Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 58,34€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
megaPRO

Desfase en la rotación del First Person en Modo Cardboard VR

Recommended Posts

Hola ,

Mi objetivo es crear un First Person propio para modo vuelo tipo Dron en modo Cardboard, para eso me he creado un GameObject que tiene de componentes un Rigidbody,  un Capsule Collider y naturalmente el Script de la Clase Dron, que ahora os pondré, además como hija, tiene un GameObject cámara para poder hacer el cabeceo en pitch (Vertical) y en yaw (Horizontal). Este es el Script:


 

using UnityEngine;

public class DronVirtual : MonoBehaviour
{
    //Ejes
    private float forward;
    public float yaw;
    private float height;
    private float translate;
    
    //Velocidades
    public float forwardSpeed;
    public float yawSpeed;
    public float heightSpeed;
    public float translateSpeed;
    private float Speed;
    
    //Variable estado
    private bool swap = false;
    
    //Coordenadas    
    public Transform cam;
    public Transform RbFPC;

    void Start()
    {
             Speed = 2.5f;
    }


    //Proceso continuo

    void Update()
    {   
        //Inputs Joysticks/Mouse
        translate = Input.GetAxis("Horizontal") * translateSpeed * Speed;// X Axis
        forward = Input.GetAxis("Vertical") * forwardSpeed * Speed; // 4th Axis
        yaw = Input.GetAxis("Analog X") * yawSpeed * Speed;// 3rd Axis
        height = Input.GetAxis("Analog Y") * heightSpeed * Speed;

        //Actualiza con Time.deltaTime;
        translate *= Time.deltaTime;
        height *= Time.deltaTime;
        forward *= Time.deltaTime;
        yaw *= Time.deltaTime;

        // Asigna valor de la Cámara (Hija) de su rotacion en EulerAngles a una variable float
        float eixY = cam.transform.localEulerAngles.y;
      
        
        //Copia valor a la rotación del GameObject Padre
        RbFPC.transform.rotation = Quaternion.Euler (0f, eixY, 0f);

        
        // actualiza posición GameObject Padre
        RbFPC.transform.Translate (translate, height, forward);
        
    }
}

Seguimos,

Lo que busco es igualar la rotación del GameObject (FPS) que es el padre de la camara, que esta como hija, cosa que realmente en datos en el inspector puedo ver que  funciona perfectamente el script, veo la rotación en Y de la camara y es exactamente igual, pero que a la hora de que el FPS siga la trayectoria hacia donde estoy mirando, que debe estar pasando?  estoy fallando y donde?.

Unity según la documentación trabaja internamente en Quaternions, y para nosotros, o mejor dicho para mi, lo entiendo algo mejor si la rotación la veo en ángulos, soy humano.

Pero, observando mientras escribo este post, llego a la conclusión  que realmente lo que veo que pasa es que la camara rota a la vez que rota mi FPS, a la vez, realmente , cada grado que gira la camara , realmente está girando 2, es decir, que en cada grado que rota la camara, el FPS rota otro más, y el total es la suma de las dos rotaciones,  por lo que el razonamiento que habia hecho en ese Script, al querer copiar el eje y de la cámara era incorrecto.

Al ver la rotación fisicamente desde la vista superior en la Scene , me he dado cuenta de ese fallo y donde, mi lógica fallaba contundentemente, ya que en el inspector podia ver que en el giro del primer angulo recto de la camara o del GameObject Padre, como cada uno habia recorrido sólo 45º, y no 90º los 2, por lo que la trayectoria que hacia al desplazarme hacia adelante no era la visual sino justo la mitad, si es que....enfin.Mama quiero ser Artista..... y me meto a coder...hahahaha.

Una vez entendido eso, he hecho esta ñapa en el control del Dron. (Script).

// solucion 2
        // Creo dos vector3 y les asigno los angulos de la cámara y del fps
        Vector3 rotacion1 = cam.transform.localEulerAngles;
        Vector3 rotacion2 = RbFPC.transform.localEulerAngles;

        
        //Asigno la rotacion en Y al FPS, así el FPS gira y la camara con él
        rotacion2.y = rotacion1.y;
        // Asigno la rotacion yaw al FPS
        RbFPC.transform.localEulerAngles = rotacion2;

        // Asigno el valor de la camara en su rotacion Y a cero
        rotacion1.y = 0f;
        // Asigno la rotación resultante a la cámara
        cam.transform.localEulerAngles = rotacion1;
        

Tengo que probar la Build pero en el inspector ahora sí, que hace lo que le pido. Quizás los coders, me puedan decir una forma más elegante de conseguir lo mismo. Quizás con las Constrains...no se.

Primero estaba asignando mal el giro en Yaw, pero es que además es en VR, que lo complica un poco más, al ser más lento el probarlo,  simplemente por desconocimiento,  cómo quien manda en esos ejes desde el Cardboard, es el Head, y estoy aún entiendo su funcionamiento .

No se si la solucion de obligar a la camara a estar en 0f, en ese eje Y de rotación, me puede dar problemas.

ya casi está el Build.

Qué opinais?.

 

Un saludo.

 

Edited by megaPRO
corrijo falta

Share this post


Link to post
Share on other sites

Pues, una mm para mi, aunque en el Editor funcionaba, con la emulacion de GvrEditorEmulator, en la Build, nanai...

 

Alguna luz por donde alumbrar?

 

Saludos.

Share this post


Link to post
Share on other sites

Hola

Dos apartados que deben quedar claros de entrada:

- En VR manda  la cámara si o si, ya que le llegan todos los "inputs" de los sensores. No le debes bloquear nada, además de que generarás mareos estilo serie de pokemon.

- Una rotación nunca la puedes anular poniéndola a 0. Solo conseguirás que todo comience a bailar y shaked, shaked. Y desde luego con Quaternions, ya que con ángulos se te desbordarán en el 180, -180 y todo bailará también. Si quieres que explique cómo hacer ésto, me dices, pero es que no lo veo necesario si he entendido bien.

El player como parent y la cámara VR como hija de éste. Con esto ya tienes las rotaciones. Ahora lo que tienes que hacer es tomar el transform.forward del local de la cámara y asignarlo al position del player con un translate con deltatime y speed, etc. O sea:

public class player : MonoBehaviour {
    [SerializeField] private Camera playerCamera;

    private float speed = 2f;

    void Start() {
    }

    void Update() {
        Vector3 movement = this.playerCamera.transform.TransformDirection(Vector3.forward);
        float factor = Time.deltaTime * this.speed;

        movement *= factor;

        this.transform.Translate(movement, Space.World);
    }
}

Incluso, si quieres bloquear un eje del movimiento o asignarle valores distintos, con acceder a la variable movement puedes asignar los ejes de manera independiente.

Saludos

Share this post


Link to post
Share on other sites

@iRobb Muchas gracias , como ya empieza siendo habitual, gracias gracias... he modificado el movimiento en el Update para que sólo si el forward tiene valor actue, tanto para ir hacia adelante como para ir hacia atras, por que sino, la locura... aunque es divertido el modo vuelo.

	if (Input.GetAxis("Vertical") >= 0)
        {
            this.transform.Translate(movement, Space.World);
        }
        if (Input.GetAxis("Vertical") <= 0)
        {
            this.transform.Translate(-movement, Space.World);
        }

  Además he añadido una entrada en el Input para que modifique el valor speed entre lento(1f) y rapido (3f) de momento asi, me basta. Hace lo que queria, aunque ahora queda ligado el eje de altura a que haya movimiento como condición para que cambie de altura. Eso lo he arreglado añadiendo justamente que lo haga en el Update.

 // actualiza posición Altura GameObject Parent
        RbFPC.transform.Translate(0f, height, 0f);

De nuevo gracias por contestar, llevaba tiempo queriendolo resolver.

Como puntillita quiero averiguar porqué en el Editor me funcionaba y en la build hace el desfase, si no es molestia estaria muy atento a tu interpretación como me comentas.

 

Un saludo.

Pdta. Adjunto Scrip para quien quiera usarlo.

Dron.cs

Share this post


Link to post
Share on other sites

×
×
  • Create New...