Método de rotación de unidad

Prólogo

Este artículo clasifica los métodos de rotación comúnmente utilizados en Unity, que involucran dos categorías principales: Transformar y Quaternion.

Clase de transformación

Girar()

Este método tiene muchas sobrecargas y es fácil de entender, y se usa más comúnmente en la rotación dinámica continua.

/* 
    objsTrans[]为多物体的Transform组件,下标从1开始
    direction为(0,0,36)、Speed为1;
    初始时,1、2、4物体的rotation=(0,0,0),3、5、6物体的rotation=(180,0,0),其余均为默认值
*/

// Rotate(Vector3 eulerAngles):以欧拉角旋转
objsTrans[1].Rotate(direction * Speed * Time.fixedDeltaTime);

// Rotate(Vector3 axis, float angle):绕axis轴,旋转angle度
objsTrans[2].Rotate(Vector3.forward, 36 * Speed * Time.fixedDeltaTime);

// Rotate(Vector3 eulerAngles, Space relativeTo):以欧拉角旋转,但参照的是本地坐标系
objsTrans[3].Rotate(direction * Speed * Time.fixedDeltaTime, Space.Self);

// Rotate(float xAngle, float yAngle, float zAngle):绕各轴旋转 X angle度
objsTrans[4].Rotate(0, 0, 36 * Speed * Time.fixedDeltaTime);

// Rotate(Vector3 axis, float angle, Space relativeTo):绕axis轴,旋转angle度,但参照的是本地坐标系
objsTrans[5].Rotate(Vector3.forward, 36 * Speed * Time.fixedDeltaTime, Space.Self);

// Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo):绕各轴旋转 X angle度,但参照的是本地坐标
objsTrans[6].Rotate(0, 0, 36 * Speed * Time.fixedDeltaTime, Space.Self);

RotateAround ()

// RotateAround(Vector3 point, Vector3 axis, float angle):绕穿过世界坐标中的 point 的 axis 旋转 angle 度
objsTrans[1].RotateAround(Vector3.zero, Vector3.forward, 36 * Speed * Time.fixedDeltaTime);

eulerAngles

La rotación (en grados) expresada en ángulos de Euler es una propiedad de tipo Vector3 .

// 设定物体的欧拉角(本质为四元数)为 (0,0,90)
objsTrans[1].eulerAngles = new Vector3(0, 0, 90);

Mirar()

Esta es una función de rotación de uso común, como enemigo, escena AI, etc. Su función es girar el objeto de forma que el eje Z siempre puntos al objeto de destino . Los parámetros target y worldPosition son la información del objeto objetivo. El parámetro worldUp es más especial e implica la restricción de su propio sistema de coordenadas y el sistema de coordenadas del mundo durante la rotación (consulte la comparación a continuación).

LookAt(Transform target);
LookAt(Vector3 worldPosition);  
LookAt(Transform target, Vector3 worldUp = Vector3.up);  
LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);  

Clase Quaternion

Los cuaterniones se utilizan para representar la rotación. Todas las rotaciones son del tipo Quaternion , lo que no es tan intuitivo como el tipo Vector3 de eulerAngles , pero no se ve afectado por el bloqueo universal y se puede interpolar fácilmente.

eulerAngles

Forma del ángulo de Euler de cuaternión, el método original de conversión al ángulo de Euler ToEuler()、ToEulerAngle()ha sido abandonado. .

Quaternion quaternion = new Quaternion { eulerAngles = new Vector3(0, 0, 90) };
objsTrans[1].rotation = quaternion;   // 直接设定物体的rotation(即四元数)为 (0,0,90)

AngleAxis

El uso es muy similar a la asignación anterior de rotación, que es esencialmente una función que crea y devuelve una asignación de cuaternión .

//Quaternion AngleAxis(float angle, Vector3 axis):绕 axis轴,旋转 angle 度
objsTrans[1].rotation = Quaternion.AngleAxis(90, Vector3.forward);

SetLookRotation ()

La función es similar Transform.LookAt(), pero tenga en cuenta que el parámetro Ver aquí no es la coordenada del objeto de destino, sino la diferencia de vectores entre los dos (el vector del objeto actual que apunta al objeto de destino). El significado de up es el mismo que worldUp mencionado anteriormente.

// SetLookRotation(Vector3 view);  
// SetLookRotation(Vector3 view, Vector3 up= Vector3.up);  
Quaternion quaternion = Quaternion.identity;
quaternion.SetLookRotation(objsTrans[2].position-objsTrans[1].position);
objsTrans[1].rotation = quaternion;	//使物体1看向物体2

LookRotation ()

El uso y el significado son los mismos SetLookRotation().

// LookRotation (Vector3 forward, Vector3 upwards= Vector3.up);
Quaternion quaternion = Quaternion.LookRotation((objsTrans[2].position - objsTrans[1].position), Vector3.up);
objsTrans[1].rotation = quaternion;

SetFromRotation ()

Comprensión intuitiva: hay un objeto 123, el objeto 1 está centrado en sí mismo y el vector 12 se gira en el vector 13; al igual que los tres objetos están en los tres puntos finales de la forma del abanico, el grado de rotación del objeto 1 es el ángulo central de la forma del abanico. Tenga en cuenta que la diferencia es LookAt()que el LookAt()método es que el eje z siempre apunta al objeto de destino, y este método es cambiar la dirección de la conexión virtual entre los 12 y 13 objetos, independientemente de a quién se enfrente el eje z.

// SetFromToRotation (Vector3 fromDirection, Vector3 toDirection):创建一个从 fromDirection 旋转到 toDirection 的旋转
Quaternion quaternion = new Quaternion();
quaternion.SetFromToRotation(objsTrans[2].position, objsTrans[3].position);	//设定初始和最终朝向坐标
objsTrans[1].rotation = quaternion;

Inteligente ()

Comprensión intuitiva: el objeto 1 cambia de la rotación del objeto 2 a la rotación del objeto 3 de interpolación.

// Quaternion Slerp(Quaternion a, Quaternion b, float t):在 a 和 b 之间以球形方式插入 t。参数 t 被限制在 [0, 1] 范围内
objsTrans[1].rotation = Quaternion.Slerp(objsTrans[2].rotation, objsTrans[3].rotation, Time.time);

Referencia

Supongo que te gusta

Origin www.cnblogs.com/SouthBegonia/p/12700062.html
Recomendado
Clasificación