Domanda

Sto realizzando un renderer usando OpenGL. Ho modelli strutturati in Blender / Sketchup (posso scambiarli facilmente tra i due) e mi piacerebbe poter esportare quei file nel mio renderer. La mia idea iniziale era semplicemente esportare le facce non elaborate e renderizzare quei triangoli, ma mi piacerebbe anche tagliare facilmente i miei file di trama in coordinate di trama.

Voglio dire che le facce del mio modello vengono scolpite in triangoli. Puoi vedere in questa immagine (riprodotta di seguito) che la mia curva diventa 24 triangoli. Vorrei sapere quali coordinate di trama utilizzare per ciascun triangolo.

Oggetto 3D poligonale curvo

Un file DAE sarebbe il modo più semplice per farlo? Ho letto le specifiche per il formato e sembra abbastanza facile. Penso di poter analizzare l'XML e ricreare fedelmente i modelli in OpenGL. Mi chiedo se esiste un modo più semplice (cioè uno che non reinventa la ruota).

È stato utile?

Soluzione

Se hai dimestichezza con l'analisi del formato .dae, utilizzalo sicuramente. Tuttavia, se ti interessa solo esportare maglie di triangoli con texture, prenderei in considerazione l'utilizzo del .obj format che è molto più semplice da analizzare. Da quello che posso dire sia Sketchup che Blender possono esportare questo formato.

Altri suggerimenti

Se i formati binari non ti spaventano, suggerirei di scrivere un Blender & amp; Plug-in Sketchup ed esportazione della geometria precotta in array di vertici compressi.

La cosa bella di questo metodo è che non ci sono analisi o conversioni di tipi nella tua app. Tutto è pronto per essere inviato alla GPU in semplici copie di memoria contigue. Ottimo per la geometria statica.

Un esportatore di frullatori sminuiti assomiglia a questo:


#!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()

Se desideri analizzare i file .dae , suggerirei di esaminare Collada parser. .dae è in realtà l'estensione per i file Collada, l'ultimo sforzo del gruppo Khronos (manutentori di OpenGL) per avere un unico formato file unificato per lo scambio di dati 3D.

Per quanto riguarda i parser esistenti, ecco cosa mi sono imbattuto:

  • collada-dom , l'implementazione di riferimento. Come suggerisce il nome, è solo un'astrazione dell'albero XML.
  • FCollada , un'astrazione più bella. Tuttavia, questo progetto è morto da quasi due anni e, da quello che ho raccolto, è improbabile che vedremo aggiornamenti in futuro.
  • OpenCollada , un recente recente impegno. Non l'ho provato, ma dietro c'è una comunità attiva.

Detto questo, se il tuo unico obiettivo è caricare un semplice pezzo di geometria con vertici, normali e coordinate di trama, andare con il formato di file .obj potrebbe essere un modo più veloce.

Qualsiasi formato di file decente usato dai programmi di modellazione (come Blender o Sketchup) includerà tutte le informazioni necessarie per ricreare la geometria che vedi. Ciò dovrebbe includere il tipo di geometria (ad esempio strisce triangolari, singoli triangoli, ecc.), I vertici e le normali per la geometria, le proprietà del materiale utilizzato e anche le trame utilizzate insieme alle coordinate della trama appropriate. Se manca qualcosa da un potenziale formato di file, scegline un altro.

Se pensi che analizzare XML sia semplice, spero che tu stia pianificando di usare librerie esistenti per farlo, come expat, Xerces o qualche altra implementazione specifica del linguaggio.

Quando si considera l'importazione / esportazione, provare innanzitutto a trovare una libreria open source in grado di gestire l'importazione per te e rendere i dati disponibili per il programma in un formato ragionevole. Se questo non è disponibile e devi scrivere il tuo importatore, prova a trovare un semplice formato ASCII ( non basato su XML ) o binario adatto alle tue esigenze. PLY potrebbe essere adatto. Solo come ultima risorsa, consiglierei di provare a implementare un importatore per un formato basato su XML.

C'è anche: Lib3DS - http://www.lib3ds.org/ LibOBJ (non mi lascia pubblicare post)

Dovresti dare un'occhiata a:

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

Il team di sketchup fornisce gratuitamente un server COM C ++. Usando questo, puoi accedere a molte informazioni su un file .skp.

Dovresti essere in grado di usare questo server COM per scrivere un importatore .skp per la tua applicazione.

Dovresti provare a ottenere il file .tlb se puoi. Ciò ti darà accesso a puntatori intelligenti, che semplificheranno il tuo importatore (client COM)

Ho usato l'SDK versione 6 (che includeva il file tlb). La versione corrente dell'SDK non sembra includere questo file.

Qualcuno ha pubblicato una soluzione (per il file tlb mancante) nei forum degli sviluppatori: http://groups.google.com/group/su-sdk-fileshare/ argomenti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top