Вопросы по написанию плагинов

Список разделов Blender 3D Плагины

Описание: Обсуждение расширений для Blender
Модератор: exooman

Сообщение #101 Korchy » 09.05.2020, 08:59

ZiCVIZ писал(а):А вот как заставить пайчарм автоматом исполнять код в блендере ?

Если PyCharm - про, то можно настроить запуск Блендера срвером, будет как в вышеприведенном аддоне под VSC.
Если Комьюнити - то я делаю так https://b3d.interplanety.org/otladka-mnogofaylovogo-addona-v-blender-bystroy-pereustanovkoy/
Korchy M
Аватара
Сообщения: 2956



Сообщение #102 ZiCVIZ » 09.05.2020, 09:36

Вот меня совсем не радует то что VS Code отказывается исполнять скрипты ...
я понимаю что это у меня какойто касяк ... но я не понимаю где сабака порылась :(
ZiCVIZ M
Сообщения: 7

Сообщение #103 Pavel » 30.06.2020, 19:30

Как сделать преобразование нормалей из одной системы координат в другую? Я имею в виду split нормали (те нормали, которые указываются для сглаживания). Есть нормали для вершин, есть нормали для полигонов. А мне нужно преобразовать нормали для сглаживания. Количество этих нормалей равно количеству loop'ов.

У меня есть список нормалей из такой системы координат:

Ось X - смотрит вправо
Ось Y - смотрит вверх
Ось Z - смотрит вперёд

Этот список нормалей нужно преобразовать в блендеровскую систему:

Ось X - смотрит вправо
Ось Y - смотрит вперёд
Ось Z - смотрит вверх

Уже много пытался преобразовать (менял местами компоненты и т. д.), но результат не корректный получается. Либо у меня ошибка в другом месте, не в коде преобразования. Либо нормали такие странные. Не знаю.
Pavel M
Аватара
Сообщения: 1210

  • 1

Сообщение #104 mac7 » 02.07.2020, 00:16

Pavel писал(а):менял местами компоненты и т. д.

там еще инвертировать надо forward(+Y), up(Z) <-> forward(-Z), up (Y)
mac7 M
Аватара
Откуда: Луцьк
Сообщения: 338

Сообщение #105 Pavel » 02.07.2020, 00:30

mac7, что-то не помогло. Наверное ошибка в другом месте. Или нормали изначально такие. В общем, завтра посмотрю, может не правильно конвертирую нормали из byte в float. Просто в этом формате компонент нормали хранится в 8 битах.
Pavel M
Аватара
Сообщения: 1210

Сообщение #106 Korchy » 02.07.2020, 08:47

Pavel писал(а):Просто в этом формате компонент нормали хранится в 8 битах.
Ты их из бинарника читаешь? Тогда проверь, что байты в обратном порядке не хранятся.
Korchy M
Аватара
Сообщения: 2956



Сообщение #107 Pavel » 02.07.2020, 09:12

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

Добавлено спустя 3 часа 28 минут:
Посмотрел эти нормали. Заметил одну вещь. Если создать кастомные нормали у меша и значения нормалей будут идентичными, то кастомные нормали будут смотреть в разные стороны. Вот код:
Код: Выделить всё
import bpy


m = bpy.context.object.data
norms = [(1.0, 1.0, 0.0), ] * len(m.loops)
m.normals_split_custom_set(norms)
Изображение

Почему это происходит? Как вообще эти нормали вычисляются? Они имеют глобальное пространство? Или домножаются на нормаль полигона?
Pavel M
Аватара
Сообщения: 1210

Сообщение #108 Pavel » 06.07.2020, 20:23

С нормалями разобрался. Возник другой вопрос:
есть ли аналог этого оператора, но для модуля bmesh?:
Код: Выделить всё
bpy.ops.mesh.set_normals_from_faces()
Искал, не нашёл. Этот оператор устанавливает sharp edges, учитывая угол сглаживания (Smooth Angle). Мне нужно пометить рёбра как sharp.

Мне нужно именно для bmesh, так как экспортёр настолько сросся с этим модулем, что переписывать его для bpy.ops.mesh не имеет смысла. И не удобно использовать bpy.ops.mesh, так как каждый раз нужно включать режим редактирования, а на больших мешах это занимает время. И не удобно это: использовать везде bmesh, а для этой операции создавать временный меш, выделять его, включать режим редактирования и вызывать bpy.ops.mesh.set_normals_from_faces()
Pavel M
Аватара
Сообщения: 1210

Сообщение #109 Pavel » 20.11.2020, 13:58

Всем привет.
Уже много пытаюсь модифицировать позиции частиц во время рендеринга. Ничего не получается. Вот этот код отказывается работать:

Код: Выделить всё
import bpy


@bpy.app.handlers.persistent
def render_init_handler(scene):
    loc = [2.0] * 8 * 3
    obj = bpy.data.objects['1']
    deps = bpy.context.evaluated_depsgraph_get()
    par_sys = obj.evaluated_get(deps).particle_systems['1']
    par_sys.particles.foreach_set('location', loc)
    deps.update()
    bpy.context.scene.update()


bpy.app.handlers.render_init.append(render_init_handler)
bpy.app.handlers.render_pre.append(render_init_handler)
bpy.app.handlers.render_post.append(render_init_handler)

Вот сцена для примера. Нужно запустить скрипт и сделать рендер кадра. Частицы не переместятся в точку (2, 2, 2).

Как всё таки перемещать частицы во время рендеринга?
Вложения
partest.zip
(75 КБ) Скачиваний: 21
Pavel M
Аватара
Сообщения: 1210

Сообщение #110 Pavel » 20.01.2021, 16:10

Всем привет.

У меня вопрос такой появился:

Как написать тесты для интерфейса?

Вот тесты для операторов легко писать. К, примеру, таким способом:

Код: Выделить всё
import bpy

for ob in bpy.data.objects:
    bpy.ops.my.operator(ob)

Этот скрипт можно запустить в заранее созданном blend файле, который хранит все возможные случаи входных данных (в данном случае объекты). То есть скрипт тестирует оператор bpy.ops.my.operator, подавая ему на вход абсолютно все возможные объекты блендера (если меш, то он может быть с модификаторами или без, с полигонами или без и т. д.). В итоге легко увидеть ошибку. Не нужно вручную на каждом объекте проверять. Достаточно один раз заготовить эти объекты и запустить скрипт.

Но вот как быть с интерфейсом?

Не открывать же вручную все панельки и не разворачивать все списки?

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

В общем, как тестировать интерфейс аддонов? У меня была такая ситуация, что в аддоне больше полгода абсолютно не работала одна панелька. И я даже об этом не догадывался. А этим аддоном пользовались как минимум с десяток человек и они не знали, что в интерфейсе что-то не так.
Pavel M
Аватара
Сообщения: 1210

Сообщение #111 Korchy » 20.01.2021, 16:36

Может, если они не знали, то оно и не было нужно? :-D

Для записи и воспроизведения движений/кликов мышки подойдет любой геймерский автокликер.uo pilot, например, или что там сейчас популярно у геймеров.
Korchy M
Аватара
Сообщения: 2956



Сообщение #112 Pavel » 20.01.2021, 20:21

Korchy, а стандартными средствами блендера нельзя получается? Но мне в принципе это не критично. Я попробую скачать эту программу.

А можно запустить метод draw для панели bpy.types.Panel, передав ей какой-нибудь фейковый контекст? И наверное до меня многие задавались этим вопросом, может есть готовые скрипты?
Pavel M
Аватара
Сообщения: 1210

Сообщение #113 Korchy » 20.01.2021, 21:27

Pavel писал(а):А можно запустить метод draw для панели bpy.types.Panel, передав ей какой-нибудь фейковый контекст?
Не экспериментировал в этом направлении совершенно.
Korchy M
Аватара
Сообщения: 2956



Сообщение #114 Pavel » 22.01.2021, 14:29

Как можно нормально рисовать частицы во вьюпорте в блендере 2.9?

В аддоне флип флюидс для этого используют этот модуль:
https://docs.blender.org/api/current/bgl.html

В блендере 2.79 этот модуль нормально рисовал точки. А в 2.8 и выше результат такой:

Изображение

Частицы закрывают собой всё. Они просто поверх всего рисуются, даже если находятся внутри меша. Вот сцена без эти точек:

Изображение

Мне нужно, чтобы те точки, которые рисуются внутри мешей, были невидимы из-за перекрывания геометрией.
Pavel M
Аватара
Сообщения: 1210

Сообщение #115 Pavel » 28.02.2021, 09:21

Как можно полноценно запустить оператор экспорта? Чтобы браузер файлов открылся. Например, экспорт в fbx. Если запустить так, то браузер не откроется:
Код: Выделить всё
bpy.ops.export_scene.fbx()

Мне нужно перед экспортом проделать определённые манипуляции с выделенными объектами, а потом сделать экспорт в fbx. И всё это должно быть реализовано с помощью одной кнопки.
Pavel M
Аватара
Сообщения: 1210

Сообщение #116 Korchy » 28.02.2021, 09:24

Pavel писал(а):Чтобы браузер файлов открылся.

https://b3d.interplanety.org/ispolzovanie-brauzer ... tkrytiya-i-sohraneniya-faylov/
Korchy M
Аватара
Сообщения: 2956



Сообщение #117 Pavel » 28.02.2021, 10:01

Korchy, мне нужно запустить уже готовый оператор экспорта. Или мне придётся всё копировать, чтобы получить это?:
Изображение

При экспорте в fbx есть параметр Custom Properties. Я хочу создать у экспортируемых объектов эти Custom Properties и запустить оператор экспорта в fbx. А после завершения экспорта удалить эти автоматически созданные Custom Properties.

Вот как запустить готовый fbx экспорт? Вариант bpy.ops.export_scene.fbx() не подходит. Он не открывает файловый браузер. А мне нужно, чтобы открывал, чтобы можно было указать параметры экспорта.
Pavel M
Аватара
Сообщения: 1210

  • 1

Сообщение #118 Korchy » 28.02.2021, 12:37

Pavel,
я так и не понял, что именно тебе нужно. Тебе тупо нужно открыть экспорт фбх с выбором файла с теми настройками, которые он уже имеет?
сделай так и все
Код: Выделить всё
 bpy.ops.export_scene.fbx('INVOKE_DEFAULT')
Korchy M
Аватара
Сообщения: 2956



Сообщение #119 Pavel » 28.02.2021, 12:39

Korchy, да, это то, что нужно было. Я в скобках ничего не указывал, поэтому браузер не открывался.
Pavel M
Аватара
Сообщения: 1210

Сообщение #120 Pavel » 01.03.2021, 11:16

Продолжаю делать свой оператор вызова fbx экспортёра. Не получается сделать следующее:
вот этот код не экспортирует Custom Properties в fbx:
Код: Выделить всё
import bpy


class MY_OT_FbxExport(bpy.types.Operator):
    bl_idname = 'my.export_fbx'
    bl_label = 'My Export FBX'

    def execute(self, context):
        # создаю Custom Properties
        for obj in context.selected_objects:
            # свойство game_type нужно сохранить в
            # fbx файл, чтобы при импорте в Max или
            # в Maya оно сохранилось.
            obj['game_type'] = 'MONSTER'
        # делаю экспорт в fbx, чтобы экспортировать
        # объекты с сохранением Custom Properties.
        # Но в параметрах экспорта FBX нужно включить
        # галочку Custom Properties
        bpy.ops.export_scene.fbx('INVOKE_DEFAULT')
        # после экспорта в fbx, удаляю только что
        # автоматически созданные свойства.
        for obj in context.selected_objects:
            del obj['game_type']
        return {'FINISHED'}


bpy.utils.register_class(MY_OT_FbxExport)
Данный код работает так:

создаются кастомные свойства
делается экспорт в fbx
удаляются кастомные свойства

Но экспорт в fbx выполняется в отдельном потоке насколько я понял. Поэтому удаление кастомных свойств происходит раньше экспорта в fbx. Из-за этого в fbx не сохранятся эти свойства.

Как сделать удаление этих свойств именно после экспорта в fbx? Если их не удалять вообще, то сцена и объекты будут захламляться.
Pavel M
Аватара
Сообщения: 1210

Пред.След.

Вернуться в Плагины

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя