blender bpy对齐物体

在执行任何对齐操作前,务必先应用物体的缩放,否则边界框的计算会出错:

python 复制代码
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.transform_apply(scale=True)

方案一:基于边界框对齐(最常用,按底部 Z 轴)

让物体B的底部(最低点)对齐到物体A的底部。

python 复制代码
import bpy

def align_bottom(obj_a, obj_b):
    """将 obj_b 的底部对齐到 obj_a 的底部"""
    # 确保是物体模式
    bpy.context.view_layer.objects.active = obj_a
    bpy.ops.object.mode_set(mode='OBJECT')
    
    # 获取物体的世界坐标最低点
    min_z_a = obj_a.matrix_world @ obj_a.bound_box[0][2] # 注意索引0通常是z最小
    # 更准确的方法:遍历边界框的8个点找最小值
    min_z_a = min([(obj_a.matrix_world @ v)[2] for v in obj_a.bound_box])
    min_z_b = min([(obj_b.matrix_world @ v)[2] for v in obj_b.bound_box])
    
    # 计算位移量
    delta_z = min_z_a - min_z_b
    
    # 移动物体B
    obj_b.location.z += delta_z

# 使用方法:在Outliner里选中两个物体,再运行
selected = bpy.context.selected_objects
if len(selected) == 2:
    align_bottom(selected[0], selected[1])
else:
    print("请选中两个物体")

方案二:精确对齐(利用游标法)

完全模拟手动操作,适用于需要对齐特定顶点或面的情况。

python 复制代码
import bpy

def align_by_cursor(obj_target, obj_to_move):
    # 选中目标物体的特定顶点(需提前在编辑模式选好)
    # 或者直接对齐到原心:跳过此步,直接用 obj_target.location
    bpy.context.view_layer.objects.active = obj_target
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.select_all(action='DESELECT')
    # 手动选中一个底部顶点后运行...
    bpy.ops.object.mode_set(mode='OBJECT')
    
    # 游标到选中项
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.view3d.snap_cursor_to_selected()
    bpy.ops.object.mode_set(mode='OBJECT')
    
    # 移动物体
    obj_to_move.location = obj_target.location
    # 重置原点(可选)
    bpy.ops.object.origin_set(type='ORIGIN_CURSOR')

方案三:一键落地到世界地面

常用于3D打印前,让所有选中的物体稳稳站在世界坐标的Z=0平面上。

python 复制代码
import bpy

def drop_to_ground():
    for obj in bpy.context.selected_objects:
        if obj.type == 'MESH':
            # 获取底部最低点
            min_z = min([(obj.matrix_world @ v)[2] for v in obj.bound_box])
            # 移动到地面
            obj.location.z -= min_z

drop_to_ground()
复制代码
相关推荐
致Great43 分钟前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起1 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
测试_AI_一辰1 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
lucas_AI2 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法
LuminousCPP2 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2082 小时前
leetcode 三数之和
数据结构·算法·leetcode
小小龙学IT2 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法
eBest数字化转型方案3 小时前
从工程视角拆解冰柜资产管理:拍照识别 pipeline、纯净度算法与 IoT 选型踩坑
人工智能·物联网·算法
Interview Aid1123 小时前
Roblox OA 面经|小游戏+编程双修,Coding 两题满分通过
算法
闲研随记3 小时前
【文献阅读 ICLR 2026】RL算法:Co-Rewarding
算法