3d форум по Blender

Другое => Программирование (любое) => Тема начата: Bulbash от 06 Ноябрь 2016, 12:40:14

Название: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 06 Ноябрь 2016, 12:40:14
Я как писатель своего движка выбрал блендер (он бесплатен). Раньше я пользовался .obj форматом вполне успешно.
Но настало время использовать скелетную анимацию. И я понял что проще и эффективнее всего будет написать свой скрипт для экспорта. Изучил синтаксис языка Python и посмотрел пару видеуроков как им пользоваться в Blender смог создать в меню File->Export нужную мне клавишу. Но уже два дня никак не могу понять как мне ПРОГРАМНО посчитать количество мэшей в сцене(т.е проигноривать остальные обьекты такие как камера свет и прочее). Кто знает как это реализуется пожалуйста подскажите. Могу предоставить код уже написаного мной скрипта если кому надо.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 06 Ноябрь 2016, 13:40:50
>>как мне ПРОГРАМНО посчитать количество мэшей в сцене
... тебя интересует конкретная сцена и все меши? ...
Код: python
import bpy
c=len(bpy.data.meshes)
print(c)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 06 Ноябрь 2016, 21:03:54
Спасибо sungreen код действительно работает. Если знаете не моглибы вы мне помочь со следующими вопросами:
1) как мне получить все данные о этих мэшах (вершины, индексы и нормали).
2) материал к каждому мэшу.
3) как мне получить все данные о скелете (положение костей) если таковой присутствует в модели.
4) и данные о анимации выше упомянутого скелета (ключевые кадры, количество кадров между ключ. кадрами, общее количество кадров)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 06 Ноябрь 2016, 22:02:38
>>как мне получить все данные

... на самом деле это не трудно, вся информация есть модели данных ...
>> 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

Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 06 Ноябрь 2016, 22:50:20
Вставлю тут небольшой самопиарчик своего перевода, вдруг пригодится.
http://striver00.ru/files/Code_Snippets_25_ru.zip
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 07 Ноябрь 2016, 16:17:42
sungreen  я смотрел внимательно все те страницы которые вы мне скинули, и никак не могу все же понять а где же там собственно информация о том как мне получить то что мне надо. Например первая ссылка:
>>  https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Mesh.html#bpy.types.Mesh.vertices
Я вижу что раздел называется Vertices of the mesh но не понимаю как мне до него достучаться. И я перечитал все функции и переменные там созданные и где мне допустим получить положение каждой точки там как минимум должен быть масив мэшей и в каждом из них как минимум массив позиций точек.

Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 07 Ноябрь 2016, 17:57:43
Извините sungreen  я нашел страницу где вы уже отвечаете на аналогичный вопрос.
http://blender-3d.ru/forum/index.php/topic,504.0.html
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 07 Ноябрь 2016, 18:44:58
>> вижу что раздел называется 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)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 12 Ноябрь 2016, 18:25:48
Спасибо, с вершинами разобрался. Но возник другой вопрос. Мне не понятно как в Python узнать в каком из полигонов участвует конкретная вершина. В DX11 это называется индексным буфером, суть го в том что это просто массив типа int который указывает в каком порядке соединяются вершины(формируются полигоны). Желательно получить из Blender этот индексный буфер в таком же формате.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 12 Ноябрь 2016, 18:33:05
>> Желательно получить из Blender этот индексный буфер в таком же формате.
... напиши заголовок этой таблицы, какие поля тебе необходимы и что должно в этой таблице присутствовать ...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 18:56:09
Спасибо, с вершинами разобрался. Но возник другой вопрос. Мне не понятно как в 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]
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 12 Ноябрь 2016, 19:03:20
Я наверное не правильно пояснил. В DirectX 11 для соединения вершин в полигоны используется индексный буфер. Это не таблица, это просто массив целочисленных значений, каждое значение это индекс вершины следующего соединения , каждые три значения формируют треугольник. Для понимания картинка (http://www.e-reading.club/illustrations/143/143437-Any2FbImgLoader31)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 12 Ноябрь 2016, 19:19:45
LanuHum я не могу разобраться в коде предложенном вами.
В строке :
>>  me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
я не понимаю тут что за структура "ob"


>>  faces_verts = [f.vertices[:] for f in me_faces]
тут я не знаю наверное о каких то секретах синтаксиса Python.
Можете, пожалуйста, пояснить приведенные вопросы.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 19:58:45
Цитировать
LanuHum я не могу разобраться в коде предложенном вами.
В строке :
>>  me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
я не понимаю тут что за структура "ob"
Предположу, что LanuHum выложил "кастрированный" код...
Видимо, начало должно выглядеть так:
Код
import bpy
ob=bpy.context.object

Остального не знаю... И мне непонятно с чего ты взял, что координаты вершины должны быть целыми переменными (int), а не вещественными (float) ?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 19:59:23
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 из объекта.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 20:01:42
Остального не знаю... И мне непонятно с чего ты взял, что координаты вершины должны быть целыми переменными (int), а не вещественными (float) ?
int, float... это ты о чём?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 20:04:48
Это я о типах переменных...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 20:11:50
Это я о типах переменных...
Наверное, я что-то упустил. Я не видел, где там выше и кто писал о типах переменных...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 20:15:48
....а действительно, картинка меня сбила с толку и немного невнимательно прочёл... Извиняюсь, Bulbash, если речь про порядковые индексы, то конечно целые числа...
Может быть это чем-то поможет: http://blender.stackexchange.com/questions/36577/how-are-vertex-indices-determined
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 20:30:52
Я как писатель своего движка выбрал блендер (он бесплатен). Раньше я пользовался .obj форматом вполне успешно.
Но настало время использовать скелетную анимацию. И я понял что проще и эффективнее всего будет написать свой скрипт для экспорта. Изучил синтаксис языка Python и посмотрел пару видеуроков как им пользоваться в Blender смог создать в меню File->Export нужную мне клавишу. Но уже два дня никак не могу понять как мне ПРОГРАМНО посчитать количество мэшей в сцене(т.е проигноривать остальные обьекты такие как камера свет и прочее). Кто знает как это реализуется пожалуйста подскажите. Могу предоставить код уже написаного мной скрипта если кому надо.
Только сейчас прочитал с чего всё началось. Дело в том, что, если брать из API данные в один файл типа: вершины, кости, ключи анимации, то в финале самому придётся рассчитывать все деформации. Только недавно с Samovar мы об этом беседовали...
На мой взгляд, если честно, то уже и редактор в свой движок дописать легче, чем юзать Блендер.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 20:48:11
Не, я малёха другое тогда имел ввиду, т.к. ты хотел скорость. И предлагал нижеперечисленное читать из памяти или из Blend-файла, минуя экспорт с помощью Python в свой формат:
http://www.atmind.nl/blender/mystery_ot_blend.html
http://www.atmind.nl/blender/blender-sdna.html
... а если скорости не надо, то вполне достаточно знаний Python и его API к Блендеру, чтобы написать экспортёр в свой формат...это программно  реализовать на  Python проще гораздо... Но я ни того ни другого не знаю, увы, чтобы чем-то помочь :)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 20:54:16
Вообще-то, мне на сайте поврея разработчик оффициальной версии экспортёра povray давал ссылку вот на эту лабуду:
https://wiki.blender.org/index.php/Dev:2.5/Source/Architecture/RNA
Во все игровые движки, как и в другие программы работающие с 3д, очень бы было хорошо впилить блендер как чисто сишную библиотеку. Я в свою прогу впиливаю его как сишный модуль питона, а, вот надо бы впилить как сишную библиотеку, чтобы функции возвращали не PyObject, а С структуры.
Умереть не встать...
Жил бы я в деревне, ел бы я блины...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 20:56:35
... а если скорости не надо, то вполне достаточно знаний Python и его API к Блендеру, чтобы написать экспортёр в свой формат...это программно  реализовать на  Python проще гораздо... Но я ни того ни другого не знаю, увы, чтобы чем-то помочь :)
Свой движок чел пишет для чего? Подозреваю, что для игры. Это что за игра, не требующая скорости в 2016 году?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 12 Ноябрь 2016, 21:03:01
LanuHum я уж ухватился за блендер (на другом форуме посоветовали). Поэтому буду ковыряться тут.
Лучше подскажите мне правильно ли понял я ваш код:
faces_verts = [] - обьявляю массив
for f in me_faces: - иду в цикле по индексам
    face_verts.append(f.vertices[:]) - добавляю в массив нужные мне данные

