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

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

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

Сообщение #61 Mephist0 » 20.05.2019, 13:30

Подскажите пожалуйста, есть ли способ обернуть уже существующий слайдер в FloatProperty() со своими параметрами и вывести этот слайдер на панель интерфейса? Например bpy.context.object.modifiers["Shrinkwrap"].offset = my_float. Пробовал создать оператор, но не получилось вывести слайдер на панель интерфейса. Заранее спасибо!
Mephist0
Аватара
Сообщения: 3

Сообщение #62 Pavel » 20.06.2019, 06:37

Как заставить аддон работать в двух версиях одновременно (2,79 и 2,80)? Из-за аннотаций я получаю ошибку синтаксиса в 2.79, а без аннотаций получаю предупреждения в 2.80.

Вот код для 2.80:
Код: Выделить всё
test: bpy.props.BoolProperty()

А вот код для 2.79:
Код: Выделить всё
test = bpy.props.BoolProperty()

Есть какой-то не костыльный способ обойти ошибки и предупреждения?

Добавлено спустя 1 час 54 минуты:
Вроде решил проблему. Сделал так:
Код: Выделить всё
IS_BLENDER_280 = True
test = bpy.props.IntProperty()

class TestProps(bpy.types.PropertyGroup):
    b_type = bpy.types.Mesh

    if IS_BLENDER_280:
        __annotations__ = {
            'test': test ,
        }
    else:
        test = test
Pavel M
Аватара
Сообщения: 1129

Сообщение #63 Bibo » 20.06.2019, 10:58

Bibo
Аватара
Сообщения: 595

Сообщение #64 Pavel » 20.06.2019, 12:55

Bibo, я про это знаю. У меня просто в коде есть переменная IS_BLENDER_280 которая является результатом функции с bpy.app.version, но я не стал всю функцию копировать. Я показал сам принцип объявления свойств. А то как определяется версия - не важно.
Pavel M
Аватара
Сообщения: 1129

Сообщение #65 Pavel » 29.06.2019, 16:37

У меня есть модель со скелетом. В режиме Reset Position она выглядит так:
Изображение
И есть анимация, которая выглядит так:
Изображение
Мне нужно изменить Reset Position скелета без порчи анимаций. Reset Position должен быть таким:
Изображение
Как это можно сделать? Уже целый день мучаюсь, ничего не выходит.
Вот blend сцена:
https://drive.google.com/file/d/1S5nVpcnRST_0xFWza8tg1O-pE3YRLMlZ/view?usp=sharing
Вот что пока у меня получилось:
Код: Выделить всё
import bpy


def reconstruct_bind_pose(obj, bind_act):
    bind_keyframes = {}
    for fcurve in bind_act.fcurves:
        keyframe = fcurve.keyframe_points[0]
        if bind_keyframes.get(fcurve.data_path):
            bind_keyframes[fcurve.data_path].append(keyframe.co.y)
        else:
            bind_keyframes[fcurve.data_path] = [keyframe.co.y, ]

    bpy.ops.pose.armature_apply()

    for act in bpy.data.actions:
        for fcurve in act.fcurves:
            for keyframe in fcurve.keyframe_points:
                bind_keyframe = bind_keyframes[fcurve.data_path][fcurve.array_index]
                keyframe.co.y -= bind_keyframe


obj = bpy.context.object
act = obj.animation_data.action
reconstruct_bind_pose(obj, act)
Pavel M
Аватара
Сообщения: 1129

Сообщение #66 Bibo » 29.06.2019, 18:45

Pavel, в для этого существует операция Ctrl+A
Спойлер
Изображение
В 2.8 правда не смотрел где, если не так же.
Bibo
Аватара
Сообщения: 595

Сообщение #67 Pavel » 29.06.2019, 20:03

Pavel писал(а):Мне нужно изменить Reset Position скелета без порчи анимаций.
анимации сломаются. Нужно писать скрипт.

Добавлено спустя 17 часов 39 минут:
Нашёл готовое решение, правда пришлось немного переделать под себя:
https://blenderartists.org/t/modify-motion-capture-t-pose/540491/13

