如何使用Blender 2.90将OBJ文件沿Y轴分割为三个独立部分并分别保存
如何使用Blender 2.90将OBJ文件沿Y轴分割为三个独立部分并分别保存
当然可以实现这个需求啦!你之前用bisect工具的思路是对的,但bisect每次只能把模型分成两部分,而且你原来的脚本是在同一个模型上连续切割,最后只能得到中间的那一段。我们可以换个更灵活的策略:复制原始模型三次,然后针对每个副本分别执行切割操作,只保留我们需要的那一段,最后把三个处理好的模型分别导出成独立的OBJ文件。
先看一下你提供的分割效果参考图:
接下来我会给你改进后的Python脚本,它会自动完成导入模型、计算切割位置、复制并切割模型、分别导出三个部分的全部流程:
import bpy import os import mathutils # 配置路径:修改为你的原始OBJ文件路径 input_path = "skull.obj" output_dir = os.path.dirname(input_path) # 清空Blender场景原有内容 bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete() # 导入原始OBJ模型 bpy.ops.import_scene.obj(filepath=input_path) original_obj = bpy.context.selected_objects[0] bpy.context.view_layer.objects.active = original_obj # 计算模型Y轴方向的边界与切割位置 # 获取模型的边界盒坐标 bbox_min = min([mathutils.Vector(v) for v in original_obj.bound_box]) bbox_max = max([mathutils.Vector(v) for v in original_obj.bound_box]) total_y_length = bbox_max.y - bbox_min.y # 计算两个切割点:按25%和75%位置划分,得到左、中、右三段(和你原脚本的切割逻辑一致) cut_pos1 = bbox_min.y + 0.25 * total_y_length # 左段与中段的分界 cut_pos2 = bbox_max.y - 0.25 * total_y_length # 中段与右段的分界 # 如果你想要严格三等分的三段,替换成下面两行即可 # cut_pos1 = bbox_min.y + (1/3) * total_y_length # cut_pos2 = bbox_min.y + (2/3) * total_y_length # 定义三个分段的导出配置:(分段名称, 导出文件名, 切割参数) segments = [ # 第一段:保留Y轴从最小值到cut_pos1的区域 ("左段", "skull_left.obj", (cut_pos1, (0,1,0), True)), # 第二段:保留Y轴在cut_pos1到cut_pos2之间的区域 ("中段", "skull_middle.obj", (cut_pos1, (0,-1,0), False, cut_pos2, (0,1,0), False)), # 第三段:保留Y轴从cut_pos2到最大值的区域 ("右段", "skull_right.obj", (cut_pos2, (0,-1,0), True)) ] for seg_name, seg_filename, cut_params in segments: # 复制原始模型作为当前分段的处理对象 bpy.ops.object.select_all(action='DESELECT') original_obj.select_set(True) bpy.ops.object.duplicate() current_obj = bpy.context.selected_objects[0] bpy.context.view_layer.objects.active = current_obj current_obj.select_set(True) # 切换到编辑模式执行切割操作 bpy.ops.object.mode_set(mode='EDIT') # 根据分段需求执行不同的切割逻辑 if len(cut_params) == 3: # 单切割:保留一侧区域 cut_y, plane_normal, clear_inner = cut_params bpy.ops.mesh.bisect( plane_co=(0, cut_y, 0), plane_no=plane_normal, clear_inner=clear_inner ) else: # 双切割:保留中间区域,先切去左侧,再切去右侧 cut_y1, plane_normal1, clear_inner1, cut_y2, plane_normal2, clear_inner2 = cut_params bpy.ops.mesh.bisect( plane_co=(0, cut_y1, 0), plane_no=plane_normal1, clear_inner=clear_inner1 ) bpy.ops.mesh.bisect( plane_co=(0, cut_y2, 0), plane_no=plane_normal2, clear_inner=clear_inner2 ) bpy.ops.object.mode_set(mode='OBJECT') # 导出当前分段的OBJ文件 output_path = os.path.join(output_dir, seg_filename) bpy.ops.export_scene.obj( filepath=output_path, use_selection=True, use_materials=False # 不需要材质可设为False,需要则改为True ) print(f"已导出{seg_name}到: {output_path}") # 删除当前副本,准备处理下一个分段 bpy.ops.object.delete() # 最后清理场景中的原始模型 bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete()
关键细节说明:
- 切割逻辑适配:
- 左段:复制原始模型后,在
cut_pos1位置切割,保留Y轴小于该位置的部分 - 中段:复制原始模型后,先后执行两次切割,分别去掉左侧和右侧的多余部分
- 右段:复制原始模型后,在
cut_pos2位置切割,保留Y轴大于该位置的部分
- 左段:复制原始模型后,在
- 灵活调整分段比例:
如果你想要严格三等分的三段,只需要替换切割位置的计算代码为:cut_pos1 = bbox_min.y + (1/3) * total_y_length cut_pos2 = bbox_min.y + (2/3) * total_y_length - 导出配置:
脚本默认不导出材质,如果你需要保留原始模型的材质信息,只需将use_materials参数改为True
备注:内容来源于stack exchange,提问作者T.I.Mahmud




