RyanovskY
@RyanovskY

Драйвер не обновляется при изменении custom properties через пайтон?

есть скрипт для вычисления скорости обьекта, я подумал было бы неплохо если бы яркость огня зависела от его скорости, чем больше тем, меньше огонь.
я добавил драйвер на эмиссию и прикрепил его к пользовательскому параметру, который получаю от пайтон скрипта, но он не обновляет значения.
значение в пользовательском параметре меняются, а в драйвере нет.

на скриншоте пример с драйвером на изменение положения относительно значения полученного от скрипта
67258a95a770d287016774.png

import bpy
from mathutils import Vector

def update_velocity(obj):
    if "previous_frame" not in obj:
        obj["previous_frame"] = -1
        obj["previous_position"] = "0.0, 0.0, 0.0"
        obj["velocity"] = "0.0, 0.0, 0.0"
        obj["position_change"] = "0.0, 0.0, 0.0"

    current_frame = bpy.context.scene.frame_current
    current_position = obj.location.copy()

    if current_frame != obj["previous_frame"]:
        if obj["previous_frame"] == -1:
            obj["previous_frame"] = current_frame
            obj["previous_position"] = f"{current_position.x}, {current_position.y}, {current_position.z}"
            return

        frame_difference = current_frame - obj["previous_frame"]
        previous_position = Vector(map(float, obj["previous_position"].split(',')))
        position_change = current_position - previous_position
        velocity = position_change / (frame_difference / bpy.context.scene.render.fps)

        obj["velocity"] = round(velocity.length, 3)
        obj["position_change"] = f"{position_change.x}, {position_change.y}, {position_change.z}"

        obj["previous_frame"] = current_frame
        obj["previous_position"] = f"{current_position.x}, {current_position.y}, {current_position.z}"

def frame_change_handler(scene):
    for obj in bpy.context.selected_objects:
        update_velocity(obj)

    # Обновляем видовой слой и панель
    bpy.context.view_layer.update()
    for area in bpy.context.screen.areas:
        if area.type == 'PROPERTIES':
            area.tag_redraw()

class OBJECT_PT_velocity_display(bpy.types.Panel):
    bl_label = "Object Velocity Display"
    bl_idname = "OBJECT_PT_velocity_display"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "object"

    def draw(self, context):
        layout = self.layout
        obj = context.object

        if obj:
            if "velocity" in obj and "position_change" in obj:
                velocity = float(obj["velocity"])
                position_change = Vector(map(float, obj["position_change"].split(',')))
                layout.label(text=f"Position Change: X: {abs(position_change.x):.2f}, Y: {abs(position_change.y):.2f}, Z: {abs(position_change.z):.2f}")
                layout.label(text=f"Velocity: {abs(velocity):.2f}")

def register():
    bpy.utils.register_class(OBJECT_PT_velocity_display)
    bpy.app.handlers.frame_change_pre.append(frame_change_handler)

def unregister():
    bpy.utils.unregister_class(OBJECT_PT_velocity_display)
    bpy.app.handlers.frame_change_pre.remove(frame_change_handler)

if __name__ == "__main__":
    register()
  • Вопрос задан
  • 12 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы