Вопрос

Я делаю рендерер с использованием OpenGL.У меня есть текстурированные модели в Blender/Sketchup (я могу легко обмениваться ими между собой), и я хотел бы иметь возможность экспортировать эти файлы в свой рендерер.Моя первоначальная идея заключалась в том, чтобы просто экспортировать необработанные грани и визуализировать эти треугольники, но мне также хотелось легко разрезать файлы текстур на текстурные координаты.

Под этим я имею в виду, что лица моих моделей вырезаются в виде треугольников.Вы можете увидеть в это изображение (воспроизведено ниже), что моя кривая станет 24 треугольниками.Я хотел бы знать, какие координаты текстуры использовать для каждого треугольника.

Polygonized curved 3D object

Будет ли файл DAE самым простым способом сделать это?Я читал спецификации формата, и это выглядит достаточно просто.Я думаю, что смогу проанализировать XML и точно воссоздать модели в OpenGL.Мне интересно, есть ли более простой способ (т.е.тот, который не изобретает велосипед).

Это было полезно?

Решение

Если вам удобен анализ .dae-формата, обязательно используйте его. Однако, если вы заинтересованы только в экспорте текстурированных треугольных сеток, я хотел бы использовать формат .obj который намного проще разобрать. Из того, что я могу сказать, Sketchup и Blender могут экспортировать этот формат.

Другие советы

Если бинарные форматы вас не пугают, я бы предложил написать Blender & amp; Плагин Sketchup и экспорт геометрии, предварительно запеченной в упакованные массивы вершин.

Прекрасная особенность этого метода в том, что в вашем приложении нет анализа или преобразования типов. Все готово для отправки в графический процессор в виде простых непрерывных копий памяти. Отлично подходит для статической геометрии.

Ускоренный экспортер блендера выглядит примерно так:


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

Если вы хотите разобрать .dae файлы, я бы посоветовал изучить Коллада парсеры..dae на самом деле это расширение для файлов Collada, последняя разработка компании Группа Хронос (сопровождающие OpenGL), чтобы иметь единый унифицированный формат файлов для обмена 3D-данными.

Что касается существующих парсеров, вот что я нашел:

  • коллада-дом, эталонная реализация.Как следует из названия, это всего лишь абстракция дерева XML.
  • ФК Коллада, более приятная абстракция.Однако этот проект мертв уже почти два года, и, судя по тому, что я понял, маловероятно, что мы увидим какие-либо обновления в будущем.
  • OpenCollada, недавняя новая попытка.Я не пробовал, но за этим стоит активное сообщество.

При этом, если ваша единственная цель — загрузить простой фрагмент геометрии с вершинами, нормалями и координатами текстуры, используйте .obj формат файла может быть более быстрым способом.

Любой приличный формат файла, используемый программами моделирования (например, Blender или Sketchup), будет содержать всю информацию, необходимую для воссоздания геометрии, которую вы видите. Это должно включать тип геометрии (например, треугольные полосы, отдельные треугольники и т. Д.), Вершины и нормали для геометрии, используемые свойства материала, а также текстуры, используемые вместе с соответствующими координатами текстуры. Если что-то отсутствует в потенциальном формате файла, выберите другой.

Если вы думаете, что синтаксический анализ XML является простым, тогда я надеюсь, что вы планируете использовать для этого существующие библиотеки, такие как expat, Xerces или какую-либо другую реализацию, специфичную для конкретного языка.

При рассмотрении вопроса об импорте / экспорте сначала попытайтесь найти библиотеку с открытым исходным кодом, которая сможет обработать импорт для вас и сделать данные доступными для вашей программы в приемлемом формате. Если это недоступно, и вы должны написать свой собственный импортер, попробуйте найти простой ASCII ( не на основе XML ) или двоичный формат, который соответствует вашим потребностям. PLY может подойти. Только в качестве крайней меры я бы порекомендовал попытаться реализовать импортер для формата на основе XML.

Есть также: Lib3DS - http://www.lib3ds.org/ LibOBJ (не позволяет мне публиковать ссылку)

Вы должны взглянуть на:

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

Команда SketchUp предоставляет COM-сервер C ++ бесплатно. Используя это, вы можете получить доступ к большому количеству информации о файле .skp.

Вы должны иметь возможность использовать этот COM-сервер для написания импортера .skp для вашего приложения.

Вы должны попытаться получить файл .tlb, если можете. Это даст вам доступ к интеллектуальным указателям, что упростит ваш импортер (COM-клиент)

Я использовал SDK версии 6 (который включал файл tlb). Текущая версия SDK не включает этот файл.

Кто-то опубликовал решение (для отсутствующего файла tlb) на форумах разработчиков: http://groups.google.com/group/su-sdk-fileshare/ темы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top