Importe modelos 3D a Unity y trampas

Este es el tercer artículo de nuestra serie sobre cómo trabajar con modelos 3D en Unity. Artículos anteriores: "Características de trabajar con Mesh in Unity" y "Unity: edición de procedimientos de Mesh" .

En el mundo de los gráficos por computadora, existen muchos formatos para presentar modelos 3D. Algunos de ellos se posicionan como universales, otros como optimizados para tareas o plataformas específicas. En cualquier campo, sueñan con trabajar con un formato universal, pero la realidad nos dice que no. Además, dicho zoológico forma un círculo vicioso: los desarrolladores de herramientas "universales" crean sus propios formatos internos para resumir los anteriores, aumentar la población y crear medios para convertir formatos. Por lo tanto, hay un problema de pérdida de datos o distorsión durante la conversión. El problema es tan antiguo como el mundo (el mundo de TI, por supuesto), y no omitió la importación de modelos en Unity .

En este artículo, hablaremos sobre algunas de las dificultades con las que tenemos que lidiar cuando trabajamos con modelos en Unity (especialmente el funcionamiento de ModelImporter , la diferencia en las representaciones de objetos 3D, etc.), así como las herramientas que creamos para superar estas dificultades.



Características de ModelImporter


Recuerde que para la API de la tarjeta de video, la primitiva mínima y solo tridimensional es un triángulo, mientras que la geometría en FBX , por ejemplo, se puede representar como cuadrángulos. Los paquetes 3D modernos para crear modelos, por regla general, permiten diferentes niveles de abstracción, pero incluso allí la representación del resultado se produce a través de triángulos.

Al mismo tiempo, muchas herramientas están orientadas a trabajar con cuadrángulos, lo que alienta a los artistas 3D a usar esta primitiva como la principal. En tales casos, los conocimientos tradicionales a menudo requieren triangular el modelo antes de la implementación. Si no se realiza la triangulación, el módulo de Unity correspondiente en modo estándar lo realiza automáticamente cuando se agrega un archivo. Debido a esto, aparecen errores, ya que los algoritmos de triangulación se implementan de manera diferente en diferentes paquetes. Al elegir una diagonal para dividir un cuadrángulo, surge la ambigüedad, de ahí la mayoría de los problemas que se pueden dividir en dos grupos.

El primero está relacionado con la corrección de la visualización del formulario del modelo. Entonces, la forma de un cuadrángulo no plano depende directamente de la elección de la diagonal.


Susanna triangulada en Blender (Método Quad: Belleza) y Unity (automáticamente al importar)

Además, el algoritmo de horneado de mapa normal utiliza datos divididos, debido a que la diferencia en la triangulación puede dar lugar a artefactos en forma de una cruz en el resplandor.


Scooter de hombre sano y scooter de fumador

Los problemas del segundo grupo se encuentran en el escaneo de texturas. Por ejemplo, tenemos un cuadrángulo con un ángulo lo suficientemente obtuso como para que ocurra un error. Cuando se previsualiza en un paquete 3D, se divide por una de las diagonales en dos triángulos completamente plegables.


Polígono fuente


Polígono triangulado en Blender

Sin embargo, después de importar al proyecto, se descubre que este cuadrángulo está roto por otra diagonal y que uno de los triángulos está generalmente degenerado o cerca de eso.


Un polígono en Unity con un triángulo cercano a un degenerado (el triángulo rectángulo es casi indistinguible de un segmento)

La razón de los problemas asociados con la degeneración de los polígonos son los errores en los cálculos de coma flotante, así como las peculiaridades de la interpolación de píxeles durante el renderizado. Qué demonios sucede con tales triángulos: se contraen, cada cuadro cambia de color. La dimensión transversal extremadamente pequeña crea dificultades en el procesamiento de la luz, por lo que partes de objetos dinámicos pueden parpadear. Y en el no determinismo de hornear el mapa de iluminación, tampoco hay nada bueno.

