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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Bulbash

  • Житель
Я как писатель своего движка выбрал блендер (он бесплатен). Раньше я пользовался .obj форматом вполне успешно.
Но настало время использовать скелетную анимацию. И я понял что проще и эффективнее всего будет написать свой скрипт для экспорта. Изучил синтаксис языка Python и посмотрел пару видеуроков как им пользоваться в Blender смог создать в меню File->Export нужную мне клавишу. Но уже два дня никак не могу понять как мне ПРОГРАМНО посчитать количество мэшей в сцене(т.е проигноривать остальные обьекты такие как камера свет и прочее). Кто знает как это реализуется пожалуйста подскажите. Могу предоставить код уже написаного мной скрипта если кому надо.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
>>как мне ПРОГРАМНО посчитать количество мэшей в сцене
... тебя интересует конкретная сцена и все меши? ...
Код: python [Выделить]
import bpy
c=len(bpy.data.meshes)
print(c)
Для Кота

Оффлайн Bulbash

  • Житель
Спасибо sungreen код действительно работает. Если знаете не моглибы вы мне помочь со следующими вопросами:
1) как мне получить все данные о этих мэшах (вершины, индексы и нормали).
2) материал к каждому мэшу.
3) как мне получить все данные о скелете (положение костей) если таковой присутствует в модели.
4) и данные о анимации выше упомянутого скелета (ключевые кадры, количество кадров между ключ. кадрами, общее количество кадров)
« Последнее редактирование: 06 Ноября 2016, 21:44:49 от Bulbash »

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
>>как мне получить все данные

... на самом деле это не трудно, вся информация есть модели данных ...
>> 1) как мне получить все данные о этих мэшах (вершины, индексы и нормали).
вершины: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Mesh.html#bpy.types.Mesh.vertices
индекс вершины: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.MeshVertex.html#bpy.types.MeshVertex.index
нормаль вершины: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.MeshVertex.html#bpy.types.MeshVertex.normal
полигоны: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Mesh.html#bpy.types.Mesh.polygons
индекс полигона: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.MeshPolygon.html#bpy.types.MeshPolygon.index
нормаль полигона: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.MeshPolygon.html#bpy.types.MeshPolygon.normal

>> 2) материал к каждому мэшу.
материалы меша: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Mesh.html#bpy.types.Mesh.materials

>> 3) как мне получить все данные о скелете (положение костей) если таковой присутствует в модели.
арматуры: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.BlendData.html#bpy.types.BlendData.armatures
и соответственно арматура: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Armature.html#bpy.types.Armature

... то есть всю информацию можно получить из bpy.data  ...
https://www.blender.org/api/blender_python_api_2_78a_release/bpy.data.html

Для Кота

Оффлайн Striver

  • Житель
    • http://striver00.ru
Вставлю тут небольшой самопиарчик своего перевода, вдруг пригодится.
http://striver00.ru/files/Code_Snippets_25_ru.zip

Оффлайн Bulbash

  • Житель
sungreen  я смотрел внимательно все те страницы которые вы мне скинули, и никак не могу все же понять а где же там собственно информация о том как мне получить то что мне надо. Например первая ссылка:
>>  https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Mesh.html#bpy.types.Mesh.vertices
Я вижу что раздел называется Vertices of the mesh но не понимаю как мне до него достучаться. И я перечитал все функции и переменные там созданные и где мне допустим получить положение каждой точки там как минимум должен быть масив мэшей и в каждом из них как минимум массив позиций точек.


Оффлайн Bulbash

  • Житель
Извините sungreen  я нашел страницу где вы уже отвечаете на аналогичный вопрос.
http://blender-3d.ru/forum/index.php/topic,504.0.html

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
>> вижу что раздел называется Vertices of the mesh но не понимаю как мне до него достучаться.

... поясню, поскольку для эффективной работы желательно пользоваться описанием blender api ...
... по указанной ссылке мы видим описание свойства vertices блока данных mesh ...
Цитировать
vertices

    Vertices of the mesh
    Type:   MeshVertices bpy_prop_collection of MeshVertex, (readonly)

... из типа bpy_prop_collection of MeshVertex ясно, что это коллекция вершин ...
... если кликнуть на MeshVertex, то мы получим описание блока данных вершин ...
... например координаты хранятся в co ...
https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.MeshVertex.html#bpy.types.MeshVertex.co


... отсюда получаем требуемый код ...
Код: python [Выделить]
mesh = bpy.data.meshes["Cube"]
for vert in mesh.vertices:
    print(vert.co)
