Использование моделей Blender/SketchUp в OpenGL
Я делаю рендеринг с помощью OpenGL. У меня есть текстурированные модели в Blender/Sketchup (я могу легко обмениваться между ними), и я хотел бы иметь возможность экспортировать эти файлы в мой рендерер. Моя первоначальная идея состояла в том, чтобы просто экспортировать необработанные лица и отображать эти треугольники, но я хотел бы легко нарезать файлы текстур в координаты текстур.
Таким образом, я имею в виду, что мои лица модели вырезаются в треугольники. Вы можете увидеть в это изображение (воспроизведено ниже), что моя кривая становится 24 треугольниками. Я хотел бы знать, какие текстурные координаты использовать для каждого треугольника.
![Polygonized curved 3D object]()
Может ли DAE файл быть самым простым способом? Я читал спецификации для формата, и это выглядит достаточно легко. Я думаю, что смогу проанализировать XML и точно воссоздать модели в OpenGL. Мне интересно, есть ли более простой способ (т.е. Тот, который не изобретает велосипед).
Ответы
Ответ 1
Если вам удобно разбирать формат .dae, обязательно используйте его. Однако, если вы заинтересованы в экспорте текстурированных треугольных сеток, я бы рассмотрел использование . Obj format, который намного проще анализировать. Из того, что я могу сказать, Sketchup и Blender могут экспортировать этот формат.
Ответ 2
Если бинарные форматы вас не пугают, я бы предложил написать плагин Blender и Sketchup и экспортировать геометрию, предварительно обработанную в упакованные массивы вершин.
Прекрасная вещь об этом методе заключается в том, что в вашем приложении нет синтаксического анализа или преобразования типов. Все готово для отправки на GPU в простых смежных копиях памяти. Отлично подходит для статической геометрии.
Урезанный экспортер блендера выглядит примерно так:
#!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()
Ответ 3
Если вы хотите разобрать .dae
файлы, я бы предложил посмотреть в Collada парсеры.
.dae
на самом деле является расширением для файлов Collada, последними усилиями группы Khronos (сторонники OpenGL) иметь единый формат файла для обмена 3D-данными.
Что касается существующих парсеров, вот что я встретил:
- collada-dom, эталонная реализация. Как следует из названия, это просто абстракция дерева XML.
- FCollada, более красивая абстракция. Однако этот проект был мертв почти два года, и из того, что я собрал, маловероятно, что мы увидим какое-либо обновление в будущем.
- OpenCollada, недавнее новое усилие. Не пробовал, но за этим стоит активное сообщество.
Говоря, что если ваша единственная цель - загрузить простую часть геометрии с вершинами, нормали и координаты текстуры, то переход к формату файла .obj
может быть более быстрым.
Ответ 4
Любой достойный формат файла, используемый программами моделирования (например, Blender или Sketchup), будет содержать всю информацию, необходимую для воссоздания геометрии, которую вы видите. Это должно включать в себя тип геометрии (например, треугольные полосы, отдельные треугольники и т.д.), Вершины и нормали для геометрии, используемые свойства материала, а также текстуры, используемые вместе с соответствующими координатами текстуры. Если чего-то не хватает из потенциального формата файла, выберите другой.
Если вы считаете, что синтаксический анализ XML прост, тогда я надеюсь, что вы планируете использовать существующие библиотеки для этого, такие как expat, Xerces или какая-либо другая языковая реализация.
При рассмотрении импорта/экспорта сначала попробуйте найти библиотеку с открытым исходным кодом, которая может обрабатывать импорт для вас, и сделать данные доступными для вашей программы в разумном формате. Если это не доступно, и вы должны написать собственный импортер, попробуйте найти простой ASCII (не основанный на XML) или двоичный формат, соответствующий вашим потребностям. PLY может быть подходящим. Только в качестве последнего средства я бы рекомендовал попробовать внедрить импортер для формата на основе XML.
Ответ 5
Там также:
Lib3DS - http://www.lib3ds.org/
LibOBJ (не позволю мне опубликовать ссылку)
Ответ 6
Вы должны взглянуть на:
http://sketchup.google.com/community/developers.html
Команда sketchup предоставляет бесплатный сервер С++. Используя это, вы можете получить доступ к большому количеству информации о файле .skp.
Вы должны иметь возможность использовать этот COM-сервер для записи импортера .skp для вашего приложения.
Вы должны попытаться получить файл .tlb, если сможете. Это даст вам доступ к интеллектуальным указателям, что упростит ваш импортер (COM-клиент)
Я использовал SDK версии 6 (включая файл tlb). Текущая версия SDK не включает этот файл.
Кто-то опубликовал решение (для отсутствующего файла tlb) на форумах разработчиков:
http://groups.google.com/group/su-sdk-fileshare/topics