Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ficheros 3D y normales

Iniciado por Kherom, 12 de Febrero de 2012, 01:30:58 AM

« anterior - próximo »

Kherom

Saludos. Estoy aprendiendo a cargar modelos 3D desde ficheros .3DS y ya se cómo cargar la maya, pero no encuentro por ningún lado la información de las normales. ¿Sabéis si se almacena? ¿Y qué otro tipo de fichero podría utilizar que sí las guarde?

Por que si un icosaedro representa un icosaedro calcular las normales es fácil, pero si representa una esfera ya es más complicado, y en una malla más compleja todavía más, y tiene que haber una forma de que el editor 3D guarde esa información digo yo, pero encontrar la información me está costando.

Hechelion

Desconozco completamente lo relativo a ficheros 3ds, pero ¿has probado a mirar los ficheros de blender?

Al ser un proyecto open source, tienes acceso completo a toda la información sobre la estructura del fichero, con lo cual debería ser más fácil programar una herramienta que cargue su contenido.
http://wiki.blender.org/index.php/Dev:Source/Architecture

Kherom

Lo había pensado pero lo veo incluso más enrevesado :P He estado mirando por encima y no he encontrado ni los vértices, sólo información de la escena en general y de forma poco clara... Yo sólo quiero un formato binario con los vértices, sus normales, los índices de las caras y la información de las texturas :P

Por ejemplo éste otro formato (aparte de estar en modo texto, que no me gusta :P) tampoco contiene las normales:
*3DSMAX_ASCIIEXPORT 200
*COMMENT "AsciiExport Version  2,00 - Fri Feb 10 16:40:39 2012"
*SCENE {
*SCENE_FILENAME ""
*SCENE_FIRSTFRAME 0
*SCENE_LASTFRAME 100
*SCENE_FRAMESPEED 30
*SCENE_TICKSPERFRAME 160
*SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000
*SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000
}
*GEOMOBJECT {
*NODE_NAME "Box001"
*NODE_TM {
*NODE_NAME "Box001"
*INHERIT_POS 0 0 0
*INHERIT_ROT 0 0 0
*INHERIT_SCL 0 0 0
*TM_ROW0 1.0000 0.0000 0.0000
*TM_ROW1 0.0000 -0.0000 1.0000
*TM_ROW2 0.0000 -1.0000 -0.0000
*TM_ROW3 0.0000 0.0000 0.0000
*TM_POS 0.0000 0.0000 0.0000
*TM_ROTAXIS -1.0000 -0.0000 -0.0000
*TM_ROTANGLE 1.5708
*TM_SCALE 1.0000 1.0000 1.0000
*TM_SCALEAXIS 0.0000 0.0000 0.0000
*TM_SCALEAXISANG 0.0000
}
*MESH {
*TIMEVALUE 0
*MESH_NUMVERTEX 8
*MESH_NUMFACES 12
*MESH_VERTEX_LIST {
*MESH_VERTEX    0 -0.5000 0.0000 -0.5000
*MESH_VERTEX    1 0.5000 0.0000 -0.5000
*MESH_VERTEX    2 -0.5000 -0.0000 0.5000
*MESH_VERTEX    3 0.5000 -0.0000 0.5000
*MESH_VERTEX    4 -0.5000 -1.0000 -0.5000
*MESH_VERTEX    5 0.5000 -1.0000 -0.5000
*MESH_VERTEX    6 -0.5000 -1.0000 0.5000
*MESH_VERTEX    7 0.5000 -1.0000 0.5000
}
*MESH_FACE_LIST {
*MESH_FACE    0:    A:    0 B:    2 C:    3 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE    1:    A:    3 B:    1 C:    0 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE    2:    A:    4 B:    5 C:    7 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE    3:    A:    7 B:    6 C:    4 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE    4:    A:    0 B:    1 C:    5 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE    5:    A:    5 B:    4 C:    0 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE    6:    A:    1 B:    3 C:    7 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE    7:    A:    7 B:    5 C:    1 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE    8:    A:    3 B:    2 C:    6 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE    9:    A:    6 B:    7 C:    3 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE   10:    A:    2 B:    0 C:    4 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 7 *MESH_MTLID 2
*MESH_FACE   11:    A:    4 B:    6 C:    2 AB:    1 BC:    1 CA:    0 *MESH_SMOOTHING 7 *MESH_MTLID 2
}
}
*PROP_MOTIONBLUR 0
*PROP_CASTSHADOW 1
*PROP_RECVSHADOW 1
}


Y algún otro formato en modo texto que he estado mirando tampoco las contiene :S

blau

Voy a aventurar una respuesta y puede que no tenga que ver con los ficheros 3ds....


La información de las normales deberías poder sacarla perfectamente de los triángulos, coges dos vectores del triangulo y con un producto vectorial sacas la normal, porque supongo que los triángulos irán guardados con un orden horario o anithorario pero siempre el mismo.

:)

Kherom

Cita de: blau en 12 de Febrero de 2012, 09:26:53 PM
Voy a aventurar una respuesta y puede que no tenga que ver con los ficheros 3ds....


