Автор Тема: Небходима помощь по написанию экспрта в свой формат на языке Python.  (Прочитано 24646 раз)

Оффлайн Bulbash

  • Житель
Спасибо за помощь LanuHum.
Но уже возникла проблема другого характера. С позицией точки, нормалью и индексацией я разобрался (это минимум чтобы выгрузить в мой движок), я выгрузил и все заработало как надо, возникла новая проблема, я не понимаю как мне получить координату текстуры. Вот я нашел страницу описания где описывается вершина https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.MeshVertex.html#bpy.types.MeshVertex но в упор не вижу того что отвечает за текстурную координату в вершине. Подскажите пожалуйста.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Для Кота

Оффлайн LanuHum

  • Житель
В папке с аддонами при Блендере достаточно экспортёров, из которых можно извлечь хорошие уроки.

Оффлайн Bulbash

  • Житель
Работал с текстурными координатами. И в экспортерах других форматов, и на различных сайтах  заметил такой код :
bpy.context.active_object.data.uv_textures.active.data[ face_index ].uv
но у меня при использовании пишет ошибку... вот скриншот ошибки:

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
... у тебя нет развёртки ...
Для Кота

Оффлайн LanuHum

  • Житель
... у тебя нет развёртки ...
Скорее, не выделен объект, или выделен объект не имеющий data

Оффлайн Bulbash

  • Житель
Пробовал создать развертку. Не помогло... Переглядел еще тучу примеров не один не работает, или я что то не так делаю или версия Blender не та. Есть ли способ просто взять для каждой вершины эту uv координату? Документацию смотрел со всех сторон везде каккието косвенно связанные параметры и функции но нет конкретного рабочего примера.

Оффлайн LanuHum

  • Житель
Пробовал создать развертку. Не помогло... Переглядел еще тучу примеров не один не работает, или я что то не так делаю или версия Blender не та. Есть ли способ просто взять для каждой вершины эту uv координату? Документацию смотрел со всех сторон везде каккието косвенно связанные параметры и функции но нет конкретного рабочего примера.
При созданной развёртке:
Код
me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
mesh_triangulate(me)
me_faces = me.tessfaces
me_verts = me.vertices
lenverts = len(me_verts)
lenfaces = len(me_faces)
uv_textures = me.tessface_uv_textures
if len(uv_textures) > 0:
    if me.uv_textures.active and uv_textures.active.data:
        uv_layer = uv_textures.active.data
else:
    uv_layer = None

for face in me_faces:
    if uv_layer:
        uv = uv_layer[face.index]
        uv1 = "<%.6g,%.6g>"%uv.uv1[:]
        uv2 = "<%.6g,%.6g>"%uv.uv2[:]
        uv3 = "<%.6g,%.6g>"%uv.uv3[:]

Оффлайн Bulbash

  • Житель
LanuHum код выложенный вами действительно работает (ошибок во всяком случае не выдаёт). Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации. Подскажите если я не правильно понимаю что в этом коде происходит, а если я все правильно все понял то нужен пример как получить все эти  координаты для каждой вершины в порядке как они иду в мэше.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

... вопрос такой - у нас есть два полигона 6 вершин и есть uv развёртка с 8 точками для этих полигонов ...
... как должна выглядеть твоя таблица? ...
Для Кота

Оффлайн LanuHum

  • Житель
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

... вопрос такой - у нас есть два полигона 6 вершин и есть uv развёртка с 8 точками для этих полигонов ...
... как должна выглядеть твоя таблица? ...
Вот именно. Одной вершине может принадлежать несколько текстурных координат. Так что, специфику движка нужно корректировать. :)

Оффлайн Bulbash

  • Житель
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

... вопрос такой - у нас есть два полигона 6 вершин и есть uv развёртка с 8 точками для этих полигонов ...
... как должна выглядеть твоя таблица? ...

Да, видимо в Blender все так и и устроено, но в DX11 (как я понимаю) для каждой точки есть конкретная одна текстурная координата. Так как я раньше работал с Obj форматом то знаю что Blender может сохранить этот параметр так как мне надо (ведь в Obj все именно так реализовано). Пробовал в папке с аддонами найти экспортер в Obj но не нашел.

Оффлайн LanuHum

  • Житель
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

... вопрос такой - у нас есть два полигона 6 вершин и есть uv развёртка с 8 точками для этих полигонов ...
... как должна выглядеть твоя таблица? ...

