Blender bool_tool 切刀在渲染模式看不见:原因和修复
bool_tool 创建切刀时会主动关闭渲染可见性,所以 Solid 视口看得见、Rendered 视口就消失。本文拆开集合 hide_render 和对象 visible_camera 两层,给出修复步骤、验证脚本和清理残留切刀的方法。
用 bool_tool 切完模型,切刀在 Solid 视口里看得见,切到 Rendered 视口就消失了。
这不是 bug。bool_tool 创建切刀时主动把它们设成渲染不可见,因为切刀是工具,不该出现在成片里。
原因:两层可见性被同时关闭
| 层级 | 属性 | 值 | 由谁设置 |
|---|---|---|---|
集合 boolean_cutters | hide_render | True | functions/scene.py 创建集合时硬编码 |
| 对象(切刀) | visible_camera | False | functions/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