This script moves the selected object to be centered on the world originĀ but it sits on the z plane rather than half of it being below the z plane.
import bpy from mathutils import Vector # Put the origin at the center of volume bpy.ops.object.origin_set( type='ORIGIN_CENTER_OF_VOLUME', center='MEDIAN', ) for obj in bpy.context.selected_objects: # The bounding-box corners are stored in object-local coordinates. # Transform them to world coordinates before finding the lowest point. lowest_z = min( (obj.matrix_world @ Vector(corner)).z for corner in obj.bound_box ) world_matrix = obj.matrix_world.copy() world_matrix.translation.x = 0.0 world_matrix.translation.y = 0.0 world_matrix.translation.z -= lowest_z obj.matrix_world = world_matrix