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?
Respuestas:
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ó.
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.
Í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.
fuente
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.
fuente