если все правильно поясните как узнать размер массива faces_verts.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 21:04:24
Цитировать
Свой движок чел пишет для чего? Подозреваю, что для игры. Это что за игра, не требующая скорости в 2016 году?
Дык, он же для того экспортёр в свой формат (формат своего движка) и пытается написать, что бы была скорость и не было лишней инфы, которая жрёт память... и этот экспорт происходит только один раз, а не как в твоём случае для фотореалистичного рендера  - покадрово... так что ему нечего беспокоится о скорости, ему просто надо конвертнуть необходимый контент в свой формат  и оптимизировать его один раз, "который будет проигрывать его движок"...
Под скоростью, имелась ввиду скорость экспорта / импорта :)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 21:15:09
LanuHum я уж ухватился за блендер (на другом форуме посоветовали). Поэтому буду ковыряться тут.
Лучше подскажите мне правильно ли понял я ваш код:
faces_verts = [] - обьявляю массив
for f in me_faces: - иду в цикле по индексам
    face_verts.append(f.vertices[:]) - добавляю в массив нужные мне данные

если все правильно поясните как узнать размер массива faces_verts.
size = len(faces_verts)
Цитировать
Свой движок чел пишет для чего? Подозреваю, что для игры. Это что за игра, не требующая скорости в 2016 году?
Дык, он же для того экспортёр в свой формат (формат своего движка) и пытается написать, что бы была скорость и не было лишней инфы, которая жрёт память... и этот экспорт происходит только один раз, а не как в твоём случае для фотореалистичного рендера  - покадрово... так что ему нечего беспокоится о скорости, ему просто надо конвертнуть необходимый контент в свой формат  и оптимизировать его один раз, "который будет проигрывать его движок"...
Ты в этом хорошо шаришь, я нуб. Нет, я не подъёхиваю. Я знаю одно, что даже очень отличный программист может очень далеко стоять от крутой идеи, также, как и тракторист может нести идею программисту, а тот, весь из себя, не слышыт полезного совета, типа, я ж программист, а ты - тракторист. Поэтому, я говорю, что шаришь. Ты понимаешь механизмы работы этих игр. Я не понимаю. Я никогда не интересовался играми, потому что главная игра - жизнь у меня не играется.  :)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 21:25:39
Цитировать
Ты понимаешь механизмы работы этих игр. Я не понимаю.
Да чего тут понимать? Суть то одна и таже. Просто он из Блендера берёт только, то что умеет его движок,  а тебе для экспорта в POV-ray всё равно придётся покадрово экспортировать, т.к. он сам тебе ни физику, ни остальное не посчитает, а парню это не надо, его движок это сам рассчитывает... У вас принципиально разные задачи...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 21:32:09
Цитировать
Ты понимаешь механизмы работы этих игр. Я не понимаю.
Да чего тут понимать? Суть то одна и таже. Просто он из Блендера берёт только, то что умеет его движок,  а таебе для экспорта в POV-ray всё равно придётся покадрово экспортировать, т.к. он сам тебе ни физику, ни остальное не посчитает, а парню это не надо, его движок это сам рассчитывает... У вас принципиально разные задачи...
Всё-равно не понимаю. На хрена ему кости, если не важно знать в каком кадре какая кость куда повёрнута?
Я представляю, что движок рассчитывает варианты положения вершин при определённой ситуации, типа, падение перса, кувырок там какой-то. Но, зачем кости тогда, если можно держать в памяти скомпилированные позиции?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 21:39:03
Игровые движки давно уже считают скелетную анимацию и производители видюх активно продвигают физические ускорители типа PhysX (Nvidia). Это всё считается не процом... Ты ж пойми, что это реалтайм :)  Тебе надо хотя бы в Half-Life  2 (2004 г.) погонять  https://ru.wikipedia.org/wiki/Half-Life_2
или посмотреть видео...
https://youtu.be/Ka7ObnyGfnM
сейчас игры гораздо круче...

Можешь скачать этот движок https://ru.wikipedia.org/wiki/Unreal_Engine
https://www.unrealengine.com/unreal-engine-4
Он с недавнего времени бесплатен, пока ты не занимаешься коммерческой деятельностью на нём...
Цитировать
Текущая политика лицензирования: Unreal Engine 4
2 марта 2015 года Unreal Engine 4 стал бесплатным. Однако, разработчики игр, как и прежде, должны передавать 5 % от прибыли игры компании Epic Games, но при условии, что доходы игры составляют более $3000 за квартал.
Видео https://youtu.be/JA5VlncAr74
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 12 Ноябрь 2016, 22:44:11
>> Unreal Engine 4
... по ходу для разработки под него нужно хорошее железо, а вот unity3d по сравнению с ним шустрик ...
... кстати, unity3d умеет такое https://www.youtube.com/watch?v=SKpKlh1-en0  https://www.youtube.com/watch?v=9Rwd26k7K-E
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 22:56:39
Игровые движки давно уже считают скелетную анимацию и производители видюх активно продвигают физические ускорители типа PhysX (Nvidia). Это всё считается не процом... Ты ж пойми, что это реалтайм :)  Тебе надо хотя бы в Half-Life  2 (2004 г.) погонять  https://ru.wikipedia.org/wiki/Half-Life_2
или посмотреть видео...
https://youtu.be/Ka7ObnyGfnM
сейчас игры гораздо круче...