La información de las normales deberías poder sacarla perfectamente de los triángulos, coges dos vectores del triangulo y con un producto vectorial sacas la normal, porque supongo que los triángulos irán guardados con un orden horario o anithorario pero siempre el mismo.

:)

Si, si no me equivoco debería ser antihorario, pero es más tedioso y sobre todo me daría la normal de una cara, lo que es útil en el caso de un cubo, pero no de una esfera. Vamos que si la superficie del polígono es plana me sirve, pero si es curva con una normal por cara no se suavizaría correctamente, haría falta una normal por vértice y esas serían más complicadas de sacar.

nostromo

Hola,

El formato .OBJ  puede guardar las normales por vértice. Si no las tiene, puedes abrirlo con Blender y exportarlo con las normales, es una opción del exportador de Blender.

Lo de calcular las normales a mano también es una buena idea.  :)

Saludos,


blau

#6
Cita de: Kherom en 12 de Febrero de 2012, 09:38:47 PM
Si, si no me equivoco debería ser antihorario, pero es más tedioso y sobre todo me daría la normal de una cara, lo que es útil en el caso de un cubo, pero no de una esfera. Vamos que si la superficie del polígono es plana me sirve, pero si es curva con una normal por cara no se suavizaría correctamente, haría falta una normal por vértice y esas serían más complicadas de sacar.

Así a bote pronto, para sacarlas por vértice, acumulas las normales "normalizadas" por cada vértice y al final divides por el numero de normales que hayas acumulado en ese vértice. ;)

Kherom

Cita de: blau en 13 de Febrero de 2012, 10:59:15 AM
Cita de: Kherom en 12 de Febrero de 2012, 09:38:47 PM
Si, si no me equivoco debería ser antihorario, pero es más tedioso y sobre todo me daría la normal de una cara, lo que es útil en el caso de un cubo, pero no de una esfera. Vamos que si la superficie del polígono es plana me sirve, pero si es curva con una normal por cara no se suavizaría correctamente, haría falta una normal por vértice y esas serían más complicadas de sacar.

Así a bote pronto, para sacarlas por vértice, acumulas las normales "normalizadas" por cada vértice y al final divides por el numero de normales que hayas acumulado en ese vértice. ;)

Si y no, funcionaría a medias, no se cómo se hace en motores comerciales y demás, pero ese método podría funcionar sólo hasta cierto punto, con esa técnica se mostraría bien una esfera pero no un cubo, y según que superficies se mostrarían sólo regular. Por ejemplo (Dibujo en plan cutre xD):



Siendo A la figura original con las normales en cada punto en rojo, lo que yo quiero en un modelo 3D con un perfil como B, y lo que dices daría algo como C, las normales serían perpendiculares a las caras planas y en la cara curva habría 2 normales distintas (En 3D habría 3) lo que harían que quedase siavizada. La verdad no tengo ni idea de cómo se suele hacer, pero no estaría mal que un editor 3D guardase las normales de la forma correcta (dando a las curvas sus normales correctas).

blau

Ejem...

creo que o tienes la superficie A o la B

tanto en A como en B el método que te describí funciona igual, ten en cuenta que para conseguir la A, tienes que tener muchos triangulitos pequeños, si le aplicas el método te sale lo mismo que tu dibujas en A.

Otra cosa es que hagas un mapa de normales para el modelo, pero eso iría en una textura aparte y no tiene nada que ver.

Un saludo.


Kherom

No, haciendo lo que dices se puede o obtener el modelo facetado o obtener algo como C con la suma de normales, pero lo de B no se puede conseguir, o te queda facetado o te queda como en C. Aunque por lo que estoy viendo lo normal es seguir C o hacerlo facetado, pero a mí me gustaría una información más precisa de cada normal. Ten en cuenta que si sumas las normales en cada vértice las normales de los vértices inferiores de la cara inferior no coinciden con las superiores, con lo que o representas curvo todo el objeto o lo representas plano entero.

blau

Si quieres lo de B no compartas vértices. ;)

Kherom

#11
Cita de: blau en 14 de Febrero de 2012, 12:33:37 AM
Si quieres lo de B no compartas vértices. ;)

Si no comparto vértices al sacar las normales de la cara intermedia no van a salir esas y no va a quedar suavizado, y si los comparto la cara intermedia va a quedar medio suavizada y las otras 2 caras también xD

Vamos, que el problema está en que es imposible saber si una cara es curva o plana si el fichero no te lo dice, por lo que o tratas todas como planas o tratas todas como curvas, no hay medias tintas, no puedes saber si un icosaedro es un icosaedro o una esfera sólo con la información de los vértices, necesitas algo más.

TrOnTxU

Creo que nadie calcula las normales "al vuelo" al cargar el modelo.
Si quieres "compresion" al menos guarda las coordenadas polares.

Por lo que veo tardarias menos utilizando un formato binario propio.
Nada complicado. Una cabecera con el tipo de datos (tipo de vertices, tipo de indices, attributos de los vertices), el tamaño de los buffers(vertices e indices).

