Pergunta

Estou fazendo um renderizador usando o OpenGL. Tenho modelos texturizados no Blender / Sketchup (posso trocar entre os dois com facilidade) e gostaria de poder exportar esses arquivos para o meu renderizador. Minha idéia inicial era simplesmente exportar os rostos brutos e renderizar esses triângulos, mas eu gostaria de cortar facilmente meus arquivos de textura em coordenadas de textura também.

Com isso, quero dizer que meus rostos de modelo são esculpidos em triângulos. Você pode ver em esta imagem (reproduzido abaixo) que minha curva se torna 24 triângulos. Eu gostaria de saber quais coordenadas de textura usar para cada triângulo.

Polygonized curved 3D object

Um arquivo dae seria a maneira mais fácil de fazer isso? Eu tenho lido as especificações do formato e parece fácil o suficiente. Eu acho que poderia analisar o XML e recriar fielmente os modelos no OpenGL. Estou me perguntando se existe uma maneira mais fácil (ou seja, uma que não reinvente a roda).

Foi útil?

Solução

Se você se sentir confortável em analisar o .dae-formato, com certeza o use. No entanto, se você estiver interessado apenas em exportar malhas de triângulo texturizado, eu consideraria usar o .ObJ formato o que é muito mais simples de analisar. Pelo que posso dizer, o Sketchup e o Blender podem exportar este formato.

Outras dicas

Se os formatos binários não o assustarem, sugiro escrever um plug-in de liquidificador e esboço e exportar a geometria pré-cozida em matrizes de vértices embalados.

O mais bonito desse método é que não há análise ou conversão de tipo em seu aplicativo. Tudo está pronto para ser enviado à GPU em cópias simples de memória contígua. Ótimo para geometria estática.

Um exportador de liquidificador despojado se parece com o seguinte:


#!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 você deseja analisar .dae arquivos, eu sugeriria examinar Collada analisadores..dae é realmente a extensão dos arquivos colada, o último esforço do Grupo Khronos (Manters do OpenGL) para ter um único formato de arquivo unificado para troca de dados 3D.

Quanto aos analistas existentes, aqui está o que eu encontrei:

  • Collada-dom, a implementação de referência. Como o nome sugere, é apenas uma abstração da árvore XML.
  • Fcollada, uma abstração mais agradável. No entanto, este projeto está morto há quase dois anos e, pelo que reuni, é improvável que vejamos qualquer atualização no futuro.
  • OpenCollada, um novo esforço recente. Não tentei, mas há uma comunidade ativa por trás disso.

Dito isto, se seu único objetivo é carregar uma peça simples de geometria com vértices, normais e coordenadas de textura, indo com o .obj O formato de arquivo pode ser uma maneira mais rápida.

Qualquer formato de arquivo decente usado pelos programas de modelagem (como Blender ou Sketchup) incluirá todas as informações necessárias para recriar a geometria que você vê. Isso deve incluir o tipo de geometria (por exemplo, tiras de triângulo, triângulos individuais, etc.), os vértices e normais para a geometria, as propriedades do material utilizadas e também as texturas usadas junto com as coordenadas de textura apropriadas. Se falta de algo em um formato de arquivo em potencial, escolha outro.

Se você acha que a análise do XML é simples, espero que você esteja planejando usar bibliotecas existentes para fazer isso, como expat, xerces ou outra implementação específica de idioma.

Ao considerar a importação/exportação, primeiro tente encontrar uma biblioteca de código aberto que possa lidar com a importação para você e disponibilizar os dados para o seu programa em um formato razoável. Se isso não estiver disponível e você deve escrever seu próprio importador, tente encontrar um ASCII simples (não baseado em XML) ou formato binário que atenda às suas necessidades. Ply pode ser adequado. Somente como AA Last Resort, eu recomendaria tentar implementar um importador para um formato baseado em XML.

Há também: lib3ds - http://www.lib3ds.org/Libobj (não me permite postar link)

Você deve dar uma olhada em:

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

A equipe de Sketchup fornece um servidor C ++ com GRATUITAMENTE. Usando isso, você pode ter acesso a muitas informações sobre um arquivo .skp.

Você poderá usar este servidor COM para gravar um importador .skp para o seu aplicativo.

Você deve tentar obter o arquivo .tlb, se puder. Isso lhe dará acesso a ponteiros inteligentes, o que simplificará seu importador (cliente COM)

Eu usei o SDK da versão 6 (que incluía o arquivo TLB). A versão atual do SDK não parece incluir este arquivo.

Alguém postou uma solução (para o arquivo TLB ausente) nos fóruns do desenvolvedor:http://groups.google.com/group/su-sdk-fileshare/topics

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top