есть скрипт для вычисления скорости обьекта, я подумал было бы неплохо если бы яркость огня зависела от его скорости, чем больше тем, меньше огонь.
я добавил драйвер на эмиссию и прикрепил его к пользовательскому параметру, который получаю от пайтон скрипта, но он не обновляет значения.
значение в пользовательском параметре меняются, а в драйвере нет.
на скриншоте пример с драйвером на изменение положения относительно значения полученного от скрипта
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()