Soy un paquete 3D, tal como lo veo




En el modelado 3D, a menudo hay una diferencia entre el número real de vértices y su número en un paquete 3D. La esencia del problema radica en la información que se requiere para el procesamiento de la tarjeta de video. La estructura de datos para el vértice está predefinida e incluye la posición, normal, tangente, coordenadas de escaneo de textura para cada canal y color. Es decir, dos normales no se pueden empujar en un vértice.

Para algunos artistas, no siempre es obvio que el pico está determinado no solo por su posición. Los modeladores conocen bien los conceptos de bordes duros / blandos y costuras UV , pero no todos entienden cómo se implementan mediante programación. Además, los paquetes 3D son confusos, lo que en el modo estándar muestra la cantidad de vértices como la cantidad de posiciones únicas.

Entonces, la primitiva de cubo usual está representada geométricamente por 8 vértices. Sin embargo, para transmitir correctamente el reflejo de la luz de cada cara y aplicar correctamente la textura, en cada esquina del cubo, 3 vértices con la misma posición, pero son necesarias diferentes normales y coordenadas de textura, ya que convergen 3 bordes en cada esquina. Un pequeño bloque de documentación se dedicó a este momento. Allí puedes ver ejemplos.


Blender Cube Metrics


Métricas del cubo de la unidad

Basta!


Ante estos y otros problemas similares, decidimos crear una herramienta de análisis y validación de modelos al importar a un proyecto de Unity . En otras palabras, un validador personalizado, que en la solicitud "Eat!" respuesta: "¡No lo haré! Rehacer ", o escupir conjuntos de advertencias y los valores de varios parámetros, notificando que algo le sabe mal.

Para el análisis y la verificación, desarrollamos la siguiente funcionalidad:

  • contando el número de posiciones únicas de vértices, vértices coloreados, bordes duros , costuras UV ;
  • Cálculo del cuadro delimitador alineado por eje (AABB) y su centro;
  • determinación de la salida de las coordenadas de la exploración UV más allá del rango de 0.0–1.0;
  • definición de superposición de textura;
  • comprobar el escaneo de textura para determinar la idoneidad de la sangría de píxeles especificada para una resolución de textura dada.

¿Qué nos da esto?

Es necesario contar el número de posiciones únicas de vértices, bordes duros, costuras UV y vértices de colores para verificar que el modelo del artista se haya importado a Unity . Esta funcionalidad también le permite controlar el cumplimiento de los requisitos para optimizar el modelo (por ejemplo, para que el número de vértices no exceda un cierto valor). Debido a la misma peculiaridad de los paquetes 3D, que de hecho muestran el número de posiciones únicas, hay casos en que la métrica del número de vértices en el editor de modelos satisface esta restricción, pero después de agregar el archivo al proyecto, puede resultar que esto no sea así.

Cálculo de AABB y su centro : le permite determinar el desplazamiento del modelo en relación con el comienzo de su propio sistema de coordenadas. Esto es necesario para el posicionamiento predecible de los activos que se inicializan en la escena mientras se ejecuta la aplicación. Por lo tanto, el AABB del edificio en el buen sentido debería tener minY = 0, y algún candelabro que esté unido al techo - maxY = 0.







Salga de las coordenadas de los vértices de la exploración UV para el rango 0.0–1.0 , en la mayoría de los casos (por ejemplo, si la textura debe ser en mosaico en el modelo) se proporciona. A menudo, este enfoque se utiliza para representar en la escena una multitud de objetos pequeños poco detallados (vegetación) y / o ubicados en la distancia, así como también enlosar grandes objetos homogéneos (edificios). En el caso de mosaico, los valores de coordenadas de un canal UV específico simplemente se cortan en la parte completa al nivel del sombreador, si el Modo de ajuste de la textura está configurado en Repetir .

