Hi3D 1.0 导出的网格进 Blender 后选面不听话,通常不是选择工具坏了,而是网格本身带着三类问题:导入时的轴向和单位偏差、未焊接的重复顶点与孤立点、以及面法线翻转。这三类现象在视口里都表现为「点一下选到背面」「环选跳着走」「框选选不中」,但处理动作完全不同。建议按「先核对导入设置,再统计拓扑,最后看面朝向」的顺序排查,每一步都用可观察的计数或显示开关来验证,而不是凭手感判断。
选面异常优先按「导入缩放与朝向 → 重复顶点与孤立点 → 面朝向翻转」的顺序查:先用已知尺寸的物体核对轴向和单位,再在编辑模式记下顶点/面数并执行按距离合并,最后打开 Face Orientation 看重算法线是否收敛。清理前后各统计一次,只有面朝向全为正面、面数不再随合并动作下降,才能说明问题真正消除。
先确认导入时的缩放与朝向
选面时如果整体错位、比例明显不对,或者环选沿着一圈边跑到另一侧,先怀疑导入面板里的轴向和缩放,而不是网格数据。OBJ、FBX、glTF 的导入面板都有各自的轴向前进和向上方向选项,glTF 通常默认带 +Y up 转换,FBX 有 Scale 与朝向项。建议一次只改一个变量:先用源文件导出时声称的轴向导入,缩放置 1.0,确认朝向正确后再单独调缩放;同时改两处,出问题时就分不清是哪个变量造成的。
验证方式是用场景里尺寸已知的物体做参照。Shift+A 添加一个默认立方体(边长 2 米,或在 N 面板把 Dimensions 手动设成你需要的值),把导入的网格与它并排或叠放,读导入网格 N 面板 Item 里的 Dimensions 与源软件中记录的尺寸比对。差的如果是固定倍数(例如 100 倍、1000 倍),基本是厘米/毫米与米之间的单位问题;朝向不对则看是绕 X 轴差 90° 还是某个轴被镜像。另外要留意 Scale 出现负值的情况,负缩放会让面朝向整体反掉,先 Ctrl+A 应用缩放,再判断法线状态。
风险边界:应用旋转和缩放会写入物体数据,如果这个网格以后还要挂父子关系、驱动器或动画约束,建议先在副本上做验证,确认无误再对原对象应用。
统计孤立顶点与重复面
网格如果是多次导出拼接、或者导出时没有焊接共享边,就会存在大量位置重合但彼此独立的顶点。这种网格在视口里看不出异常,但点选面时容易选中隐藏的重叠面,环选也会在某处断掉。
统计入口有两个:进入编辑模式后,底部状态栏会显示 Verts、Edges、Faces 的选中数与总数;也可以在 3D 视口按 N 打开侧栏,看 Item 标签下的 Statistics(Verts、Edges、Faces、Tris)。先按 A 全选,记下当前总数作为基线,然后执行合并:菜单 Mesh → Merge → By Distance,或按 M 键在菜单里选 By Distance,阈值默认很小,需要按模型实际尺度调整(以米为单位的小件保持默认往往够用,坐标数值很大的模型则需要放大阈值)。合并完成后信息栏会提示移除了多少个顶点,再读一次状态栏的顶点数做对比。
判断逻辑要分清两种结果:顶点数明显下降、面数基本不变,说明存在未焊接的重复顶点;顶点数和面数同时异常偏高,往往是重面,可以用 Select → All by Trait → Interior Faces 辅助筛选,或在启用 3D Print Toolbox 附加组件后做一次重复面/交叉面检查。合并之后如果还剩下一批不构成面的零散顶点,用 Select → All by Trait → Loose Geometry 选中后删除,避免它们继续干扰点选。
打开面朝向显示找翻转面
这是选面异常最容易被忽略的原因。在视口右上角 Overlays 下拉里勾选 Face Orientation,正面显示为蓝色,背面显示为红色,翻转的面会非常直观地露出来。
翻转面在视口和渲染里的表现并不一致,所以只看渲染结果容易误判:视口实体模式如果开启了背面剔除,翻转面会直接看不见或者像破了个洞;EEVEE 的材质设置里也有背面剔除开关,勾上之后渲染同样会隐藏背面;Cycles 一般两侧都渲染,但翻转面在光照下明暗会不对,看起来发暗或者像被压平了。因此判断法线状态应以 Face Orientation 的显示为准,而不是以某一次渲染图为准。
另外,如果视口处于 X-Ray 透视模式,点选会穿到背面去选,这也是「选到背面」的常见来源。排查时先关掉 X-Ray,或在头部工具栏把选择限制为可见元素,再配合面朝向显示观察。
修正入口在编辑模式:A 全选后执行 Mesh → Normals → Recalculate Outside(快捷键 Shift+N)。注意对整体内翻的封闭壳(比如从内部看的球壳类结构),Recalculate Outside 之后可能仍然朝内,这时需要 Alt+N 菜单里的 Flip 手动翻一次,并用 Face Orientation 目视确认变蓝。
重算法线并处理硬边
重算法线之后如果仍然出现局部黑面,多数是自定义法线或自动平滑在干扰。FBX 和 glTF 导入时可能把源文件的自定义拆分法线一并带进来,它会覆盖重算结果。清除入口在 Object Data Properties → Geometry Data 面板里的 Clear Custom Split Normals Data,清除后再重算一次法线。
自动平滑的处理要结合本地 Blender 版本确认:较新版本把 Auto Smooth 改成 Shade Auto Smooth / Smooth by Angle 修改器的形式,旧版本在 Object Data Properties 的 Normals 面板里勾选 Auto Smooth 并填角度。两者行为不完全相同,遇到表现和教程对不上时,先看自己的版本再决定用哪个入口。
验证硬边过渡的方式是:清除自定义法线 → 重算 → 全选执行 Shade Smooth → 加 Smooth by Angle 并把角度先试 30° 或 60° → 旋转视图从几个角度看原本该硬的地方是否还硬。如果该硬的地方被抹平了,用 Mark Sharp 在对应边上手动标记,或者对那部分面改用 Shade Flat。判定标准是既没有突兀的黑块,也没有本该锐利却糊成一片的过渡。
把清理步骤固化成固定顺序
同类网格会反复遇到,建议把动作固化成一个固定顺序:复制一份备份对象 → 应用旋转与缩放 → 记录顶点/面数基线 → 按距离合并 → 删除孤立点与内部面 → 清除自定义拆分法线 → 重算法线 → 设置平滑并标记硬边 → 再统计一次面数 → 打开面朝向检查 → 关闭 X-Ray 做点选抽查。顺序不要随意换,尤其是先把拓扑清干净再动法线,否则合并动作会把刚修好的法线又打乱。
import bpy
obj = bpy.context.active_object
me = obj.data
print("before verts/faces:", len(me.vertices), len(me.polygons))
# 1. 应用旋转与缩放(有父子或驱动关系时先在副本上做)
bpy.ops.object.transform_apply(location=False, rotation=True, scale=True)
# 2. 清除导入带进来的自定义拆分法线
bpy.ops.mesh.customdata_custom_splitnormals_clear()
# 3. 清理拓扑:合并重复顶点 + 删除孤立点/边
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.remove_doubles(threshold=0.0001) # 阈值按模型实际尺度调整
bpy.ops.mesh.delete_loose()
# 4. 重算法线,朝外
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.normals_make_consistent(inside=False)
bpy.ops.object.mode_set(mode='OBJECT')
print("after verts/faces:", len(me.vertices), len(me.polygons))
脚本里的合并阈值和后续的平滑角度都要按模型尺度改,不要照搬到所有文件。清理后确认问题消失的标准有三条:顶点与面数跟源模型拓扑量级相符,而不是越大越小越好;全选后 Face Orientation 里看不到红面;关闭 X-Ray 在实体模式下点选、框选、环选都能正常命中可见的那一面。三条都满足,再把这个网格投入后续的编辑或导出。