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

Список разделов 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
Аватара
Сообщения: 962

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

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

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

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

Сообщение #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
Аватара
Сообщения: 962

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

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

Сообщение #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
Аватара
Сообщения: 962

Сообщение #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
Аватара
Сообщения: 962

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

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

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

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

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

Сообщение #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
Аватара
Сообщения: 962

Сообщение #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
Аватара
Сообщения: 962

Пред.

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