Вот мой переделанный вариант:
https://github.com/PavelBlend/blender-reconstruct-reset-position-addon
Pavel M
Аватара
Сообщения: 1129

Сообщение #68 Pavel » 28.10.2019, 20:31

Я уже спрашивал про это, но всё равно спрошу ещё раз (так как я решил эту проблему, но костыльно и алгоритм получился медленный).

В общем, есть вершины и треугольники, взятые из игры. У вершин есть позиция и нормаль. В игре за счёт нормалей реализуется сглаживание. То есть, если есть два ребра, которые построены на разных вершинах, но эти вершины имеют одинаковые координаты и одинаковые нормали, то шва на модели не будет (не смотря на то, что вершины физически не соединены). Нужно как-то сглаживание, построенное на нормалях вершин, перевести в привычное для блендера сглаживание за счёт Sharp Edges. Для этого, нужно объединить одинаковые вершины и пометить рёбра, которые не должны быть сглаженными, с помощью Sharp Edge. Как это сделать?

Вот есть код, которые создаёт два меша: один меш - это оригинал, а второй - реконструированный (у него удалены двойные вершины, но пропало сглаживание, меш стал весь сглаженным).
Код: Выделить всё
import bpy, bmesh


vertex_positions = (
    (0.0, 1.0, 0.39734387397766113),
    (-1.0, 1.1924880638503055e-08, 0.39734387397766113),
    (-1.5780595541000366, 1.4511292611985027e-08, 0.0),
    (-1.0, 1.1924880638503055e-08, -1.0),
    (-1.0, 1.1924880638503055e-08, -0.39734387397766113),
    (-8.742277657347586e-08, -1.0, -0.39734387397766113),
    (-8.742277657347586e-08, -1.0, -1.0),
    (1.0, -4.371138828673793e-08, -1.0),
    (1.0, -4.371138828673793e-08, -0.39734387397766113),
    (0.0, 1.0, -0.39734387397766113),
    (0.0, 1.0, -1.0),
    (-8.742277657347586e-08, -1.0, -1.0),
    (-8.742277657347586e-08, -1.0, -0.39734387397766113),
    (1.0, -4.371138828673793e-08, -0.39734387397766113),
    (1.0, -4.371138828673793e-08, -1.0),
    (-1.0, 1.1924880638503055e-08, -0.39734387397766113),
    (-1.0, 1.1924880638503055e-08, -1.0),
    (0.0, 1.0, -1.0),
    (0.0, 1.0, -0.39734387397766113),
    (0.0, 1.0, 1.0),
    (-1.0, 1.1924880638503055e-08, 1.0),
    (-1.0, 1.1924880638503055e-08, 0.39734387397766113),
    (0.0, 1.0, 0.39734387397766113),
    (0.0, 1.0, 1.0),
    (0.0, 1.0, 0.39734387397766113),
    (1.0, -4.371138828673793e-08, 0.39734387397766113),
    (1.0, -4.371138828673793e-08, 1.0),
    (-8.742277657347586e-08, -1.0, 1.0),
    (1.0, -4.371138828673793e-08, 1.0),
    (1.0, -4.371138828673793e-08, 0.39734387397766113),
    (-8.742277657347586e-08, -1.0, 0.39734387397766113),
    (-1.0, 1.1924880638503055e-08, 1.0),
    (-8.742277657347586e-08, -1.0, 1.0),
    (-8.742277657347586e-08, -1.0, 0.39734387397766113),
    (-1.0, 1.1924880638503055e-08, 0.39734387397766113),
    (0.0, 1.0, 0.39734387397766113),
    (-1.5780595541000366, 1.4511292611985027e-08, 0.0),
    (4.306879297644173e-09, 1.5780595541000366, 0.0),
    (-1.0, 1.1924880638503055e-08, 0.39734387397766113),
    (-8.742277657347586e-08, -1.0, 0.39734387397766113),
    (-1.336514685590373e-07, -1.5780595541000366, 0.0),
    (-1.5780595541000366, 1.4511292611985027e-08, 0.0),
    (-8.742277657347586e-08, -1.0, 0.39734387397766113),
    (1.0, -4.371138828673793e-08, 0.39734387397766113),
    (1.5780595541000366, -7.32860527818957e-08, 0.0),
    (-1.336514685590373e-07, -1.5780595541000366, 0.0),
    (0.0, 1.0, 0.39734387397766113),
    (4.306879297644173e-09, 1.5780595541000366, 0.0),
    (1.5780595541000366, -7.32860527818957e-08, 0.0),
    (0.0, 1.0, 0.39734387397766113),
    (1.5780595541000366, -7.32860527818957e-08, 0.0),
    (1.0, -4.371138828673793e-08, 0.39734387397766113),
    (-1.336514685590373e-07, -1.5780595541000366, 0.0),
    (1.5780595541000366, -7.32860527818957e-08, 0.0),
    (1.0, -4.371138828673793e-08, -0.39734387397766113),
    (-8.742277657347586e-08, -1.0, -0.39734387397766113),
    (4.306879297644173e-09, 1.5780595541000366, 0.0),
    (-1.5780595541000366, 1.4511292611985027e-08, 0.0),
    (-1.0, 1.1924880638503055e-08, -0.39734387397766113),
    (-1.336514685590373e-07, -1.5780595541000366, 0.0),
    (-8.742277657347586e-08, -1.0, -0.39734387397766113),
    (-1.0, 1.1924880638503055e-08, -0.39734387397766113),
    (-1.5780595541000366, 1.4511292611985027e-08, 0.0),
    (4.306879297644173e-09, 1.5780595541000366, 0.0),
    (0.0, 1.0, -0.39734387397766113),
    (1.0, -4.371138828673793e-08, -0.39734387397766113),
    (4.306879297644173e-09, 1.5780595541000366, 0.0),
    (-1.0, 1.1924880638503055e-08, -0.39734387397766113),
    (0.0, 1.0, -0.39734387397766113),
    (4.306879297644173e-09, 1.5780595541000366, 0.0),
    (1.0, -4.371138828673793e-08, -0.39734387397766113),
    (1.5780595541000366, -7.32860527818957e-08, 0.0)
)

