¿Cómo reduce Unity3D un recuento de vértices .obj importados?


8

Tengo una pregunta sobre cómo Unity3D maneja la importación de archivos .obj. Estoy importando esta tetera: http://groups.csail.mit.edu/graphics/classes/6.837/F03/models/teapot.obj

El número de vértices que tiene esta tetera es 3644. Sé que la clase Mesh de Unity necesita replicar estos vértices para cada cara compartida por el mismo vértice. Intenté esto con un cubo importado de un .obj, y usando Debug.Log () para imprimir la cantidad de vértices descubrí que había 24 vértices en la matriz de vértices de la malla.

Sin embargo, con la tetera, el archivo original tenía 3644 vértices, por lo que en Unity el conteo de vértices debería ser 18960. En cambio, cuando imprimo la longitud de la matriz de vértices de la malla, imprime 3260 (incluso menos que el archivo original).

El objetivo final de esto es que estoy tratando de modificar una secuencia de comandos OBJ Importer de Unity's Wiki, para que la cantidad de vértices resultantes de esta secuencia de comandos sea la misma que la del importador nativo de Unity. Referencia: http://wiki.unity3d.com/index.php?title=ObjImporter Nota: Imprimí el conteo de vértices con este importador y el resultado fue 18960.

¿Alguien tiene una idea de cómo se podría lograr esta reducción de vértices?


Algoritmos complejos, no estoy seguro de qué unidad utiliza, pero puede encontrarlos en línea.
MickLH

Respuestas:


5

Hay varios factores que contribuyen a cómo se guarda y procesa la geometría en diferentes medios (programas, formatos de archivo, API). Implementé varios programas comerciales de análisis de geometría, así que tengo algo de experiencia con él.

Primero, estoy seguro de que esto no tiene nada que ver con que Unity simplifique nada. Pero en caso de que lo haya hecho, hay varios algoritmos de diezmado que se pueden implementar, pero estoy seguro de que este no es el caso, ya que se supone que un motor de juego no cambia la forma (propiedades geométricas de una malla), pero generalmente puede modificar su conectividad. para que coincida con su estructura óptima.

Algunos de estos factores son:

¿Qué hace que un vértice sea único?

Esto puede variar mucho según cómo el programa, la api o el formato de archivo manejen un vértice. Un vértice puede ser único si tiene una posición única, pero en otros casos es único si tiene algún atributo único. Por ejemplo, si dos vértices comparten la misma posición, pero tienen normales diferentes, deberían "duplicarse" en el caso de OpenGL, esto es especialmente evidente en el caso del cubo que mencionó.

ingrese la descripción de la imagen aquí Bordes duros vs lisos.

Las normales pueden dictar si un borde se considera duro o liso, si un vértice contribuye al borde duro, entonces debe duplicarse para que las API de renderizado actuales puedan entender cómo renderizar (sombrear) esta cara correctamente.

ingrese la descripción de la imagen aquí

Índices

Muchos formatos de archivo permiten que un vértice de la cara tenga varios índices para la posición del vértice / texCoords / normals, este no es el caso de las API de renderizado actuales. Un buen ejemplo de esto es el archivo Obj, esto obligará a Unity a reconstruir los índices y, a menudo, duplicará muchos atributos para que coincidan con los índices de vértice.

Conectividad

Muchos de los vértices que están realmente conectados y son únicos se guardan varias veces, esto tiene que ver con cómo el escritor original de archivos procesó y guardó la malla. La unidad reducirá la cantidad de vértices duplicados (recuerde que si tiene un atributo diferente, entonces no es único) para que sea más eficiente para el almacenamiento y el procesamiento sin sacrificar la calidad.

Esto también tiene que ver con la cantidad de polígonos que permite el archivo original, Obj por ejemplo permite polígonos del lado N, algo que ningún motor de juegos cuerdo no quiere, por lo que termina triangulando la malla y recalculando muchos de sus atributos que a menudo Cambia el número de vértices.


¡Oh Ahora lo entiendo! En el importador .obj que utilicé, los vértices siempre se duplican para cada cara en la que se usan, y es por eso que siempre obtengo bordes duros en mi tetera (no lo he mencionado antes porque pensé que era un problema diferente). ¡Gran respuesta!
VitorOliveira

2

Los formatos de obj son extraños en particular porque las posiciones, las normales y las coordenadas de textura están separadas y cada cara puede elegir el índice de cada flujo. Cuando se refiere al recuento de vértices, piensa que las posiciones de vértices y el recuento de normales no son lo mismo y realmente no puede referirse al recuento completo.

Durante la carga, estos tres atributos deben fusionarse para que una posición de vértice pueda terminar duplicada porque la cara asociada a esa posición de vértice está asociada a dos normales . Esto también puede ocurrir a la inversa, por lo que la mayoría de los cargadores tienen un paso para optimizar el obj, pero en el caso de su cubo, la optimización no funcionará, ya que el cubo tiene bordes duros y cada vértice tiene una coordenada normal (o de textura) diferente. Es por eso que contó 6 posiciones de vértice pero la unidad duplicó esas posiciones dando como resultado 24 vértices.

Para cargar una malla, puede duplicar posiciones / normales o coordenadas de textura, por lo que optimizar esto no es algo simple. Se reduce a elegir el número mínimo de duplicados de esas tres transmisiones.


Esta respuesta fue un gran complemento de lo que dijo concept3d, y me ayudó a entender este problema. Así que supongo que por ahora mi importador .obj siempre tendrá bordes duros, pero si quiero mejorarlo, debería buscar algoritmos que me ayuden a saber qué vértices deberían duplicarse o no, para tener un modelo de bordes suaves con un mínimo ( o al menos optimizado) recuento de vértices.
VitorOliveira
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.