跳到主内容
建模
文章阅读

Blender bool_tool 切刀在渲染模式看不见:原因和修复

bool_tool 创建切刀时会主动关闭渲染可见性,所以 Solid 视口看得见、Rendered 视口就消失。本文拆开集合 hide_render 和对象 visible_camera 两层,给出修复步骤、验证脚本和清理残留切刀的方法。

2026/10/170 次阅读4 分钟

用 bool_tool 切完模型,切刀在 Solid 视口里看得见,切到 Rendered 视口就消失了。

这不是 bug。bool_tool 创建切刀时主动把它们设成渲染不可见,因为切刀是工具,不该出现在成片里。

原因:两层可见性被同时关闭

层级属性值由谁设置
集合 boolean_cuttershide_renderTruefunctions/scene.py 创建集合时硬编码
对象(切刀)visible_cameraFalsefunctions/cutter.py 的 object_visibility_set(cutter, False)
对象(切刀)visible_shadow/diffuse/glossy/...False同上

关键区别:

  • Solid / Material Preview 读的是视口可见性 → 切刀显示
  • Rendered 视口 / F12 渲染 读的是渲染可见性 → 切刀消失

切刀还被设了 display_type = SOLID,所以在材质预览里它是一块纯色块,不是真实着色。

修复:两个开关都要打开

只改一个没用,必须两个都改。

1. 集合层:Outliner 里取消切刀集合的渲染隐藏

在 Outliner 找到 boolean_cutters 集合那一行,点右侧的相机图标,把 hide_render 取消。

2. 对象层:打开光线可见性

选中切刀对象 → 对象属性 → 可见性 → 光线可见性 → 勾选 Camera。

脚本等价写法:


import bpy

coll = bpy.data.collections["boolean_cutters"]
coll.hide_render = False            # 第 1 步

for ob in coll.objects:
    ob.hide_render = False
    ob.visible_camera = True        # 第 2 步
    ob.visible_shadow = True        # 想让切刀投影的话

改完立刻生效,不用刷新。

一个容易忽略的前提

先确认切刀还在被 Boolean 修改器引用:


import bpy
refs = [(o.name, m.name, m.object.name)
        for o in bpy.data.objects
        for m in o.modifiers
        if m.type == "BOOLEAN" and m.object]
print(refs or "无(布尔已被应用 baked 进网格)")

如果是空的,说明布尔已经在破坏性模式下应用进网格了,切刀只是残留对象。这时把它们显示出来,你看到的是插在实体内部的切刀体积,用来核对切口位置很好,但不能出图。

判断切口本身有没有做对,可以数网格的裸边:


import bpy, bmesh
ob = bpy.data.objects["立方体.003"]
bm = bmesh.new(); bm.from_mesh(ob.data)
print("裸边数:", sum(1 for e in bm.edges if len(e.link_faces) == 1))
bm.free()

闭合实体裸边数应为 0。切口是一个贯通洞时,边缘会出现一圈裸边,数量和洞的周长对应。

清理残留切刀

确认不需要调试了,一次删干净:


import bpy
coll = bpy.data.collections.get("boolean_cutters")
if coll:
    for ob in list(coll.objects):
        bpy.data.objects.remove(ob, do_unlink=True)
    bpy.data.collections.remove(coll)

顺带两个坑

切刀可能和场景物体共用 mesh data。 删对象没事,但改某把切刀的网格顶点会连带改到另一个物体。检查:


import bpy
for ob in bpy.data.objects:
    if ob.data and ob.data.users > 1:
        print(ob.name, "共用 mesh:", ob.data.name, "users =", ob.data.users)

visible_camera 和 hide_render 不是一回事。 hide_render 是整个对象在渲染里不存在;visible_camera 是对象存在但不被相机射线看到(还能投影、还能出现在反射里)。bool_tool 同时关了两个,所以只开一个不够。

为什么 bool_tool 要这么做

切刀在布尔运算里只是个形状探针。如果它参与渲染:

  • 会挡住视线,切口根本看不出来
  • Cycles 要多求交一个实体,白花算力
  • 破坏性模式下切刀本来就会被删掉

所以「渲染里看不见」是设计意图,把它显示出来属于调试动作,不是常规工作流。

版本信息

  • Blender 5.2.2 LTS
  • bool_tool(扩展 bl_ext.blender_org.bool_tool)
  • 渲染引擎 Cycles
返回顶部