Для Кота

Оффлайн Bulbash

  • Житель
Спасибо, с вершинами разобрался. Но возник другой вопрос. Мне не понятно как в Python узнать в каком из полигонов участвует конкретная вершина. В DX11 это называется индексным буфером, суть го в том что это просто массив типа int который указывает в каком порядке соединяются вершины(формируются полигоны). Желательно получить из Blender этот индексный буфер в таком же формате.

Оффлайн sungreen

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

Оффлайн LanuHum

  • Житель
Спасибо, с вершинами разобрался. Но возник другой вопрос. Мне не понятно как в Python узнать в каком из полигонов участвует конкретная вершина. В DX11 это называется индексным буфером, суть го в том что это просто массив типа int который указывает в каком порядке соединяются вершины(формируются полигоны). Желательно получить из Blender этот индексный буфер в таком же формате.
                    me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
                    me_faces = me.tessfaces
                    faces_verts = [f.vertices[:] for f in me_faces]

Оффлайн Bulbash

  • Житель
Я наверное не правильно пояснил. В DirectX 11 для соединения вершин в полигоны используется индексный буфер. Это не таблица, это просто массив целочисленных значений, каждое значение это индекс вершины следующего соединения , каждые три значения формируют треугольник. Для понимания картинка

Оффлайн Bulbash

  • Житель
LanuHum я не могу разобраться в коде предложенном вами.
В строке :
>>  me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
я не понимаю тут что за структура "ob"


>>  faces_verts = [f.vertices[:] for f in me_faces]
тут я не знаю наверное о каких то секретах синтаксиса Python.
Можете, пожалуйста, пояснить приведенные вопросы.

Оффлайн Samovar

  • Житель
  • Пятигорье
Цитировать
LanuHum я не могу разобраться в коде предложенном вами.
В строке :
>>  me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
я не понимаю тут что за структура "ob"
Предположу, что LanuHum выложил "кастрированный" код...
Видимо, начало должно выглядеть так:
import bpy
ob=bpy.context.object

Остального не знаю... И мне непонятно с чего ты взял, что координаты вершины должны быть целыми переменными (int), а не вещественными (float) ?
¯\_(ツ)_/¯

Оффлайн LanuHum

  • Житель
LanuHum я не могу разобраться в коде предложенном вами.
В строке :
>>  me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
я не понимаю тут что за структура "ob"


>>  faces_verts = [f.vertices[:] for f in me_faces]
тут я не знаю наверное о каких то секретах синтаксиса Python.
Можете, пожалуйста, пояснить приведенные вопросы.
ob = bpy.context.object или bpy.data.objects["X"]
В общем - это исследуемый объект.
Дело в том, что информация об ob.data.polygons(vertices) может быть использована только в том случае, если к объекту не применены никакие модификаторы.
Если применены модификаторы, то достоверную информацию не получить. То есть ob.data.polygons(vertices) - это исходная версия меша. Если используются модификаторы, то создают новый меш me преобразуя в него исходный объект, вычислив влияние всех модификаторов:
me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
Первое True и означает, что использовать модификаторы.
У каждого модификатора есть два значения одного и того же параметра. Один из них применяется для вьюпорта, другой для рендера. Становится понятным, что значит 'RENDER', то есть указывается, что выбрать из двух. Tessfaces - это заморочка, значение которой знать не обязательно, но не вычислив эту ерунду не получить доступ к UV. Скорее всего, это преобразование пяти, шести и более гранников к стандартным четыреугольникам.
Очень может быть, что я предоставляю сейчас лишнюю информацию, но, об этом знать нужно.
Что касается
faces_verts = [f.vertices[:] for f in me_faces]
У питона есть понятие "однострочник", когда позволяется несколько строчек кода записать сокращённо. Эта строчка эквивалента такой записи:
faces_verts = []
for f in me_faces:
    face_verts.append(f.vertices[:])
Разумеется, в Блендере нужно очень хорошо помнить про это непонятное [:]. Оно извлекает tuple из объекта.

 


* По форуму

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

Слежение.jpg
Скачано: 8
Автор: Barabashka
mehanizm-dlya-podemnoy-krovati-mkb-l633670.jpg
Скачано: 17
Автор: СемёнСемёныч
Безымянный.jpg
Скачано: 18
Автор: СемёнСемёныч
bandicam 2017-11-11 20-01-37-777.jpg
Скачано: 15
Автор: An
Снимок.PNG
Скачано: 18
Автор: Samovar