Подтвердить что ты не робот

Использование моделей Blender/SketchUp в OpenGL

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

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

Polygonized curved 3D object

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

4b9b3361

Ответ 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