Можешь скачать этот движок https://ru.wikipedia.org/wiki/Unreal_Engine
https://www.unrealengine.com/unreal-engine-4
Он с недавнего времени бесплатен, пока ты не занимаешься коммерческой деятельностью на нём...
Цитировать
Текущая политика лицензирования: Unreal Engine 4
2 марта 2015 года Unreal Engine 4 стал бесплатным. Однако, разработчики игр, как и прежде, должны передавать 5 % от прибыли игры компании Epic Games, но при условии, что доходы игры составляют более $3000 за квартал.
Видео https://youtu.be/JA5VlncAr74
Вот, не хочется мне всего этого знать. Стар я. Я ужасно злюсь, когда не понимаю чужой код, а тут такое...nvidia..
Вообще, интересно, как производители железа берут потихоньку власть в свои руки...бестии...
Интересно в плане: чем же ж всё закончится...или...не интересно...
Странно были разрисованы питерские маршрутки: В КАЖДОМ ИЗ НАС ЖИВУТ ДВОЕ...это ломало моё представление о мире, разбивало его в пух и прах...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 23:00:12

Цитировать
... по ходу для разработки под него нужно хорошее железо, а вот unity3d по сравнению с ним шустрик ...
Да как угодно :) Это просто, как пример возможностей реалтаймового виза и физики... BGE не плох и B4W... смотря под какие задачи... Я последние лет 10 вообще в 3D-игры не особо... Если и играюсь нечасто, то в 2D или в 2,5D казуалки... Одна из любимых "Don't Starve"
Цитировать
Вообще, интересно, как производители железа берут потихоньку власть в свои руки...бестии...
Угу :) https://youtu.be/xjsCdwHSIzw Несчастная баба :)

Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 12 Ноябрь 2016, 23:09:23