Con un par de structs y un par de funciones lo tienes.

El exportador es otra cosa. Si no quieres hacerte uno propio exporta desde el paquete de modelado a Collada o FBX. Luego con una aplicacion de linea de comandos lo conviertes a tu formato. Existe open collada y el sdk de fbx para facilitarte la vida (aunque a veces parece en que te la hacen imposible). Tambien puedes mirar el source de Horde3d, el "ColladaConverter" tiene su propio "lector de Collada", es bastante "lightweight" y es OpenSource.

Como ultima opcion (que suele ser la bomba), es crearte tu exportador que lea directamente de los archivo Maya o 3dsmax. Pero eso es ya mas curro, y Collada y FBX los puedes exportar desde practicamente cualquier paquete de modelado.


Como ultima opcion (que a mi no me agrada demasiado) esta el formato .x (si es que aun existe) de DX.
Y seguro que alguno más habrá por ahi.


Espero haber sido de alguna ayuda. :)
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!

Kherom

#13
Gracias, lo de el formato propio es algo que haría seguro, mucho más cómodo, de hecho la idea (en un futuro incierto) es hacerme mi propio editor y guardar todos los datos de los escenarios en un fichero propio. Pero primero necesito la información desde el editor 3D por lo que tengo que pasar por sus ficheros si o si (no se cómo exportar a mi propio formato desde Blender o 3D Max), ¿Es muy complicado? En el .3DS no he visto las normales y en otros las  he visto pero sólo por cara, echaré un vistazo a los que me dices.

Respecto a que nadie calcula las normales "al vuelo" en algún código lo he visto xD Yo lo he hecho hace un rato y cada cara me ha salido como le ha parecido xDDD Creo que es por el orden de los vértices o así, aún no he probado más :P

EDIT: Acabo de guardar un FBX en ASCII y parece que es justo lo que necesitaba, permite elegir lo qué guardar, invertir el eje y y el z y contiene todas las normales  :D Aunque parece un poco complicado con muchos datos que no me interesan pero bueno, el 3DS también lo era y ya lo leí xD

TrOnTxU

#14
* Calcular normales al vueldo:
Las normales se pueden modificar desde el editor por una razon. Los grafistas pueden "jugar" con ellas. Por eso no tiene por que existir una normal "perfecta", hay una normal "por defecto", pero la idea es que se pueda poner la normal que se quiera (siempre normalizada, claro).
Al menos eso es lo que yo tenia entendido, por eso exporto las normales.

* Exportador:
Exportar a tu propio formato directamente desde el el paquete de modelado no lo recomiendo por varias razones.

Complicado o no depende de como lo hagas:
- En Maya/Max lo puedes hacer en c++, como un plug-in utilizando el sdk de cada uno.
- En maya ademas puedes hacer un plug-in en python.
- En max ademas con maxScript puede acceder a la informacion de todos los vertices.
- En blender ni idea, pero supongo que "python rules".

Problemas que veo al exportar desde el modelador, que no tienes al leer un FBX/Collada:
- Un exportador por paquete de modelado.
- Diferentes SDKs/lenguajes para cada paquete.
- Seguramente tendras que triangular (aunque generalmente hay un comando en todos los paquetes para hacerlo)


Mi posición:
Sigo pensando que lo más rapido para ver resultados es convertir desde FBX o Collada. Y si en un futuro quieres saltarte el paso de exportar a collada desde el programa de modelado, lee directamente el binario .max o .mb.
Otra solución para saltarte la exportacion es uitlizar scripts de maya o max e invocar estos progrmas para que exporten a tu formato intermedio, como hace Unity3d.

Pienso que es mucho más comodo procesar las mayas y convertirlas a tu formato desde una aplicacion de consola que desde un "exportador".
Las razones principales son que no necesitas el programa de modelado en la maquina que esta compilando los "assets" o "recursos".
Y que lo puedes poner en un server a modo de "farm", comprobando cuando hay subidos cambios en el content repository, y de ahi vas compilando los recursos que hagan falta.
Y demás tonterias que se me ocurren.

Pero igual la que te importa es que creo que acabarias antes:
1) instalandote un exportador de collada en tu programa de modelado
2) bajando el Horde3d
3) cogiendo la aplicacion "colladaConverter" de Horde y modificando el metodo "exportGeometry" de la clase converter para exportar a tu propio formato
4) aprovechando el tiempo que te has ahorrado para hacerte una cerveza con tus amigos :)

Además creo que si te lo montas bien puedes hacer tu exportador cada vez menos dependiente del ColladaConverter de Horde, y acabar con una libreria de exportación propia (pasito a pasito claro).

Un saludo

[EDIT]
No habia visto el EDIT de que ya tienes lo de FBX, ups  ^_^'

El ASCII de FBX viene bien para ver el contenido. Pero quizás te interese utilizar el SDK de FBX que hay en la pagina de Autodesk.
Hay que aprender, pero te puede ahorrar esfuerzo, y ademas podras leer FBX binarios tambien :)

Vicent: Linked-In  ***  ¡¡Ya tengo blog!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.