Pregunta

Estoy haciendo un renderizador usando OpenGL. Tengo modelos texturizados en Blender / Sketchup (puedo intercambiar entre los dos fácilmente), y me gustaría poder exportar esos archivos a mi renderizador. Mi idea inicial era simplemente exportar las caras sin procesar y renderizar esos triángulos, pero también me gustaría cortar fácilmente mis archivos de textura en coordenadas de textura.

Con eso, quiero decir que mis caras modelo se tallan en triángulos. Puede ver en esta imagen (reproducida a continuación) que mi curva se convierte en 24 triángulos. Me gustaría saber qué coordenadas de textura usar para cada triángulo.

Objeto 3D curvo poligonalizado

¿Sería un archivo DAE la forma más fácil de hacerlo? He estado leyendo las especificaciones para el formato y parece bastante fácil. Creo que podría analizar el XML y recrear fielmente los modelos en OpenGL. Me pregunto si hay una manera más fácil (es decir, una que no reinvente la rueda).

¿Fue útil?

Solución

Si te sientes cómodo analizando el formato .dae, seguro que lo usas. Sin embargo, si solo está interesado en exportar mallas triangulares texturizadas, consideraría usar el formato .obj que es mucho más fácil de analizar. Por lo que puedo decir, tanto Sketchup como Blender pueden exportar este formato.

Otros consejos

Si los formatos binarios no te asustan, te sugiero que escribas un Blender & amp; Sketchup plug-in y exportar la geometría precocida en matrices de vértices empaquetadas.

Lo bueno de este método es que no hay análisis ni conversión de tipos en su aplicación. Todo está listo para ser enviado a la GPU en simples copias de memoria contiguas. Ideal para geometría estática.

Un exportador de licuadoras simplificado se parece a esto:


#!BPY
import bpy, struct
from Blender import *

self.fh = open("MyFileName", "w")
m = bpy.data.meshes["MyMeshName"]
faces = m.faces
for face in faces:
    for (vertex, uv) in zip(face.verts, face.uv):
        self.fh.write(struct.pack('<fff', *vertex.co)) # coords
        self.fh.write(struct.pack('<fff', *vertex.no)) # normals
        self.fh.write(struct.pack('<ff',  uv.x, uv.y)) # uvs

self.fh.close()

Si desea analizar archivos .dae , le sugiero que busque en analizadores Collada . .dae es en realidad la extensión de los archivos Collada, el último esfuerzo del grupo Khronos (mantenedores de OpenGL) para tener un único formato de archivo unificado para el intercambio de datos en 3D.

En cuanto a los analizadores existentes, esto es lo que he encontrado:

  • collada-dom , la implementación de referencia. Como su nombre lo indica, es solo una abstracción del árbol XML.
  • FCollada , una mejor abstracción. Sin embargo, este proyecto lleva muerto casi dos años y, por lo que he reunido, es poco probable que veamos alguna actualización en el futuro.
  • OpenCollada , un nuevo esfuerzo reciente. No lo he probado, pero hay una comunidad activa detrás de él.

Dicho esto, si su único objetivo es cargar una pieza simple de geometría con vértices, normales y coordenadas de textura, ir con el formato de archivo .obj podría ser una forma más rápida.

Cualquier formato de archivo decente utilizado por los programas de modelado (como Blender o Sketchup) incluirá toda la información necesaria para recrear la geometría que ve. Esto debe incluir el tipo de geometría (por ejemplo, tiras triangulares, triángulos individuales, etc.), los vértices y las normales para la geometría, las propiedades del material utilizadas y también las texturas utilizadas junto con las coordenadas de textura apropiadas. Si falta algo de un formato de archivo potencial, elija otro.

Si cree que analizar XML es simple, entonces espero que esté planeando usar bibliotecas existentes para hacer esto, como expat, Xerces o alguna otra implementación específica de lenguaje.

Cuando considere importar / exportar, primero intente encontrar una biblioteca de código abierto que pueda manejar la importación por usted y hacer que los datos estén disponibles para su programa en un formato razonable. Si eso no está disponible y debe escribir su propio importador, intente encontrar un formato ASCII ( no basado en XML ) o binario simple que se ajuste a sus necesidades. PLY podría ser adecuado. Solo como último recurso, recomendaría intentar implementar un importador para un formato basado en XML.

También hay: Lib3DS - http://www.lib3ds.org/ LibOBJ (no me deja publicar el enlace)

Deberías echar un vistazo a:

http://sketchup.google.com/community/developers.html

El equipo de SketchUp proporciona un servidor COM C ++ gratis. Con esto, puede obtener acceso a mucha información sobre un archivo .skp.

Debería poder utilizar este servidor COM para escribir un importador .skp para su aplicación.

Debería intentar obtener el archivo .tlb si puede. Esto le dará acceso a punteros inteligentes, lo que simplificará su importador (cliente COM)

Utilicé el SDK de la versión 6 (que incluía el archivo tlb). La versión actual del SDK no parece incluir este archivo.

Alguien publicó una solución (para el archivo tlb faltante) en los foros de desarrolladores: http://groups.google.com/group/su-sdk-fileshare/ temas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top