Цитировать
... по ходу для разработки под него нужно хорошее железо, а вот unity3d по сравнению с ним шустрик ...
Да как угодно :) Это просто, как пример возможностей реалтаймового виза и физики... BGE не плох и B4W... смотря под какие задачи... Я последние лет 10 вообще в 3D-игры не особо... Если и играюсь нечасто, то в 2D или в 2,5D казуалки... Одна из любимых "Don't Starve"
Двойственное, во что я играл - это ши сен сё и break out...
Ши сен сё - самая крутая игра с настройками по умолчанию... и не надо запрашивать усложнения в настройках...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Ноябрь 2016, 23:23:15
В Маджонг как-то не доводилось... вторая знакома ) Первым делом воплощались настольные игры, типа шахмат, шашек, рэндзю... но и дофига нового появилось... люблю стратегии и квесты с нелинейным сценарием...
А вообще - это моя первая домашняя видеоигра в детстве ( или аналогичная, точно уже не помню) :)
(http://img.zoneland.ru/images6/612507russian_eggs_2.png.jpg)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 13 Ноябрь 2016, 00:59:35
В Маджонг как-то не доводилось... вторая знакома ) Первым делом воплощались настольные игры, типа шахмат, шашек, рэндзю... но и дофига нового появилось... люблю стратегии и квесты с нелинейным сценарием...
А вообще - это моя первая домашняя видеоигра в детстве ( или аналогичная, точно уже не помню) :)
(http://img.zoneland.ru/images6/612507russian_eggs_2.png.jpg)
Блин, опять мы с тобой во флудеры записываемся. Лет 12 назад жил в Купчино, а к хозяйке квартиры приехала сестра с мальчонкой лет десяти с Украины. У меня тогда стояла винда. Мальчонке я купил Х, по-моему, оно так называлось. Он просыпался раньше меня, до шести ноль ноль, чтобы просить меня попасть в мою комнату и поиграть, а когда я возвращался с работы, он рассказывал мне, в каких галактиках он побывал. У него отчёт был на листке бумаги. "Дядь Лёнь, дядь Лёнь, глянь, я уже почти дома..." Там из-за сбоя в работе двигателя космический корабль оказывался на неизвестной территории вселенной со сломанным оборудованием. Экипаж должен был торговать, приобретая оружие, имея оружие должен был сопровождать за деньги, защищая от пиратов просящих защиты, и, не знаю как должен был найти наш Млечный Путь, чтобы вернуться домой.
По сей день эту игру считаю единственно достойной внимания. Но, перед игрой нужно пройти тест проведения корабля через какие-то там кольца. Мальчонка проходил, я врезался в третье-четвёртое кольцо...а колец было не меньше десятка...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 13 Ноябрь 2016, 12:51:36
Разобрался! Все оказалась вовсе не сложно вот ссылка на англоязычный форум с вопросом про индексы:
http://blender.stackexchange.com/questions/3637/get-indices-of-vertices-of-triangulated-faces-in-python
Я также столкнулся с проблемой что в Blender существует два типа полинона квадратный и треугольный, в DX11 насколько я знаю использутся только треугольный, решилось все очень просто :
http://blender3d.org.ua/forum/modeling/151.html
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 13 Ноябрь 2016, 14:11:31
решилось все очень просто :
Это решение ни всегда может помочь. Там же мы когда-то об этом беседовали. Четырехугольник можно разрезать двумя вариантами. На изгибах будет видно, правильно разрезалось или нет.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 13 Ноябрь 2016, 14:29:58
Опять же таки при экспорте нет необходимости портить свой меш, превращая четырехугольники в треугольники.
Пишем функцию:
Код
def mesh_triangulate(me):
    import bmesh
    bm = bmesh.new()
    bm.from_mesh(me)
    bmesh.ops.triangulate(bm, faces=bm.faces)
    bm.to_mesh(me)
    bm.free()
Затем используем её по назначению:
Код
     me = ob.to_mesh(scene, True, 'RENDER',calc_tessface=True)
     mesh_triangulate(me)
И, не забываем после экспорта объекта удалить me
Код
bpy.data.meshes.remove(me)

Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 13 Ноябрь 2016, 19:13:30
Очередная проблема... Захотел реализовать код предоставленный LanuHum выше. Объявил функцию и попробовал ее использовать. Указывает в место, куда я ее вставляю и пишет "name mesh_triangulate is not defined" : я понимаю что он указывает мне что я не определил ее но тем не менее она определена строкой выше. Если верить всем статьям которые я прочитал про питон, синтаксис правильный. Подскажите, в чем беда?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 13 Ноябрь 2016, 19:34:00
Очередная проблема... Захотел реализовать код предоставленный LanuHum выше. Объявил функцию и попробовал ее использовать. Указывает в место, куда я ее вставляю и пишет "name mesh_triangulate is not defined" : я понимаю что он указывает мне что я не определил ее но тем не менее она определена строкой выше. Если верить всем статьям которые я прочитал про питон, синтаксис правильный. Подскажите, в чем беда?
Ну, а текст кода где? Как ошибку искать-то?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 13 Ноябрь 2016, 20:29:49
Извините, не подумал вот :
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 13 Ноябрь 2016, 20:41:34
...
def mesh_triangulate(self,me):
...
self.mesh_triangulate(mesh)
...

либо выносить определение mesh_triangulate вне класса
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 13 Ноябрь 2016, 20:50:34
Извините, не подумал вот :
Нужно вынести функцию за пределы класса:
Код
import bmesh


def mesh_triangulate(me):
   bm = bmesh.new()
   bm.from_mesh(me)
   bmesh.ops.triangulate(bm, faces=bm.faces)
   bm.to_mesh(me)
   bm.free()

class KfoExport(bpy.types.Operator):
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 13 Ноябрь 2016, 21:05:02
Спасибо sungreen, все работает!
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 13 Ноябрь 2016, 21:26:21
Спасибо sungreen, все работает!
Ну, если тебе всё же хочется, чтобы после экспорта сетка оригинала состояла из треугольников, то нормально, но, я всё же писал бы так:
Код
        File = open(self.filepath + ".kfo", 'wb')
         
        meshesCout  = len(bpy.data.meshes)# тут я узнаю сколько у меня мэшей
         
        File.write(np.int32(meshesCout)) # сохраняю количество мэшей

        for ob in bpy.data.objects:
            if ob.type == 'MESH':
                mesh = ob.to_mesh(scene, True, 'RENDER',calc_tessface=False)
                mesh_triangulate(mesh)

                File.write(np.int32(len(mesh.vertices)))
                for vert in mesh.vertices:
                    File.write(np.float32(vert.co.x)) # Х кордината вертекса
                    File.write(np.float32(vert.co.y)) # Y кордината вертекса
                    File.write(np.float32(vert.co.z)) # Z кордината вертекса
                    File.write(np.float32(0)) # значение падинг для уравнения в передачи вшейдер
                    File.write(np.float32(0)) # X кордината текстуры
                    File.write(np.float32(0)) # Y кордината текстуры
                    File.write(np.float32(0)) # X кордината нормали
                    File.write(np.float32(0)) # Y кордината нормали
                    File.write(np.float32(0)) # Z кордината нормали
                    File.write(np.float32(0)) # X кордината тангента
                    File.write(np.float32(0)) # Y кордината тангента
                    File.write(np.float32(0)) # Z кордината тангента

                size = len(mesh.polygons) * 3
                File.write(np.int32(size))
                for face in mesh.polygons:
                    File.write(np.int32(face.vertices[2]))
                    File.write(np.int32(face.vertices[1]))
                    File.write(np.int32(face.vertices[0]))
                bpy.data.meshes.remove(mesh)
        File.close()
При такой записи после экспорта твой меш останется таким, каким и был до экспорта, ты можешь дальше продолжать над ним работать...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 16 Ноябрь 2016, 20:22:15
Спасибо за помощь LanuHum.
Но уже возникла проблема другого характера. С позицией точки, нормалью и индексацией я разобрался (это минимум чтобы выгрузить в мой движок), я выгрузил и все заработало как надо, возникла новая проблема, я не понимаю как мне получить координату текстуры. Вот я нашел страницу описания где описывается вершина https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.MeshVertex.html#bpy.types.MeshVertex но в упор не вижу того что отвечает за текстурную координату в вершине. Подскажите пожалуйста.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 16 Ноябрь 2016, 20:39:26
... вот есть описание и примерчик ...
https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Mesh.html?highlight=uv#bpy.types.Mesh.uv_textures
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 16 Ноябрь 2016, 22:45:13
В папке с аддонами при Блендере достаточно экспортёров, из которых можно извлечь хорошие уроки.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 17 Ноябрь 2016, 21:14:48
Работал с текстурными координатами. И в экспортерах других форматов, и на различных сайтах  заметил такой код :
bpy.context.active_object.data.uv_textures.active.data[ face_index ].uv
но у меня при использовании пишет ошибку... вот скриншот ошибки:
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 17 Ноябрь 2016, 21:24:13
... у тебя нет развёртки ...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 17 Ноябрь 2016, 21:57:39
... у тебя нет развёртки ...
Скорее, не выделен объект, или выделен объект не имеющий data
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 18 Ноябрь 2016, 15:15:45
Пробовал создать развертку. Не помогло... Переглядел еще тучу примеров не один не работает, или я что то не так делаю или версия Blender не та. Есть ли способ просто взять для каждой вершины эту uv координату? Документацию смотрел со всех сторон везде каккието косвенно связанные параметры и функции но нет конкретного рабочего примера.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 18 Ноябрь 2016, 18:11:13
Пробовал создать развертку. Не помогло... Переглядел еще тучу примеров не один не работает, или я что то не так делаю или версия 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[:]
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 18 Ноябрь 2016, 22:37:25
LanuHum код выложенный вами действительно работает (ошибок во всяком случае не выдаёт). Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации. Подскажите если я не правильно понимаю что в этом коде происходит, а если я все правильно все понял то нужен пример как получить все эти  координаты для каждой вершины в порядке как они иду в мэше.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 19 Ноябрь 2016, 05:35:49
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

... вопрос такой - у нас есть два полигона 6 вершин и есть uv развёртка с 8 точками для этих полигонов ...
... как должна выглядеть твоя таблица? ...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 19 Ноябрь 2016, 08:46:11
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

... вопрос такой - у нас есть два полигона 6 вершин и есть uv развёртка с 8 точками для этих полигонов ...
... как должна выглядеть твоя таблица? ...
Вот именно. Одной вершине может принадлежать несколько текстурных координат. Так что, специфику движка нужно корректировать. :)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 19 Ноябрь 2016, 14:39:30
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

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

Да, видимо в Blender все так и и устроено, но в DX11 (как я понимаю) для каждой точки есть конкретная одна текстурная координата. Так как я раньше работал с Obj форматом то знаю что Blender может сохранить этот параметр так как мне надо (ведь в Obj все именно так реализовано). Пробовал в папке с аддонами найти экспортер в Obj но не нашел.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 19 Ноябрь 2016, 15:20:27
>> Но как я понимаю тут код по получению текстурных координат из полигонов. А специфика моего движка такова что мне нужна эта координата для каждой вершины в порядке их индексации.