vertex_normals = (
    (-0.0039215686274509665, 0.5607843137254902, 0.8196078431372549),
    (-0.5607843137254902, -0.19215686274509802, 0.803921568627451),
    (-0.5607843137254902, 0.1843137254901961, 0.803921568627451),
    (-0.9529411764705882, -0.3176470588235294, -0.0039215686274509665),
    (-0.9529411764705882, 0.30980392156862746, -0.0039215686274509665),
    (-0.3176470588235294, -0.9529411764705882, -0.0039215686274509665),
    (0.30980392156862746, -0.9529411764705882, -0.0039215686274509665),
    (0.9450980392156862, 0.30980392156862746, -0.0039215686274509665),
    (0.9450980392156862, -0.3176470588235294, -0.0039215686274509665),
    (0.30980392156862746, 0.9450980392156862, -0.0039215686274509665),
    (-0.3176470588235294, 0.9450980392156862, -0.0039215686274509665),
    (0.30980392156862746, -0.9529411764705882, -0.0039215686274509665),
    (-0.3176470588235294, -0.9529411764705882, -0.0039215686274509665),
    (0.9450980392156862, -0.3176470588235294, -0.0039215686274509665),
    (0.9450980392156862, 0.30980392156862746, -0.0039215686274509665),
    (-0.9529411764705882, 0.30980392156862746, -0.0039215686274509665),
    (-0.9529411764705882, -0.3176470588235294, -0.0039215686274509665),
    (-0.3176470588235294, 0.9450980392156862, -0.0039215686274509665),
    (0.30980392156862746, 0.9450980392156862, -0.0039215686274509665),
    (-0.0039215686274509665, 1.0, -0.0039215686274509665),
    (-0.9529411764705882, -0.3176470588235294, -0.0039215686274509665),
    (-0.9529411764705882, 0.30980392156862746, -0.0039215686274509665),
    (-0.0039215686274509665, 1.0, -0.0039215686274509665),
    (-0.0039215686274509665, 1.0, -0.0039215686274509665),
    (-0.0039215686274509665, 1.0, -0.0039215686274509665),
    (1.0, -0.0039215686274509665, -0.0039215686274509665),
    (1.0, -0.0039215686274509665, -0.0039215686274509665),
    (0.30980392156862746, -0.9529411764705882, -0.0039215686274509665),
    (1.0, -0.0039215686274509665, -0.0039215686274509665),
    (1.0, -0.0039215686274509665, -0.0039215686274509665),
    (-0.3176470588235294, -0.9529411764705882, -0.0039215686274509665),
    (-0.9529411764705882, -0.3176470588235294, -0.0039215686274509665),
    (0.30980392156862746, -0.9529411764705882, -0.0039215686274509665),
    (-0.3176470588235294, -0.9529411764705882, -0.0039215686274509665),
    (-0.9529411764705882, 0.30980392156862746, -0.0039215686274509665),
    (-0.0039215686274509665, 0.5607843137254902, 0.8196078431372549),
    (-0.5607843137254902, 0.1843137254901961, 0.803921568627451),
    (-0.0039215686274509665, 0.5607843137254902, 0.8196078431372549),
    (-0.5607843137254902, -0.19215686274509802, 0.803921568627451),
    (0.1843137254901961, -0.5607843137254902, 0.803921568627451),
    (-0.19215686274509802, -0.5607843137254902, 0.803921568627451),
    (-0.5607843137254902, 0.1843137254901961, 0.803921568627451),
    (0.1843137254901961, -0.5607843137254902, 0.803921568627451),
    (0.5607843137254902, -0.0039215686274509665, 0.8196078431372549),
    (0.5607843137254902, -0.0039215686274509665, 0.8196078431372549),
    (-0.19215686274509802, -0.5607843137254902, 0.803921568627451),
    (-0.0039215686274509665, 0.5607843137254902, 0.8196078431372549),
    (-0.0039215686274509665, 0.5607843137254902, 0.8196078431372549),
    (0.5607843137254902, -0.0039215686274509665, 0.8196078431372549),
    (-0.0039215686274509665, 0.5607843137254902, 0.8196078431372549),
    (0.5607843137254902, -0.0039215686274509665, 0.8196078431372549),
    (0.5607843137254902, -0.0039215686274509665, 0.8196078431372549),
    (-0.0039215686274509665, -0.5686274509803921, -0.8274509803921568),
    (0.5607843137254902, -0.0039215686274509665, -0.8274509803921568),
    (0.5607843137254902, -0.0039215686274509665, -0.8274509803921568),
    (-0.0039215686274509665, -0.5686274509803921, -0.8274509803921568),
    (-0.0039215686274509665, 0.5607843137254902, -0.8274509803921568),
    (-0.5686274509803921, -0.0039215686274509665, -0.8274509803921568),
    (-0.5686274509803921, -0.0039215686274509665, -0.8274509803921568),
    (-0.0039215686274509665, -0.5686274509803921, -0.8274509803921568),
    (-0.0039215686274509665, -0.5686274509803921, -0.8274509803921568),
    (-0.5686274509803921, -0.0039215686274509665, -0.8274509803921568),
    (-0.5686274509803921, -0.0039215686274509665, -0.8274509803921568),
    (-0.0039215686274509665, 0.5607843137254902, -0.8274509803921568),
    (-0.0039215686274509665, 0.5607843137254902, -0.8274509803921568),
    (0.5607843137254902, -0.0039215686274509665, -0.8274509803921568),
    (-0.0039215686274509665, 0.5607843137254902, -0.8274509803921568),
    (-0.5686274509803921, -0.0039215686274509665, -0.8274509803921568),
    (-0.0039215686274509665, 0.5607843137254902, -0.8274509803921568),
    (-0.0039215686274509665, 0.5607843137254902, -0.8274509803921568),
    (0.5607843137254902, -0.0039215686274509665, -0.8274509803921568),
    (0.5607843137254902, -0.0039215686274509665, -0.8274509803921568)
)

