Использование моделей Blender / SketchUp в OpenGL - PullRequest
12 голосов
/ 01 декабря 2009

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

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

Polygonized curved 3D object

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

Ответы [ 6 ]

12 голосов
/ 01 декабря 2009

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

5 голосов
/ 10 декабря 2009

Если двоичные форматы вас не пугают, я бы предложил написать плагин Blender & 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()
2 голосов
/ 02 декабря 2009

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

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

  • collada-dom , эталонная реализация. Как следует из названия, это просто абстракция дерева XML.
  • FCollada , более хорошая абстракция. Тем не менее, этот проект был мертв в течение почти двух лет, и, как я понял, вряд ли мы увидим какое-либо обновление в будущем.
  • OpenCollada , недавнее новое усилие. Не пробовал, но за этим стоит активное сообщество.

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

1 голос
/ 11 декабря 2009

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

1 голос
/ 01 декабря 2009

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

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

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

0 голосов
/ 08 декабря 2009

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

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/topics

...