... вопрос такой - у нас есть два полигона 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
Вот для этой картинки:
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 20 Ноябрь 2016, 14:03:24
Пробовал создать развертку. Не помогло... Переглядел еще тучу примеров не один не работает, или я что то не так делаю или версия 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. Поясните пожалуйста что я мог сделать не так.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 20 Ноябрь 2016, 16:13:14
Выцепил из стороннего кода работу с 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 координаты (в порядке как у меня мэш сформирован или в какой другой закономерности) в соответствии с этим кодом
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 20 Ноябрь 2016, 16:41:10
Присмотрелся к этому коду повнимательнее, попробовал. Ошибок не выдает но почему то  lenfaces всегда 0. Поясните пожалуйста что я мог сделать не так.
У тебя написано calc_tessface=True? Ноль будет, если calc_tessface= False
Цитировать
Выцепил из стороннего кода работу с uv развертками
Опять 25...
Ищи автора этого кода и пытай его. :) :) :)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 09 Декабрь 2016, 14:12:14
Новый вопрос. Я получил мэш, собственно тут я все сделал правильно, но в блендере есть также Rotation и Scale для каждого объекта, и у меня мэш приходит без учета этих параметров. Как получить мэш с учтенными  Rotation и Scale?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 09 Декабрь 2016, 17:07:46
Новый вопрос. Я получил мэш, собственно тут я все сделал правильно, но в блендере есть также Rotation и Scale для каждого объекта, и у меня мэш приходит без учета этих параметров. Как получить мэш с учтенными  Rotation и Scale?
co = ob.matrix_world * vert.co
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 17 Декабрь 2016, 16:07:33
Подскажите пожалуйста. Как извлекать скелетную анимацию? В каком формате будут данные о скелетной анимации, на выходе?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 17 Декабрь 2016, 16:29:53
Цитировать
Как извлекать скелетную анимацию?
Почитай эту страничку. Там про работу с костями и действиями.
http://blender3d.org.ua/book/Code_Snippets_25/Actions%20and%20drivers.html

Цитировать
В каком формате будут данные о скелетной анимации, на выходе?
Ты же, вроде, свой собственный движок пишешь. Как твоему движку требуется, в таком виде и экспортируй.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 17 Декабрь 2016, 16:57:03
Попробовал поэкспериментировать с единственной костью в арматуре, задал ей пару ключевых кадров:
Код
>>> ob=bpy.data.objects['Armature']
>>> action = ob.animation_data.action
>>> fcu=action.fcurves
>>> for fc in fcu:
...     print(fc.data_path, "index=", fc.array_index)
...     
pose.bones["Bone"].location index= 0
pose.bones["Bone"].location index= 1
pose.bones["Bone"].location index= 2
pose.bones["Bone"].rotation_quaternion index= 0
pose.bones["Bone"].rotation_quaternion index= 1
pose.bones["Bone"].rotation_quaternion index= 2
pose.bones["Bone"].rotation_quaternion index= 3
pose.bones["Bone"].scale index= 0
pose.bones["Bone"].scale index= 1
pose.bones["Bone"].scale index= 2

Соотвествие индексов: 0 - x, 1 - y, 2 - z

Численные значения координат:

Код
>>> for frame in range(10):
...     print ("кадр=", frame, "x=", fcu[0].evaluate(frame))
...     
кадр= 0 x= 0.0
кадр= 1 x= 0.0
кадр= 2 x= 0.0018280739895999432
кадр= 3 x= 0.007335450500249863
кадр= 4 x= 0.016550853848457336
кадр= 5 x= 0.029494034126400948
кадр= 6 x= 0.046174466609954834
кадр= 7 x= 0.06658995151519775
кадр= 8 x= 0.09072526544332504
кадр= 9 x= 0.1185506209731102
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 17 Декабрь 2016, 18:38:11
Striver
Можно ли экспорт анимации реализовать по следующему плану:
1) Перебирать в цикле все объекты.
2) Узнавать, есть ли в них арматура.
3) Если есть, узнать общее количество кадров для этой арматуры, узнать какие из них ключевые.
4) Перебирать в цикле все ключевые кадры.
5) Перебирать в цикле все кости арматуры.
6) Получать характеристики той или иной кости в определенный ключевой кадр.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 17 Декабрь 2016, 21:34:31
Цитировать
1) Перебирать в цикле все объекты.
Я думал, что с этим-то ты разобрался
Код
for ob in bpy.data.objects:
что-то сделать с ob
Хотя я, если когда-нибудь буду делать экспортёр, не стану перебирать в цикле все объекты, буду работать только с одним, активным объектом, мне кажется, так правильно.

Цитировать
Узнавать, есть ли в них арматура.
Код
for mod in ob.modifiers.values():
if mod.type == 'ARMATURE':
значит mod - это арматура, что-то с ней сделать
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 18 Декабрь 2016, 09:26:09
Цитировать
3) Если есть, узнать общее количество кадров для этой арматуры, узнать какие из них ключевые.
Код
# amt - объект арматуры, его получение см п.2
act=amt.animation_data.action # действия арматуры
# в act.frame_range находится 1 и последний кадры этой арматуры

как найти ключевые кадры, я так и не понял

Цитировать
5) Перебирать в цикле все кости арматуры.

Код
#данные по костям в режиме редактирования:
# amt - объект арматуры, его получение см п.2
amtd=amt.data # данные арматуры
for bone in amtd.bones:
что-то делать с костью bone
   
Код
#данные по костям в режиме позы:
for bone in amt.pose.bones:
что-то делать с костью bone
   
получение координат в режиме позы я описал вчера:

Код
fcu=act.fcurves
fcu[n] - кривая анимации номер n у арматуры
список кривых такой же, как в окне Экспозиционного листа
всего кривых - len(fcu)

для кривой №0:
fcu[0].data_path - название этой кривой (внутри есть название кости, его можно выцепить оттуда)
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
fcu[0].range() - 1 и последний кадры этой кривой
fcu[0].keyframe_points - список ключевых кадров этой кривой
fcu[0].keyframe_points[0].co - данные по 1 ключевому кадру этой кривой
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 18 Декабрь 2016, 11:16:26
Striver, извиняюсь за глупый вопрос, но не разобрался что вы имели ввиду под "# amt - объект арматуры, его получение см п.2" . Если п.2 - это пункт 2 , то как связаны выражение :
Код
 
for mod in ob.modifiers.values():
    if mod.type == 'ARMATURE':
 
и amt?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 18 Декабрь 2016, 13:39:50
Ну да, я не связал их, извини
если mod - модификатор арматуры у меш-объекта, то его объект-арматура получается так:

Код
amt=mod.object