triangles = (
    (0, 2, 1),
    (3, 5, 4),
    (3, 6, 5),
    (7, 9, 8),
    (7, 10, 9),
    (11, 13, 12),
    (11, 14, 13),
    (15, 17, 16),
    (15, 18, 17),
    (19, 21, 20),
    (19, 22, 21),
    (23, 25, 24),
    (23, 26, 25),
    (27, 29, 28),
    (27, 30, 29),
    (31, 33, 32),
    (31, 34, 33),
    (35, 37, 36),
    (38, 40, 39),
    (38, 41, 40),
    (42, 44, 43),
    (42, 45, 44),
    (46, 48, 47),
    (49, 51, 50),
    (52, 54, 53),
    (52, 55, 54),
    (56, 58, 57),
    (59, 61, 60),
    (59, 62, 61),
    (63, 65, 64),
    (66, 68, 67),
    (69, 71, 70)
)

# Create original mesh

mesh = bmesh.new()

for vertex_position in vertex_positions:
    mesh.verts.new(vertex_position)

mesh.verts.ensure_lookup_table()
mesh.verts.index_update()

for triangle in triangles:
    face = mesh.faces.new((
        mesh.verts[triangle[0]],
        mesh.verts[triangle[1]],
        mesh.verts[triangle[2]]
    ))
    face.smooth = True