Да, видимо в Blender все так и и устроено, но в DX11 (как я понимаю) для каждой точки есть конкретная одна текстурная координата. Так как я раньше работал с Obj форматом то знаю что Blender может сохранить этот параметр так как мне надо (ведь в Obj все именно так реализовано). Пробовал в папке с аддонами найти экспортер в Obj но не нашел.
экспортёр здесь: /scripts/addons/io_scene_obj
Только, не надо нас вводить в заблуждение. :)
Вот файл obj. Что мы видим? 8 вершин и 24 текстурные координаты. Ещё, что мы видим? 12 фейсов, которые берут данные из трёх списков: списка вершин, списка текстурных координат и списка нормалей. Нет здесь нигде понятия о том, что у одной вершины - только одна текстурная координата.
Код
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 1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
vt 0.6312 0.3438
vt 0.3812 0.0939
vt 0.6312 0.0939
vt 0.5938 0.6563
vt 0.3438 0.4064
vt 0.5938 0.4064
vt 0.3105 0.3542
vt 0.0605 0.1043
vt 0.3105 0.1043
vt 0.9457 0.3626
vt 0.6958 0.1126
vt 0.9457 0.1126
vt 0.6419 0.9294
vt 0.8919 0.6794
vt 0.8919 0.9294
vt 0.0626 0.9335
vt 0.3126 0.6836
vt 0.3126 0.9335
vt 0.3812 0.3438
vt 0.3438 0.6563
vt 0.0605 0.3542
vt 0.6958 0.3626
vt 0.6419 0.6794
vt 0.0626 0.6836
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl Material.001
s off
f 2/1/1 3/2/1 1/3/1
f 4/4/2 7/5/2 3/6/2
f 8/7/3 5/8/3 7/9/3
f 6/10/4 1/11/4 5/12/4
f 7/13/5 1/14/5 3/15/5
f 4/16/6 6/17/6 8/18/6
f 2/1/1 4/19/1 3/2/1
f 4/4/2 8/20/2 7/5/2
f 8/7/3 6/21/3 5/8/3
f 6/10/4 2/22/4 1/11/4
f 7/13/5 5/23/5 1/14/5
f 4/16/6 2/24/6 6/17/6
Вот для этой картинки:

Оффлайн Bulbash

  • Житель
Пробовал создать развертку. Не помогло... Переглядел еще тучу примеров не один не работает, или я что то не так делаю или версия Blender не та. Есть ли способ просто взять для каждой вершины эту uv координату? Документацию смотрел со всех сторон везде каккието косвенно связанные параметры и функции но нет конкретного рабочего примера.
При созданной развёртке:
Код
me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
mesh_triangulate(me)
me_faces = me.tessfaces
me_verts = me.vertices
lenverts = len(me_verts)
lenfaces = len(me_faces)
uv_textures = me.tessface_uv_textures
if len(uv_textures) > 0:
    if me.uv_textures.active and uv_textures.active.data:
        uv_layer = uv_textures.active.data
else:
    uv_layer = None

for face in me_faces:
    if uv_layer:
        uv = uv_layer[face.index]
        uv1 = "<%.6g,%.6g>"%uv.uv1[:]
        uv2 = "<%.6g,%.6g>"%uv.uv2[:]
        uv3 = "<%.6g,%.6g>"%uv.uv3[:]

Присмотрелся к этому коду повнимательнее, попробовал. Ошибок не выдает но почему то  lenfaces всегда 0. Поясните пожалуйста что я мог сделать не так.

Оффлайн Bulbash

  • Житель
Выцепил из стороннего кода работу с uv развертками

Код

 for face in mesh.polygons:
                        IndexStruct[counter].append(np.int32(face.vertices[2]))
                        IndexStruct[counter].append(np.int32(face.vertices[1]))
                        IndexStruct[counter].append(np.int32(face.vertices[0]))
                        for  loop in face.loop_indices:
                            for item in (ob.data.uv_layers.active.data[loop].uv if ob.data.uv_layers.active!=None else (0,0)):#uv
                                print (item)


И смог вывести в консоль числа от 0 до 1 (я так понимаю это и есть информация о развертке). Мне в этом коде не понятны некоторые моменты,:
1) face.loop_indices - что это
2) и в каком порядке идут Uv координаты (в порядке как у меня мэш сформирован или в какой другой закономерности) в соответствии с этим кодом

 


Яметрика

* По форуму

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

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

1 (1).png
Скачано: 68
Автор: LEXA ANЭGROWND
blender.png
Скачано: 78
Автор: ipv2007
4.png
Скачано: 100
Автор: hiroyukiss
2.png
Скачано: 122
Автор: hiroyukiss

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