или, если объединить со 2 пунктом:
Код
for mod in ob.modifiers.values():
    if mod.type == 'ARMATURE':
        amt=mod.object

Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 18 Декабрь 2016, 16:16:57
Striver большое спасибо вам за помощь. Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ? И fcu я так понял это собственно и есть анимации, те кривые по которым двигаются кости.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 18 Декабрь 2016, 16:57:42
Striver большое спасибо вам за помощь. Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ? И fcu я так понял это собственно и есть анимации, те кривые по которым двигаются кости.
Режим редактирования не даёт полезных данных об анимации. Это всего лишь начальные свойства кости.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 18 Декабрь 2016, 17:13:31
Цитировать
Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ?
Цитировать
Это всего лишь начальные свойства кости.
Не так уж и "всего лишь". Я не представляю, как можно писать движок, не используя эти начальные свойства.
Кости в режиме редактирования - первоначальная поза арматуры.
Кости в режиме позы - арматура в конкретной позе, она разная для разных действий и кадров.

Я в своём "недодвижке" до скелетной анимации так и не дошёл, но уверен, что там понадобится и то, и другое.

Цитировать
И fcu я так понял это собственно и есть анимации, те кривые по которым двигаются кости.
Я это и написал:
Цитировать
fcu[n] - кривая анимации номер n у арматуры
список кривых такой же, как в окне Экспозиционного листа
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 18 Декабрь 2016, 22:42:06
Не так уж и "всего лишь". Я не представляю, как можно писать движок, не используя эти начальные свойства.
Я плохо понимаю, собственно, сам вопрос
Цитировать
Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ?
Практически, в Блендере нет данных по костям в отдельных режимах. Есть, просто, данные.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 20 Декабрь 2016, 22:35:03
Подскажите, как получить веса костей для некоторой вершины.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 21 Декабрь 2016, 04:40:58
... глубоко этот вопрос не копал, но в Сети пишут что прямой функции API нет и нужно делать обход списков ...
... вот посмотри этот код  http://blender.stackexchange.com/questions/621/return-list-of-associated-vertex-index-weight-values-for-a-given-vertex-group  , в нем создаётся на каждую вершины список групп с весами ...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 21 Декабрь 2016, 16:58:12
... глубоко этот вопрос не копал, но в Сети пишут что прямой функции API нет и нужно делать обход списков ...
Тоже не нашёл определения веса.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 21 Декабрь 2016, 18:26:59
Возникла еще одна фундаментальная проблема. Смог с вашей помощью  достучаться до вот такой структуры каждой кости: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Bone.html#bpy.types.Bone . Нашел в ней такого плана переменную parent_index (как я понимаю это индекс материнской кости для данной кости). Как получить массив аналогичных индексов но для всех дочерних костей?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 22 Декабрь 2016, 08:07:02
Цитировать
Как получить массив аналогичных индексов но для всех дочерних костей?
Так тут же (по приведённой тобой ссылке) есть свойство children. Там коллекция дочерних костей.
вот что в консоли видно на эту тему:
Код
>>> ob.data.bones[0]
bpy.data.armatures['Armature'].bones["Bone"]

>>> ob.data.bones[0].children
bpy.data.armatures['Armature'].bones["Bone"].children

>>> list(ob.data.bones[0].children)
[bpy.data.armatures['Armature'].bones["Bone.001"], bpy.data.armatures['Armature'].bones["Bone.002"]]
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 22 Декабрь 2016, 12:21:57
Вы не много не поняли. Мне ненужен доступ к данным о дочерней кости, мне нужен конкретно ее индекс в общем список. Это нужно чтоб я просто сохранил целиком список всех костей, а уже затем в своем движке по индексам в этом списке смог получить информацию о дочерних костях из общего списка.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 22 Декабрь 2016, 15:33:55
Вы не много не поняли. Мне ненужен доступ к данным о дочерней кости, мне нужен конкретно ее индекс в общем список. Это нужно чтоб я просто сохранил целиком список всех костей, а уже затем в своем движке по индексам в этом списке смог получить информацию о дочерних костях из общего списка.

Код
import bpy
for key,value in enumerate(bpy.context.object.data.bones):
    print(key,value.name)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 22 Декабрь 2016, 15:41:55
Цитировать
Вы не много не поняли.
Ну, теперь я тем более не понял. Был вопрос про дочерние кости, я показал, что свойство .children выдаёт коллекцию дочерних костей. Если нужен их список, применяется list(...). Индексами в коллекции являются имена костей ("Bone.001", "Bone.002" и т.д.), т.к. коллекция эмулирует словарь.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 22 Декабрь 2016, 21:44:04
Мне нужно получить ЧИСЛОВОЕ значение индекса дочерней кости в коллекции. Можно ли это реализовать?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: LanuHum от 23 Декабрь 2016, 10:22:57
Мне нужно получить ЧИСЛОВОЕ значение индекса дочерней кости в коллекции. Можно ли это реализовать?
А, я что написал?
Сравнивайте в цикле с value, получайте key.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 27 Декабрь 2016, 12:23:25
Можно ли из это структуры кости: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Bone.html#bpy.types.Bone, получить ее ротацию в виде кватерниона?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 27 Декабрь 2016, 14:30:30
Фиг его знает... Видимо, самому программно преобразовать:
http://www.gamedev.ru/code/articles/faq_matrix_quat
более конкретно, как преобразовать матрицу в кватернион:
http://www.gamedev.ru/code/articles/faq_matrix_quat?page=5#kvaternioni
http://www.gamedev.ru/code/articles/faq_matrix_quat?page=6
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 27 Декабрь 2016, 14:34:38
Можно ли из это структуры кости: https://www.blender.org/api/blender_python_api_2_78a_release/bpy.types.Bone.html#bpy.types.Bone, получить ее ротацию в виде кватерниона?
Это данные кости в режиме редактирования. Там есть координаты начала (head или head_local) и конца кости (tail или tail_local). Нет там никаких вращений.
А про данные в режиме позы я уже писал. Они в данных по конкретному действию (action) для конкретного кадра в анимации. И кватернион там тоже есть.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 28 Декабрь 2016, 13:36:01
Не понимаю причину не компиляции моего скрипта. Подскажите если кто понимает.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 28 Декабрь 2016, 14:09:32
Ох, и страшна твоя функция execute...
У меня ругалось на пробелы вначале строк (начиная со 136-й строки и далее). Питон очень чувствителен к количеству таких пробелов, а также к путанице пробелы-табуляция.
Вроде поправил, сейчас ошибок не выдаёт, но не уверен, что все уровни if правильно выставил, т.к. в самом коде разбираться неохота.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 28 Декабрь 2016, 15:41:18
Спасибо Striver.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 29 Декабрь 2016, 15:31:16
По непонятной мне причине Blender стал ругаться на строку: T = bone.matrix_local[0] + bone.matrix_local[5] + bone.matrix_local[10] + 1.
Пишет array index out of range (я так понял это выход за границы массива), но как тут может быть выход за границы массива если у меня матрица 4х4, 16 элементов а максимальный индекс до которого я пытаюсь достучаться 10?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 29 Декабрь 2016, 16:24:46
>> 16 элементов а максимальный индекс до которого я пытаюсь достучаться 10?
для теста сделай до этой команды
print(bone.matrix_local)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 03 Январь 2017, 12:41:45
Очередная загадочная ошибка. Код:
Код
               Vertex_Counter = 0
               while Vertex_Counter < (MeshSize[counter] / 12) :
                   GroupsCounter = 0
                   File.write(np.int32(VertexGroupsCount[counter][Vertex_Counter])) # записываю количесто групп для вершин
                   while GroupsCounter < VertexGroupsCount[counter][Vertex_Counter]:
                       
                        File.write(np.int32(Weightes_Indexes[counter][Vertex_Counter][GroupsCounter *2])) # индекс вертекс группы
                        File.write(np.float32(Weightes_Indexes[counter][Vertex_Counter][(GroupsCounter *2) + 1])) # вес
                       
                        GroupsCounter += 1
                   
                   
                   Veretex_Counter = Veretex_Counter + 1
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 03 Январь 2017, 13:42:23
Если ты не заметил, в сообщениях об ошибках указывается номер строки, желательно, чтобы и нам было видно, где какой номер строки, так разбираться проще.