mesh.faces.ensure_lookup_table()
mesh.normal_update()

bpy_mesh = bpy.data.meshes.new('raw_mesh')
mesh.to_mesh(bpy_mesh)
bpy_object = bpy.data.objects.new('raw_mesh', bpy_mesh)
bpy.context.scene.collection.objects.link(bpy_object)

# remesh

mesh = bmesh.new()
unique_verts = {}
remap_vertices = {}
vertex_index = 0

for original_vertex_index, vertex_position in enumerate(vertex_positions):
    if unique_verts.get(vertex_position, None) is None:
        unique_verts[vertex_position] = vertex_index
        mesh.verts.new(vertex_position)
        remap_vertices[original_vertex_index] = vertex_index
        vertex_index += 1
    else:
        remap_vertices[original_vertex_index] = unique_verts.get(vertex_position)

mesh.verts.ensure_lookup_table()
mesh.verts.index_update()

for triangle in triangles:
    face = mesh.faces.new((
        mesh.verts[remap_vertices[triangle[0]]],
        mesh.verts[remap_vertices[triangle[1]]],
        mesh.verts[remap_vertices[triangle[2]]]
    ))
    face.smooth = True

mesh.faces.ensure_lookup_table()
mesh.normal_update()

bpy_mesh = bpy.data.meshes.new('remesh')
mesh.to_mesh(bpy_mesh)
bpy_object = bpy.data.objects.new('remesh', bpy_mesh)
bpy_object.location.x = 4.0
bpy.context.scene.collection.objects.link(bpy_object)

Добавлено спустя 13 часов 58 минут:
Pavel писал(а):Нужно как-то сглаживание, построенное на нормалях вершин, перевести в привычное для блендера сглаживание за счёт Sharp Edges.
вроде получилось всё сделать. Вопрос закрыт.
Pavel M
Аватара
Сообщения: 1129

Сообщение #69 Pavel » 02.11.2019, 16:45

У меня есть аддон, который добавляет новый оператор экспорта. Я с его помощью делаю экспорт и потребление памяти блендером увеличивается. Этот оператор создаёт новые данные в bpy.data, но потом их сразу же удаляет. Освободить память помогает перезагрузка сцены. Но это не удобно. И при каждом экспорте потребление памяти растёт. Как выяснить, что занимает память и не хочет её покидать?
Pavel M
Аватара
Сообщения: 1129

Сообщение #70 grayich » 02.11.2019, 19:45

Pavel, если сборщик мусора не чистит, то скорее всего это внутренние оптимизации питон интерпретатора которые вроде фик уберёшь.

https://docs.python.org/3/library/gc.html
Код: Выделить всё
import gc
gc.collect()
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5626

Сообщение #71 Pavel » 02.11.2019, 19:52

grayich, в моём аддоне есть похожий код, который не захламляет память. А вот этот захламляет. Могу дать ссылку, если это чем-то поможет:
https://github.com/PavelBlend/blender-xray/blob/issue/281/support-level/io_scene_xray/level/exp.py

А вот код, который не захламляет озу:
https://github.com/PavelBlend/blender-xray/tree/issue/281/support-level/io_scene_xray/obj/exp

