Blender: Activate rigid body based on Z height

 avatar
unknown
python
a year ago
2.1 kB
3
Indexable
# Apply custom boolean property and a driver
# that looks at an objects Z location


import bpy

# Function to add a custom property and apply a driver to it
def add_driver_to_object(obj):
    # Add a custom property to the object
    obj["AnimationDisabled"] = False  # Default value is False

    # Add a driver to the custom property
    driver = obj.driver_add('["AnimationDisabled"]')

    # Set the type of the driver to SCRIPTED
    driver.driver.type = 'SCRIPTED'
    driver.driver.use_self = True

 # Set the expression for the driver with Z location as input
    driver.driver.expression = '1 if var + self.location.z < 0 else self["AnimationDisabled"]'

    # Manually set up the variable and target for Z location
    var = driver.driver.variables.new()
    var.type = 'TRANSFORMS'
    
    # Object to get Z height for
    var.targets[0].id = bpy.data.objects["Empty"]
    var.targets[0].transform_type = 'LOC_Z'

    # Update the dependencies
    bpy.context.view_layer.update()


# Iterate through selected objects and apply the driver
selected_objects = bpy.context.selected_objects
for obj in selected_objects:
    add_driver_to_object(obj)




# Iterate through all selected objects
for selected_object in bpy.context.selected_objects:
    # Check if the object has a rigid body
    if selected_object.rigid_body:
        # Access the Rigid Body settings
        rigid_body_settings = selected_object.rigid_body

        # Create a new driver for the "Animated" property
        driver = rigid_body_settings.driver_add("kinematic")

        # Access the driver data
        driver_data = driver.driver

        # Set up the driver expression
        driver.driver.use_self = True
        driver_data.expression = 'not self.id_data["AnimationDisabled"]'  # Example expression, you can customize this


        # Optionally, update the driver to rebuild the expression
        driver_data.expression = driver_data.expression


# Update the scene to reflect the changes
bpy.context.view_layer.update()
Leave a Comment