Ошибка здесь переводится как "Локальная переменная 'Veretex_Counter' используется до присвоения". Т.е. ты первый раз используешь эту переменную, ещё не присвоив ей значения.
Так-то понятно, что у тебя лишняя буква e в названии переменной затесалась, и должно быть 'Vertex_Counter'. Исправь имя переменной.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 03 Январь 2017, 14:14:10
Понятно. Извините, нелепая ошибка.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 03 Январь 2017, 15:18:24
Цитировать
Извините, нелепая ошибка.
Не за что извиняться, у всех, кто пишет программы больше 10-ти строк, такие ошибки часто случаются.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 09 Февраль 2017, 21:18:38
Фух, наконец-то я добрался до анимации. Мне подсказывали код на счет кривых в экспозиционном листе.

fcu[n] - кривая анимации номер n у арматуры
список кривых такой же, как в окне Экспозиционного листа
всего кривых - len(fcu)

для кривой №0:
fcu[0].data_path - название этой кривой (внутри есть название кости, его можно выцепить оттуда)
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
fcu[0].range() - 1 и последний кадры этой кривой
fcu[0].keyframe_points - список ключевых кадров этой кривой
fcu[0].keyframe_points[0].co - данные по 1 ключевому кадру этой кривой

Узнал что такое экспозиционный лист(Dope Sheet). Но так и не смог понять что вы имели ввиду под кривыми. Поясните пожалуйста.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 09 Февраль 2017, 23:06:32
Цитировать
Но так и не смог понять что вы имели ввиду под кривыми
Открой редактор графов и увидишь. (Хотя, судя по всему, предпочитаешь английский интерфейс, тогда это называется Graph Editor). Каждая кривая соответствует какой-либо координате, участвующей в движении. А какая именно - сказано здесь:
Цитировать
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
Именно здесь хранится (или перевычисляется) информация о том, как меняются эти координаты при движении кости (или любого другого объекта).


Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 10 Февраль 2017, 18:34:47
Пробовал вывести len(fcu). И выходило что для скелета в котором было 21 кость возвращало 210, а в котором было 7 костей возвращало 70. Это значит что для каждой кости по 10 дуг? Почему это зависит от количесва костей а не от количества движений?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 10 Февраль 2017, 19:34:19
Цитировать
Это значит что для каждой кости по 10 дуг?
Пишу в третий раз:
Цитировать
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
3 параметра для location, 3 параметра для scale, 4 параметра для rotation_quaternion - всего 10 для каждой кости. Если делать ключи только для rotation_quaternion, т.е. только для вращения (а для костей в большинстве случае случаев этого хватает), то будет по 4 параметра, а не по 10.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 10 Февраль 2017, 20:03:35
Цитировать
Это значит что для каждой кости по 10 дуг?
Пишу в третий раз:
Цитировать
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
3 параметра для location, 3 параметра для scale, 4 параметра для rotation_quaternion - всего 10 для каждой кости. Если делать ключи только для rotation_quaternion, т.е. только для вращения (а для костей в большинстве случае случаев этого хватает), то будет по 4 параметра, а не по 10.
Спасибо вам БОЛЬШОЕ что вы повторяете по 3 раза, и все же мне совершенно не понятно. Вы писали ранее:

"fcu[n] - кривая анимации номер n у арматуры
список кривых такой же, как в окне Экспозиционного листа
всего кривых"

Что в вашем понимании анимация номер n? Это изменения кости номер n?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 10 Февраль 2017, 20:50:33
Bulbash, звиняй что влезаю, но у тебя есть понимание о том, что такое массив (список в Python)?
Массив - это набор однотипных переменных (список). В Переменные однотипны, но  могут быть любого типа, в том числе и указателями.

Striver пишет:
Цитировать
3 параметра для location
значит:
location[0] соответствует Х координате
location[1] соответствует Y координате
location[2] соответствует Z координате


Надеюсь, ясно...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 10 Февраль 2017, 20:56:42
Цитировать
Что в вашем понимании анимация номер n? Это изменения кости номер n?
Нет, не кости номер n. У костей вообще нет постоянных номеров, есть имена, коллекция костей эмулирует словарь, это я тоже уже писал.
повторю то, что писал две страницы назад:
Код
>>> ob=bpy.data.objects['Armature']
>>> action = ob.animation_data.action
>>> fcu=action.fcurves
>>> for fc in fcu:
...     print(fc.data_path, "index=", fc.array_index)
...     
pose.bones["Bone"].location index= 0
pose.bones["Bone"].location index= 1
pose.bones["Bone"].location index= 2
pose.bones["Bone"].rotation_quaternion index= 0
pose.bones["Bone"].rotation_quaternion index= 1
pose.bones["Bone"].rotation_quaternion index= 2
pose.bones["Bone"].rotation_quaternion index= 3
pose.bones["Bone"].scale index= 0
pose.bones["Bone"].scale index= 1
pose.bones["Bone"].scale index= 2
pose.bones["Bone.001"].rotation_quaternion index= 0
pose.bones["Bone.001"].rotation_quaternion index= 1
pose.bones["Bone.001"].rotation_quaternion index= 2
pose.bones["Bone.001"].rotation_quaternion index= 3
В данном случае у меня 2 кости. У кости "Bone" ключи определены для перемещения, масштаба и поворота, поэтому у неё 10 кривых. Для кости "Bone.001" определены только повороты, у неё 4 кривые. Всего у этой арматуры 14 кривых.
Посмотреть, за что отвечает кривая номер n, можно вызвав fcu[n].data_path и fcu[n].array_index (в своём коде я вызываю это в цикле).
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 12 Февраль 2017, 12:43:23
Подскажите, где можно внятно почитать об понятии кривой в Blender?
Может есть возможность просто получить данные о скелете в режиме позы, т.е в принципе не пользоваться кривыми, а просто узнать положение и поворот кости в определённый кадр?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 12 Февраль 2017, 13:41:31
Цитировать
Подскажите, где можно внятно почитать об понятии кривой в Blender?
http://b3d.mezon.ru/index.php/Blender_Basics_4-rd_edition/Chapter_9-_Animation_Basics
https://docs.blender.org/manual/en/dev/editors/graph_editor/index.html