Видимо я что-то использую из модуля bpy, но вот что? Глобальных переменных в скрипте нет.
Pavel M
Аватара
Сообщения: 1129

Сообщение #72 Pavel » 03.11.2019, 17:39

Pavel писал(а):Как выяснить, что занимает память и не хочет её покидать?
выяснил, что занимает память. С помощью стандартного модуля tracemalloc. Вот эта строчка (и не только эта) захламляет память:
https://github.com/PavelBlend/blender-xray/blob/580282621d0bd6e364c0faab4c2765f6b70d1b56/io_scene_xray/level/exp.py#L528

Вопрос: почему она занимает память?

Добавлено спустя 50 минут 8 секунд:
Pavel писал(а):Вопрос: почему она занимает память?
вроде бы это баг модуля bmesh. Создал баг репорт. Там приложил пример, в котором можно наглядно увидеть утечку памяти:
https://developer.blender.org/T71321
Pavel M
Аватара
Сообщения: 1129

Сообщение #73 Pavel » 19.12.2019, 18:46

Возможно ли с помощью питона обновить окно? То есть, когда я запускаю скрипт, то он может работать часами, делая просчёты. В этот момент блендер просто зависает, и не понятно, на какой стадии работы находится скрипт. Мне нужно как-то обновить окно, чтобы в 3д виде всё обновилось и был виден результат просчётов. Как это сделать? Я знаю, что можно добавить модальный оператор, но этот вариант не подходит, так как в таком случае контекст меняется. А на контексте построен весь аддон. В итоге, я не смогу, к примеру, выяснить, какой объект является активным.
Pavel M
Аватара
Сообщения: 1129

Сообщение #74 Bibo » 19.12.2019, 18:59

Pavel писал(а):Возможно ли с помощью питона обновить окно?
В старой версии, когда я писал скрипт, мне удавалось обновить окно 3D вида путем перемещения 3D курсора. Перемещал я его ровно в ту же точку, в которой он находился изначально. Функции прямого обновления состояния окна я на тот момент не нашел.
Bibo
Аватара
Сообщения: 595

Сообщение #75 Pavel » 19.12.2019, 19:13

Bibo, понятно. Тогда нельзя. Придётся на модальные операторы всё переписывать. Хотя не знаю, получится ли.
Pavel M
Аватара
Сообщения: 1129

Сообщение #76 Pavel » 02.01.2020, 14:56

Как изменить цвет заголовка ноды? Я создал собственную тестовую систему нодов, и все ноды создаются с красным заголовком. А мне нужно указать другие произвольные цвета:
Изображение
Pavel M
Аватара
Сообщения: 1129

Сообщение #77 Юрий Небесный » 02.01.2020, 15:47

Все ноды поделены на группы. Векторные, эффекты и т.п.
Каждой группе можно задать свой цвет заголовка. Это в настройках темы есть. Я пользуюсь аддоном для настройки тем, очень удобно.
Каждой ноде можно индивидуально цвет задавать в N-панели нодового редактора.
Это все мои познания по этому вопросу
Linux Plasma | Ryzen 5, 32Gb, SSD M2, RX 590 | BenQ 27 | Wacom | Microsoft Ergo | Gun Tin tea
http://dezigner.tilda.ws
Юрий Небесный M
Аватара
Сообщения: 2026

Сообщение #78 Pavel » 02.01.2020, 16:25

Понятно. Сейчас скачал animation nodes аддон и в нём тоже у всех нод красный заголовок. Ну если даже автор этого аддона не менял цвет, то значит его изменить нельзя. Видимо только внутренние ноды имеют разные цвета. Для всех питоновских нод один цвет.
Pavel M
Аватара
Сообщения: 1129

Сообщение #79 grayich » 03.01.2020, 01:32

Pavel, можно в заголовке какой символ заметный ставить, дабы отличать
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5626

Сообщение #80 Pavel » 05.01.2020, 19:44

Возможно ли в свою новую систему нодов добавить стандартные ноды, например, ColorRamp, MixRGB, Math, NoiseTexture? Или всё придётся вручную кодировать с нуля?
Pavel M
Аватара
Сообщения: 1129

Пред.След.

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

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

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