You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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()

关键细节说明:

  1. 切割逻辑适配
    • 左段:复制原始模型后,在cut_pos1位置切割,保留Y轴小于该位置的部分
    • 中段:复制原始模型后,先后执行两次切割,分别去掉左侧和右侧的多余部分
    • 右段:复制原始模型后,在cut_pos2位置切割,保留Y轴大于该位置的部分
  2. 灵活调整分段比例
    如果你想要严格三等分的三段,只需要替换切割位置的计算代码为:
    cut_pos1 = bbox_min.y + (1/3) * total_y_length
    cut_pos2 = bbox_min.y + (2/3) * total_y_length
    
  3. 导出配置
    脚本默认不导出材质,如果你需要保留原始模型的材质信息,只需将use_materials参数改为True

备注:内容来源于stack exchange,提问作者T.I.Mahmud

火山引擎 最新活动