Кривая анимации - общее понятие для любой анимационной системы. оно есть в Майе, Максе, Синьке, и даже в двумерных редакторах.

Цитировать
просто узнать положение и поворот кости в определённый кадр?
Для кривой n и кадра k численное значение координаты такое:
Код
fcu[n].evaluate(k)
выбирай все кривые, относящиеся к нужной тебе кости и смотри их координаты.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 12 Февраль 2017, 22:16:59
Подскажите, а описанная выше data_path  это тип данных строка, получается чтобы узнать к какой кости такое относиться кривая,что это вообще за данные (поворот, позиция или маштаб), надо просто выцеплять это из строки? Есть другой метод понять что это за данные?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 13 Февраль 2017, 00:18:32
Цитировать
надо просто выцеплять это из строки?
Ну я таки вас умоляю, Питон - один из удобнейших языков для работы со строковыми данными. А тут и работы-то никакой не нужно, весь разбор в трёх строчках кода.
Вот пример для 0-й кривой, в цикле можно аналогично для энной сделать:
Код
dp=fcu[0].data_path
skobka2=dp.find('"]')
bone=dp[12:skobka2]
napravlenie=dp[skobka2+3:]

print("кость=", bone, "   направление=",    napravlenie)

у меня выдало
Код
кость= Bone    направление= location

Цитировать
Есть другой метод понять что это за данные?
Может, и есть, но мне про него неизвестно.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 16 Февраль 2017, 14:21:24
Вопрос по ключевым кадрам. fcu[0].keyframe_points  - это массив ключевых кадров для данной кривой. Можно ли узнать из fcu[0].keyframe_points[0] какой это кадр по номеру? Если да, то как?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 16 Февраль 2017, 15:35:40
Цитировать
Можно ли узнать из fcu[0].keyframe_points[0] какой это кадр по номеру?
у этого объекта есть свойство .co, которое выдаёт вектор  (кадр, координата)

Код
>>> kf0=fcu[0].keyframe_points[0]
>>> kf0.co
Vector((1.0, 0.0))

Честно говоря, мне было бы лень разбираться с ключевыми кадрами. Тут кроме координат и номеров кадров нужно выяснять тип интерполяции, а потом в движке эту интерполяцию воспроизводить. Ведь кривая может быть линейной, скруглённой, или ступенчатой.
Проще тупо взять все координаты всех кадров (не думая, какие из них ключевые) с помощью fcu[n].evaluate(frame)) . Но так, конечно же, размер экспортированного файла вырастет.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 23 Февраль 2017, 17:55:18
Подскажите, когда пытаюсь выгрузить поворот выгружается не правильно. Дело видимо в том, что я в DX пользуюсь системой координат отличной от Blender (Y и Z поменяны местами),я попробовал просто в кватернионе их также поменять местами, но возникли проблемы, ротация вокруг Z (DX система), происходит не правильно и больше похожа на ротацию вокруг Y. Как грамотно рассчитать кватернион под мою систему координат?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 24 Февраль 2017, 12:49:06
Цитировать
Дело видимо в том, что я в DX пользуюсь системой координат отличной от Blender
Ну, если ты пишешь свой собственный движок, то, по идее, должен в таких вещах разбираться... Помнится, в Ogre3D я запарился, но разобрался с этими кватернионами. Не знаю, отличается ли это от DX (про него ничего не знаю).

В Огре оси поставлены так:
 x - слева-вправо
 y - снизу-вверх
 z - от камеры (от пользователя) - вглубь экрана

При такой постановке осей в экспортёре Огра сделано так:
Код
mathutils.Quaternion( [ vec.w, vec.x, vec.z, -vec.y] )

Не, знаю, поможет ли тебе чем-то, но это всё, что я сейчас про это могу сказать. Может, кто-нибудь тут ещё может ответить...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 11 Март 2017, 20:50:49
Подскажите, может можно, получить поворот кости в определенный кадр не в виде кватерниона, а в виде углов поворота вокруг осей (углов Эйлера)?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 11 Март 2017, 21:00:24
... посмотри пример вот в этой темке, там углы Эйлера ...
http://blender-3d.ru/forum/index.php/topic,1756.msg25181.html#msg25181
Код: python
def rot_bone(name,bone_name,axis,angle):
    ob = bpy.data.objects[name]
    bone = ob.pose.bones[bone_name]
    bone.rotation_mode = 'XYZ'
    bone.rotation_euler.rotate_axis(axis, math.radians(angle))
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 11 Март 2017, 21:52:05
sungreen,
 не понятно, а где вы указываете из какого кадра извлекаются углы поворотов?
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 12 Март 2017, 05:20:37
... в этом примере нет кадровки, тебе из этого нужен только код rot_bone ...
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Bulbash от 12 Март 2017, 10:07:52
Эта же функция (rot_bone), просто доворачивает кость, а мне нужно получить поворот кости в определенный кадр не в виде кватерниона а в виде углов поворота.
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: sungreen от 12 Март 2017, 15:43:30
... имеется ввиду прочитать или записать углы? ...
... там во втором примере код ...
Код
def rot_bone(name,bone_name,xyz_euler_angle):
    ob = bpy.data.objects[name]
    bone = ob.pose.bones[bone_name]
    bone.rotation_euler = xyz_euler_angle

... то есть если записать, то bone.rotation_euler = xyz_euler_angle , а если читать - xyz_euler_angle = bone.rotation_euler ...


 
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Samovar от 12 Март 2017, 16:18:38
Цитировать
не в виде кватерниона а в виде углов поворота.
а проблем потом не возникнет?
https://ru.wikipedia.org/wiki/Складывание_рамок


(https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Rotating_gimbal-xyz.gif/220px-Rotating_gimbal-xyz.gif)
Название: Re: Небходима помощь по написанию экспрта в свой формат на языке Python.
Отправлено: Striver от 01 Август 2018, 10:31:41
Делал-делал товарищ свой экспортёр, советовали ему тут всякое (и я в том числе), но неизвестно, доделал ли он его, и заработало ли всё это...

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

Ну, а о случаях, когда на кости наложены ограничения, даже задумываться страшно...