3d форум по Blender

Blender => Моделирование => Тема начата: znseday от 24 Февраль 2014, 18:48:43

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

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

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

Не хочется в разы терять производительность из-за введения в программу лишних, дублирующих друг друга, вершин. Или я один заморачиваюсь, а все нормальные люди закрывают на это глаза?
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: sungreen от 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 (http://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
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: znseday от 24 Февраль 2014, 22:41:07
Цитировать
в API Blender можно получить список вершин (массив векторов) , список ребер (массив пар (номер вершины1, номер вершины2)) и список фейсов (массив (номер вершины1, номер вершины2, номер вершины3)
Для списка фейсов уже писал скрипт - фесы там получаются между собой несвязными.
Попробую вытащить голый список вершин, посмотрю, в какой последовательности он их выдаст...
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: sungreen от 24 Февраль 2014, 23:01:48
... а как должен выглядеть "список" связанных фейсов? ...
... можно делать дополнительно список ребер, в котором указаны две вершины и два смежных фейса ...
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: znseday от 24 Февраль 2014, 23:50:39
Цитировать
а как должен выглядеть "список" связанных фейсов?
Для треугольников, например, первые две вершины фейса должны являться двумя последними вершинами предыдущего фейса. Т.е. в каждом новом треугольнике добавляется только одна новая вершина. Я хочу такой список)
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: sungreen от 25 Февраль 2014, 05:03:07
>>Я хочу такой список)
... то есть для GL_TRIANGLE_STRIP или GL_QUAD_STRIP? ...
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: znseday от 25 Февраль 2014, 11:34:39
Цитировать
>>Я хочу такой список)
... то есть для GL_TRIANGLE_STRIP или GL_QUAD_STRIP? ...

В идеале - да. Я понимаю, что есть объекты, состоящие из разорванных поверхностей, и для них это невозможно. Но многие объекты, являющиеся замкнутыми поверхностями, теоретически в виде такого списка представить можно.
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: znseday от 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) не описывает, как поверхность.
Название: Re: Увеличение числа вершин при экспорте из Blender
Отправлено: sungreen от 27 Февраль 2014, 19:28:04
а если все-таки через экспорт obj?
http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Load_OBJ