Rotando un objeto sobre su propio centro en Unity

Unity y yo

Hola a todos. Hoy añado al blog una nueva tecnología en la que he estado trabajando el último año. Es Unity, un motor de juegos que puede hacer muy fácil crear un juego cotidiando y, además, ofrece un conjunto de herramientas con alto potencial para crear proyectos más complejos. Un ejemplo actual sería el videojuego Yooka-Laylee de Platonic Games que ha sido creado usando este motor y ha sido mundialmente famoso y lanzado para múltiples consolas.

Actualmente, estoy usando el motor para crear aplicaciones de Realidad aumentada para la compañía en la que actualmente trabajo: ANSWARETECH. Y mientras lo voy usando me estreso con problemas que cuya solución iré comentando en otros artículos del blog.

Rotando el objeto

Bueno, no me extenderé más y pasaré a lo que importa. Estaba intentando hacer rotar un modelo 3D en formato OBJ que cargué dinámicamente en tiempo de ejecución desde un servidor web usando el paquete Simple .OBJ y le añadí a un Trackable Object de Vuforia, que es lo que nos permite crear la experiencia de realidad aumentada sobre un marcador.

Tras conseguirlo, decidí que sería chulo ofrecer la posibilidad de interactuar un poco con el modelo 3D, por lo que empecé añadir botones de transformación: escalar+, escalar-, rotarX, rotarY (lo siento, no hay rotarZ).

Pero encontré algunos problemas con el resultado de las rotaciones, por lo que tras estar probando y jugando con alternativas y funciones como Transform.Rotate, Transform.RotateAround, los Quaternion de Transform.rotation… Tuve la idea de crear un GameObject vacío para situarlo justo en el centro de mi modelo 3D, hacer el modelo su hijo y apliar las transformaciones sobre el padre cómodamente olvidandome de los problemas de mi maldito OBJ que no estaba bien alineado en 0,0,0.

Así que finalmente conseguí lo que deseaba usando un código como este:

using UnityEngine;
using System.Collections;

// ...

public static class Load3D {

// ...

    public void loadModel() {
    // ... En mi función de carga del modelo 3D

        model.transform.parent = marker.transform; //model es mi modeloObj. Marker es el objeto de Vuforia

        model.transform.rotation = new Quaternion(0,0,0,0); //Resetea la rotación del objeto tras añadirlo al padre

        Vector3 objCenter = model.GetComponent<Renderer>().bounds.center;

        GameObject container = new GameObject(); //Creo el objeto padre vacío

        container.transform.parent = marker.transform;

        container.transform.rotation = new Quaternion(0,0,0,0);

        container.transform.Position = objCenter;

        model.transform.parent = container.transform;
    }

    public void RotateMyModel() {
        // ... En mi función de rotación
        model.transform.parent.Rotate(Vector.up * 90);
        //o
        model.transform.parent.Rotate(Vector.right * 90);
        //o
        model.transform.parent.Rotate(Vector.forward * 90);
    }
}

 

Bien, y eso es todo.

Espero que ayude a alguien y evita algunos dolores de cabeza.

¡Que pases un buen día programando!

Web/mobile developer and JavaScript lover. Future project manager. Just living happy coding, playing music and enjoying my limited time.