Автор Тема: Увеличение числа вершин при экспорте из Blender  (Прочитано 2722 раз)

Оффлайн znseday

  • Житель
Пишу 3d-движок, модели хочу загружать из Blender.
Но почти все форматы экспорта (например, raw, obj, collada) разбивают модель на грани с увеличением числа вершин.
Например, есть обычный куб, у него 6 граней и 8 вершин. Но при экспорте каждая грань представляется четырехугольником (случай с треугольниками пока не рассматриваем, суть та же) с четырьмя вершинами. Т.о. на выходе получаем 6*4 = 24 вершины против 8 исходных. Т.е. можно, конечно, потом построить модель, используя 6 отдельных четырехугольников, но ведь OpenGL (скорее всего и DirectX (я работаю с OpenGL)) для построения поверхностей имеет связные четырехугольники и треугольники (GL_QUAD_STRIP, GL_TIANGLE_STRIP).

И если задачу с кубом можно решить вручную, то как быть со сложной моделью, состоящей из тысячи четырехугольников (или треугольников)?

Как рисует сам Blender: связными полигонами или отдельными? Какой формат экспорта (если такой существует) поддерживает вывод координат вершин таким образом, чтобы по ним рисовать связными полигонами? Т.е. какой порядок обхода вершин?

Не хочется в разы терять производительность из-за введения в программу лишних, дублирующих друг друга, вершин. Или я один заморачиваюсь, а все нормальные люди закрывают на это глаза?

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #1 : 24 Февраль 2014, 21:45:03 »
... в API Blender можно получить список вершин (массив векторов) , список ребер (массив пар (номер вершины1, номер вершины2)) и список фейсов (массив (номер вершины1, номер вершины2, номер вершины3) ...


>> Но почти все форматы экспорта (например, raw, obj, collada) разбивают модель на грани с увеличением числа вершин.
... вот как выглядит стандартный куб в после экспорта obj ...
... в нем 8 вершин ...

# Blender v2.69 (sub 11) OBJ File: ''
# www.blender.org
mtllib cube.mtl
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
usemtl Material
s off
f 1 2 3 4
f 5 8 7 6
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 5 1 4 8
Для Кота

Оффлайн znseday

  • Житель
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #2 : 24 Февраль 2014, 22:41:07 »
Цитировать
в API Blender можно получить список вершин (массив векторов) , список ребер (массив пар (номер вершины1, номер вершины2)) и список фейсов (массив (номер вершины1, номер вершины2, номер вершины3)
Для списка фейсов уже писал скрипт - фесы там получаются между собой несвязными.
Попробую вытащить голый список вершин, посмотрю, в какой последовательности он их выдаст...

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #3 : 24 Февраль 2014, 23:01:48 »
... а как должен выглядеть "список" связанных фейсов? ...
... можно делать дополнительно список ребер, в котором указаны две вершины и два смежных фейса ...
« Последнее редактирование: 24 Февраль 2014, 23:03:33 от sungreen »
Для Кота

Оффлайн znseday

  • Житель
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #4 : 24 Февраль 2014, 23:50:39 »
Цитировать
а как должен выглядеть "список" связанных фейсов?
Для треугольников, например, первые две вершины фейса должны являться двумя последними вершинами предыдущего фейса. Т.е. в каждом новом треугольнике добавляется только одна новая вершина. Я хочу такой список)

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #5 : 25 Февраль 2014, 05:03:07 »
>>Я хочу такой список)
... то есть для GL_TRIANGLE_STRIP или GL_QUAD_STRIP? ...
Для Кота

Оффлайн znseday

  • Житель
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #6 : 25 Февраль 2014, 11:34:39 »
Цитировать
>>Я хочу такой список)
... то есть для GL_TRIANGLE_STRIP или GL_QUAD_STRIP? ...

В идеале - да. Я понимаю, что есть объекты, состоящие из разорванных поверхностей, и для них это невозможно. Но многие объекты, являющиеся замкнутыми поверхностями, теоретически в виде такого списка представить можно.

Оффлайн znseday

  • Житель
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #7 : 27 Февраль 2014, 13:36:43 »
Сделал перебор вершин:
Код
if obj.type == 'MESH':
   mesh = obj.data
   mesh.update(calc_tessface=True)
   matrix = obj.matrix_world.copy()
   for i, vertex in enumerate(mesh.vertices):       
       c = matrix*mesh.vertices[i].co
       f.write('%f %f %f\n'% (c[0],c[1],c[2]))
Результирующий массив вершин GL_TRIANGLE_STRIP (GL_QUAD_STRIP) не описывает, как поверхность.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Увеличение числа вершин при экспорте из Blender
« Ответ #8 : 27 Февраль 2014, 19:28:04 »
а если все-таки через экспорт obj?
http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Load_OBJ
Для Кота

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 106
Автор: LEXA ANЭGROWND
blender.png
Скачано: 112
Автор: ipv2007
4.png
Скачано: 139
Автор: hiroyukiss
2.png
Скачано: 162
Автор: hiroyukiss

Скачано: 172
Автор: Dilifa12