jueves, 12 de enero de 2017

TIP#2. Solución al problema de los ejes entre Blender y Unity.

Seguimos con nuestra nueva sección de tips con un problema bastante molesto que nos hemos encontrado al trabajar con el software que usamos.

Para los más despistados, blender es un programa de código libre que sirve para modelar objetos 3D y animarlos (eso a grandes rasgos, porqué hace mucho más :D).

Una de las ventajas realmente buenas que tiene unity es que puedes importar archivos creados en blender de manera fácil, simplemente arrastrando el archivo .blend dentro de la carpeta del proyecto de unity.

Pero uno de los primeros problemas que uno se encuentra cuando hace esto, es que los ejes de coordenadas XYZ que vienen por defecto de blender no coinciden con los ejes de unity. Para concretar, el eje vertical en blender es el Z mientras que en unity es el Y; y el eje Y en blender es el -Z en unity. Un lío vamos. Esto conlleva que una vez importado el objeto dentro de unity, los ejes locales del objeto no coinciden con los ejes globales de la escena.

En la siguiente imagen se muestra el problema. Es un objeto que se ha importado tal cual a unity. Este objeto tiene varios subobjetos (el bloque de casas, la acera, etc.). Si seleccionamos todo el objeto en si (el objeto padre) los ejes coinciden con los de unity, pero si en cambio seleccionamos uno de los subobjetos, vemos que no, tal y como se muestra en la imagen.
Imagen de los ejes del objeto sin aplicar ninguna corrección.

Aunque pueda parecer un problema insignificante para un objeto de este tipo, realmente puede traer muchos dolores de cabeza para otro tipo de objetos. Pongamos que en lugar de unas casas queremos importar un coche, el cual luego moveremos por programación a partir de un script. Si los ejes no coinciden con los de unity, intentar mover el coche aplicando los vectores de físicas será un auténtico calvario.

Unity por defecto no tiene una solución a este problema, así que cada uno se tiene que buscar la vida para encontrar la manera de solventarlo. En nuestro caso, después de buscar bastante y probar varias cosas, dimos con un script para unity que corrige este error automáticamente.

El autor del código tiene como apodo Edy y ésta es la página en cuestión dónde comenta este problema.

Además enlaza a la página dónde se puede descargar el script y dónde también hay las instrucciones de uso, aunque es bastante sencillo de utilizar.

En nuestro caso, para facilitaros un poco el trabajo, os comentaremos por pasos como debéis aplicar el script y cómo tenéis que configurar unity para que funcione automáticamente. Así que vamos a ello.
  1. Ir a este enlace y hacer clic al botón verde de arriba a la derecha para descargar en formato ZIP el archivo.
  2. Dentro del archivo descargado veremos que hay una carpeta llamada Editor. Debemos copiar esta carpeta a la raíz de nuestro proyecto de unity.
  3. Finalmente, debemos editar el nombre de la carpeta de nuestro proyecto donde importaremos los archivos .blend y añadir al nombre la palabra [importer]. De este modo, todos los objetos que arrastremos dentro de esta carpeta serán tratados y corregidos automáticamente por el script.
Para que veáis como queda la carpeta del proyecto después de estas modificaciones os mostramos una captura de pantalla del resultado.
Árbol de carpetas de nuestro proyecto en Unity.
Aunque esto ya va a gustos de cada uno, normalmente dentro de la carpeta Assets se crea una nueva carpeta Prefabs dónde se incluye todos los prefabs del proyecto, los cuáles son los objetos 3D importados de blender. En este caso hemos renombrado esta carpeta a Prefabs [importer] para que cada vez que arrastramos un archivo .blend dentro de esta carpeta, aplique la corrección de ejes automáticamente.

Ahora sí, una vez importado nuestro objeto de ejemplo, si comprobamos los ejes del mismo subobjeto de la primera captura vemos que estos coinciden con los de unity, tal y como se muestra en la siguiente imagen.
Imagen de los ejes del objeto luego de aplicar la corrección del script.
Eso es todo! Solo cabe darle las gracias a Edy por su gran trabajo haciendo este código y sobretodo, por compartirlo con la comunidad de unity. Cosas como estas se valoran mucho.

Esperamos que os haya sido útil :).

No hay comentarios:

Publicar un comentario