Jump to content
UnitySpain
Sign in to follow this  
nomoregames

Dudas sobre rotacion y root

Recommended Posts

¡Hola a todos!

Antes de nada, decir que estoy realmente encantado de formar parte de esta comunidad, leyendo las  preguntas y respuestas de otros compañeros, he aprendido mucho y estoy realmente agradecido.

Aqui viene mi duda

 

 

Estoy trabajando en una camara en primera persona.

Tengo un obj player, y en el, ai diferenciadas dos partes; la cabeza y el resto de el cuerpo, dentro de la cabeza esta la camara.

La cabeza es movida a través de el ratón, tanto en el eje y como el z. El cuerpo tiene el mismo eje y que la cabeza, de manera que girara a izquierda y derecha al mismo compás que la cabeza,

ahora vien, para darle algo de dinamismo a los giros derecha y izquierda, quise usar la funcion Smooth Damp, para darle algo de fluidez,... pero aquí reside mi problema, y es  que cuando la rotacion y 

de la cabeza llega a 0, el cuerpo da un giro de 360 grados y quiero evitarlo... Como lo podria solucionar?

Agradeceria cualquier consejo

 

 

 public GameObject Cabeza;
    public GameObject Cuerpo;

    float MouseX;
    float MouseY;

    public float MaxY;
    public float MinY;

    Vector3 current;

    void Start()
    {
        
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        
        MouseX += Input.GetAxis("Mouse X");
        MouseY += Input.GetAxis("Mouse Y");

        MouseY = Mathf.Clamp(MouseY, MinY, MaxY);


        Vector3 cuerpoVy = new Vector3(0, Cuerpo.transform.localEulerAngles.y, 0);
        Vector3 cabezaVy = new Vector3(0, Cabeza.transform.localEulerAngles.y, 0);

        Cabeza.transform.eulerAngles = new Vector3(-MouseY, MouseX,0 );

        Cuerpo.transform.localEulerAngles = Vector3.SmoothDamp(cuerpoVy, cabezaVy, ref current,0.08f);

        

      


    }
}

 

 

Ese es todo el codigo que tengo por ahora(no es muy elegante pero no llego a mas XD)

Captura.PNG

 

 

A si y otra duda que no tiene nada que ver...

Y es que no se que hace la función root ni como se usa, lo he mirado en la documentación de unity pero no logro aclararme.

 

Gracias por tu atención:)

 

 

01110001 01110101 01100101 00100000 01101100 01100001 00100000 01100110 01110101 01100101 01110010 01111010 01100001 00100000 01101111 01110011 00100000 01100001 01100011 01101111 01101101 01110000 01100001 11000011 10110001 01100101

 

 

Edited by nomoregames

Share this post


Link to post
Share on other sites

Hola nomoregames.

 

Ahora mismo no recuerdo con garantías en como se evitaba el choque ese del 360 al 0. Pero ¿has probado usando las rotaciones quaternarias? (en vez de las Eulerianas)

El tipo Quaternion (que es el que unity usa por defecto para las rotaciones) tiene su X, Y, Z y W, ese valor extra, el motor lo usa para averiguar la dirección de la rotación y evitar errores como ese.

 

Por eso, yo probaría, en vez de usar el smoothdamp del Vector3, usaría el Slerp que hay en la clase de Rotation (que trabaja con números quaternarios).

 

public GameObject Cabeza;
    public GameObject Cuerpo;

    float MouseX;
    float MouseY;

    public float MaxY;
    public float MinY;

    Vector3 current;

    private float RotationSpeed = 5.0f; //Added
	private float timeCount = 0.0f; //Added

    // Update is called once per frame
    void FixedUpdate()
    {
        
        MouseX += Input.GetAxis("Mouse X");
        MouseY += Input.GetAxis("Mouse Y");

        MouseX = Mathf.Clamp(MouseY, 0, 360);//Added
        MouseY = Mathf.Clamp(MouseY, MinY, MaxY);
        
		Cabeza.transform.eulerAngles = new Vector3(-MouseY, MouseX,0 );

		Cuerpo.transform.rotation = Quaternion.Slerp(Cuerpo.transform.rotation, Cabeza.transform.rotation, timeCount);  //Added
		timeCount = timeCount + Time.deltaTime * RotationSpeed;  //Added


    }
}

 

No lo he probado y no estoy seguro de si funcionará, pero bueno, algo así es lo que probaría yo.

Edited by Antonio

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...