Imagina ahora que colocaste la textura en satén (y la cubriste con una manta: 3). Las coordenadas ya convertidas correspondientes al atlas (x * escala + desplazamiento) llegarán al sombreador. Esta vez, muy probablemente, no habrá una parte entera y no habrá nada que recortar, y el modelo se subirá a la textura de otra persona (la manta resultó ser pequeña). Este problema se resuelve de dos maneras.

El primero supone que corta la parte entera en las coordenadas de barrido de antemano. En este caso, existe la posibilidad de superposición de polígonos, que discutiremos a continuación.

El segundo se basa en el hecho de que el mosaico de texturas es inherentemente un método de optimización. Nadie le prohíbe aumentar el tamaño y probar la pieza deseada para todo el modelo. Sin embargo, de esta manera, el espacio utilizable del atlas se utilizará de manera ineficiente.



Las superposiciones en un escaneo de textura a menudo tampoco son aleatorias: son necesarias para usar áreas de textura de manera efectiva. Sucede que un novato comete un error, un compañero mayor lo ve, pronuncia una palabra fuerte y un novato ya no lo hace. Pero sucede que la superposición es tan pequeña y se encuentra en un lugar tan inesperado que el camarada mayor puede no darse cuenta.

En el equipo experimental, los errores que no se detectaron en el escaneo base entran al proyecto un poco más a menudo que nunca. Otra cosa es cuando cambian las condiciones para usar contenido listo.

Un ejemplo Trabajamos con un conjunto de modelos para objetos dinámicos en el juego. Como no había problema para hornear la luz para ellos, se permitieron superposiciones en la exploración UV .


Un ejemplo de una exploración UV básica con superposiciones (se muestra en rojo)

Sin embargo, decidimos no usar estos modelos como dinámicos, sino colocarlos como una decoración estática en un nivel. Para la optimización, como saben, la iluminación de objetos estáticos en una escena se cuece en un atlas especial. Estos modelos no tenían un canal UV2 separado para el mapa de iluminación , y la calidad del generador automático en Unity no nos convenía, por lo que decidimos usar el escaneo de textura básico para hornear con la mayor frecuencia posible.

Aquí, había problemas obvios con la corrección de la iluminación. Obviamente, los rayos que entran en una estatua en el ojo no deberían crear resplandor en el quinto punto en la parte posterior de la cabeza.


Iluminación del modelo incorrectamente horneada (izquierda) y corregida (derecha)

Al crear un mapa de iluminación, Unity trata principalmente de usar el canal UV2 . Si está vacío, entonces se usa el UV principal, si este está vacío, entonces discúlpeme, pero esta es una excepción. Hay dos formas de hornear modelos en un mapa de luz sin UV2 previamente preparado en Unity .

Como el primero, Unity ofrece generación automática de UV2 basada en la geometría del modelo. Esto es más rápido que hacerlo manualmente, además, esta herramienta se puede configurar usando varios parámetros. Pero incluso a pesar de esto, la superposición resultante de claroscuro a menudo es insatisfactoria para objetos muy detallados debido a costuras y fugas en los lugares equivocados, y el empaquetado de partes de tal barrido no es el más efectivo.



La segunda forma es usar una exploración UV básica para hornear. Una opción muy atractiva, porque cuando se trabaja con un escaneo de textura, hay menos posibilidades de cometer un error que cuando se trabaja con dos. Por esta razón, tratamos de minimizar la cantidad de modelos que tienen superposiciones en la base UV . Las herramientas creadas nos ayudan a hacer esto.

Verificar el escaneo de textura para determinar la idoneidad de la sangría de píxeles especificada en una resolución de textura dada es una validación UV más precisa basada en la rasterización. Se describirá más sobre este método en el próximo artículo de la serie.

Para resumir. Por supuesto, es casi imposible rastrear todos los matices: a veces hay que soportar la imperfección del resultado para completar la tarea a tiempo. Sin embargo, la identificación de incluso una parte de tales deficiencias permite acelerar el desarrollo del proyecto y mejorar su calidad.

Source: https://habr.com/ru/post/447820/


All Articles