Tengo un GameObject y algunos objetos que son sus hijos.
Voy a rotar este GameObject pero quiero predecir si alguno de sus hijos chocará, para poder evitar rotar. Para esto, necesito predecir la posición final de cada uno de los hijos antes de rotar al padre.
Estoy rotando al padre así:
transform.Rotate(x, y, z, Space.World);¿Cómo puedo predecir la posición final de cada niño después de esta operación de rotación?
Creo que resolví el problema. Usé esta función:
private Vector3Int RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles) { returnQuaternion.Euler(angles) * (point - pivot) + pivot; } Aparentemente gira un punto alrededor de otro en las coordenadas del espacio mundial, así que pasé la posición del niño en el point , la posición del padre en el pivot y un new Vector3(x, y, z) en los angles . El resultado parece ser la posición final del niño después de la rotación.
Se me ocurren 3 opciones:
1.- Puedes crear un conjunto de objetos de juego vacíos con la misma jerarquía que el objeto que pretendes rotar. El transform.Rotate(x, y, z, Space.World); aplicado a este objeto de juego paralelo daría a cada uno de los niños posiciones. Esto es similar a rotar el gameobject original, pero solo manejando una copia para tus predicciones, lo que no parece muy útil.
2.- La otra posibilidad que tienes es calcular tú mismo con transformaciones matriciales la transformación de rotación a todos los hijos de la jerarquía. Posible, pero bastante difícil sin la ayuda de todas las funciones de unidad y la transformación automática a lo largo de la jerarquía.
3.- Transform.RotateAround rota un punto en un ángulo determinado alrededor de un eje determinado. Para sus hijos determinados, puede simplemente con un objeto de juego vacío en la misma posición del mundo que el objeto de juego de niños con el que desea hacer su predicción, calcular su eje de rotación y rotar alrededor del punto de pivote, que es el padre máximo del objeto de juego original en el mundo de la jerarquía. posición. Puede hacerlo de inmediato si conoce su eje y su ángulo, o si está rotando alrededor de los 3 ejes como con transform.Rotate(x, y, z, Space.World); puede encadenar las 3 rotaciones con Transform.RotateAround aplicando las rotaciones de eulerAngles.z grados alrededor del eje z, eulerAngles.x grados alrededor del eje x y eulerAngles.y grados alrededor del eje y (en ese orden), como lo hace Transform.Rotate . El objetivo de esto es rotar el gameobject vacío con respecto a la posición principal máxima manualmente, imitando lo que haría la rotación automática por la propia jerarquía cuando se gira el gameObject principal máximo.
Espero haberme hecho entender