Girar GameObject a lo largo del tiempo

Soy un nuevo aquí e bash comenzar a trabajar con Unity Engine.

¿Podría alguien explicarme cómo funciona Quaternion.Slerp? Porque quiero rotar algún objeto en diferentes angularjs 90, 180 y 270. Mi código se puede ver a continuación. Desafortunadamente cuando agrego 180 grados, el objeto hace cosas locas y luego le pongo rotación a (0, 180, 180) para este objeto del juego. Me gustaría obtener (180,0,0)

public float speed = 0.1F; private float rotation_x; void Update() { if (Input.GetButtonDown("Fire1")) { rotation_x = transform.rotation.eulerAngles.x; rotation_x += 180; } transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(rotation_x, transform.eulerAngles.y, transform.eulerAngles.z), Time.time * speed); } 

La mayoría de los ejemplos, incluidos los ejemplos de Unity de su sitio web oficial, están utilizando Lerp de forma incorrecta. Ni siquiera se molestaron en describir cómo funciona en la documentación de API. Simplemente lo almidonan en la función Update() y lo llaman un día.

Mathf.Lerp , Vector3.Lerp y Quaternion.Slerp funcionan cambiando de una posición / rotación a otra con el valor t (último parámetro) que se transfiere. Ese valor t también se conoce como tiempo.

El valor min del valor t es 0f y el valor máximo es 1f .

Explicaré esto con Mathf.Lerp para que sea más fácil de entender. Las funciones de Lerp son las mismas para Mathf.Lerp , Vector y Quaternion .

Recuerde que Lerp toma dos valores y devuelve valores entre ellos. Si tenemos un valor de 1 y 10 y hacemos Lerp en ellos:

  float x = Mathf.Lerp(1f, 10f, 0f); will return 1. float x = Mathf.Lerp(1f, 10f, 0.5f); will return 5.5 float x = Mathf.Lerp(1f, 10f, 1f); will return 10 

Como puede ver, t(0) devuelve el mínimo del número pasado, t(1) devuelve el valor máximo pasado t(0.5) devolverá el punto medio entre el valor mínimo y máximo . Lo estás haciendo mal cuando pasas cualquier valor t que sea < 0 o > 1 . Ese código en su función Update() está haciendo exactamente eso. Time.time boostá cada segundo y será > 1 en un segundo, por lo que tienes problemas con eso.

Se recomendó usar Lerp en otra función / Coroutine en lugar de la función actualizada.

Nota :

Usar Lerp tiene un lado malo cuando se trata de rotación. Lerp no sabe cómo rotar objetos con la ruta más corta. Así que tenlo en cuenta. Por ejemplo, tiene un Objeto con 0,0,90 posición de 0,0,90 . Digamos que quiere mover la rotación de eso a 0,0,120 Lerp veces puede girar hacia la izquierda en lugar de hacia la derecha para alcanzar esa nueva posición, lo que significa que tarda más en llegar a esa distancia.

Digamos que queremos hacer la rotación (0,0,90) de lo que sea que sea la rotación actual. El siguiente código cambiará la rotación a 0,0,90 en 3 segundos.

ROTACIÓN A LO LARGO DEL TIEMPO :

 void Start() { Quaternion rotation2 = Quaternion.Euler(new Vector3(0, 0, 90)); StartCoroutine(rotateObject(objectToRotate, rotation2, 3f)); } bool rotating = false; public GameObject objectToRotate; IEnumerator rotateObject(GameObject gameObjectToMove, Quaternion newRot, float duration) { if (rotating) { yield break; } rotating = true; Quaternion currentRot = gameObjectToMove.transform.rotation; float counter = 0; while (counter < duration) { counter += Time.deltaTime; gameObjectToMove.transform.rotation = Quaternion.Lerp(currentRot, newRot, counter / duration); yield return null; } rotating = false; } 

ROTACIÓN ANGULAR INCREMENTAL A LO LARGO DEL TIEMPO:

Y para simplemente rotar el objeto a 90 en el eje z, el siguiente código es un gran ejemplo de eso. Por favor, comprenda que hay una diferencia entre mover Objeto a un nuevo punto de rotación y simplemente rotarlo.

 void Start() { StartCoroutine(rotateObject(objectToRotate, new Vector3(0, 0, 90), 3f)); } bool rotating = false; public GameObject objectToRotate; IEnumerator rotateObject(GameObject gameObjectToMove, Vector3 eulerAngles, float duration) { if (rotating) { yield break; } rotating = true; Vector3 newRot = gameObjectToMove.transform.eulerAngles + eulerAngles; Vector3 currentRot = gameObjectToMove.transform.eulerAngles; float counter = 0; while (counter < duration) { counter += Time.deltaTime; gameObjectToMove.transform.eulerAngles = Vector3.Lerp(currentRot, newRot, counter / duration); yield return null; } rotating = false; } 

Todos mis ejemplos están basados ​​en frame-rate del dispositivo. Puede usar en tiempo real al reemplazar Time.deltaTime con Time.delta pero se requieren más cálculos.

Antes de nada, no puedes agregar 180 en angularjs de Euler como ese, y eso es principalmente lo que está causando tu problema. Será mejor que use quaternion directamente en su lugar, o trabaje en la transformación en sí.

Puedes pensar en un quaternion como una orientación en el espacio. En contra de lo que se ha dicho, recomiendo aprender a usarlos si puede. Sin embargo, no recomiendo usar angularjs de Euler en absoluto … ya que están sujetos a diferentes convenciones de escritura, y fallarán a veces. Puedes ver ‘locking de cardán’ si quieres detalles sobre eso.

Simplemente un slerp o lerp (que significa interpolación esférica lineal o interpolación lineal, respectivamente) es una forma de interpolar (pasar de una orientación a otra, aumentando t de 0 a 1, en una corutina o en cualquier otro lugar) entre la orientación A y B La diferencia entre los dos es que el slerp te está dando el camino más corto de A a B.

Al final, cuando t = 1, lerp (A, B, t) y slerp (A, B, t) te darán B.

En su caso, si desea rotar instantáneamente un objeto en el espacio a una orientación específica, le sugiero que utilice Quaternion.AngleAxis, que es la manera más avanzada para describir matemáticamente un cuaternión.

Si desea agregar una rotación, digamos 90 ° a su orientación real (sin animación entre las dos), puede hacer algo como esto:

transform.rotation * = Quaternion.AngleAxis (axis_of_rotation, angle) o use transform.rotate (dependiendo de los parámetros, puede ser una multiplicación a la derecha o una transformación a la izquierda: local o mundial).

La respuesta de los progtwigdores es detallar cómo animar su transformación. Pero sí sugiero que investiguen el quaternion ellos mismos, ya que le dará una comprensión global de las transformaciones del espacio.