概念设计师画完一张线稿之后,接下来的工作往往是把它变成三维资产,这一步传统上由建模师手动完成,耗时长且容易偏离原画。如果能让 AI 参与其中,先用 ControlNet 从线稿生成多视角的参考图,再在 Blender 中依据这些轮廓快速搭建 3D 模型,效率会显著提升。本文就来完整讲解这条从二维线稿到三维轮廓的自动化工作流。

一、ControlNet 线稿控制的基本原理与预处理器选择
ControlNet 是 Stable Diffusion 的一种控制网络扩展,它的核心思路是在扩散模型的 U-Net 结构上附加一个可训练的副本网络,通过额外的条件输入(比如边缘图、深度图、姿态图)来约束生成结果。对于线稿转 3D 的场景,我们主要关心它的线稿类控制模型,常见的预处理器有三种:Canny、HED 和 Lineart。
Canny 是经典的边缘检测算法,得到的是细而闭合的双像素边缘,结构准确但会丢失线条的粗细和笔触信息;HED 更接近人类感知的边缘,线条柔和,适合快速出概念图;Lineart 则专门针对动漫和手绘线稿训练,能干净地提取线稿本身的线条,对手绘草图最友好。如果你的输入是铅笔草稿,优先选 Lineart;如果是照片或渲染图,选 Canny 更稳妥。
实际操作中建议在 ComfyUI 或 Stability Matrix 中搭建一个基础工作流,加载 SD 1.5 或 SDXL 的底模,配上对应的 ControlNet 权重文件(如 control_v11p_sd15_lineart)。控制权重控制在 0.6 到 0.9 之间,权重太高会完全复刻线稿导致生成结果缺乏立体细节,太低则轮廓走形。生成时可以固定种子,通过修改相机视角的提示词(例如 front view、side view、three-quarter view)批量产出同一物体的多角度参考图,这些图就是后续 Blender 建模的输入。
二、Blender 端接入 ControlNet 推理结果的两种方式
拿到 AI 生成的多视角参考图后,如何在 Blender 中使用?最基础的方式是作为建模参考:在正交视图中把前视图、侧视图分别作为背景图导入,这是传统三维建模的做法,优点是零门槛,缺点是对齐全靠肉眼。
更进阶的方式是通过 API 让 Blender 直接调用推理服务。ComfyUI 启动时会开放一个 HTTP 接口(默认 http://127.0.0.1:8188),我们可以用 Python 脚本提交工作流并轮询取回结果图片,再利用 Blender 的 bpy 模块把图片自动设为某个正交相机的背景参考,实现一键出图、一键挂图。下面是一个在 Blender 内部脚本编辑器中可运行的示例:
import bpy
import json
import urllib.request
# ComfyUI 的 API 地址
COMFY_URL = "http://127.0.0.1:8188"
# 读取导出的工作流 JSON(在 ComfyUI 中启用开发者模式后可导出)
with open("D:\\workflow\\lineart_api.json", "r", encoding="utf-8") as f:
workflow = json.load(f)
# 修改提示词节点,例如节点 6 是 CLIP Text Encode
workflow["6"]["inputs"]["text"] = "concept car, side view, clean lineart"
# 提交排队请求
req = urllib.request.Request(
COMFY_URL + "/prompt",
data=json.dumps({"prompt": workflow}).encode("utf-8"),
headers={"Content-Type": "application/json"}
)
resp = json.loads(urllib.request.urlopen(req).read())
prompt_id = resp["prompt_id"]
print("已提交任务:", prompt_id)
# 简单等待并拉取历史结果
import time
while True:
time.sleep(3)
hist = json.loads(urllib.request.urlopen(
COMFY_URL + "/history/" + prompt_id).read())
if prompt_id in hist:
outputs = hist[prompt_id]["outputs"]
for node_id, result in outputs.items():
for img in result.get("images", []):
print("生成完成:", img["filename"])
# 这里可以继续调用 bpy 把图片设置为参考背景
break
这段脚本演示了提交任务与轮询结果的核心流程。拿到图片文件名后,可以用 bpy.data.images.load() 加载图片,再通过给正交相机设置 bpy.data.cameras 的背景图属性,或者直接创建一个带图像纹理的平面网格对齐到视口,就能让参考图出现在建模视图中。
除了 ComfyUI,也可以选择部署本地的 Stable Diffusion WebUI 并开启 ControlNet 插件的 API 模式,调用方式类似,都是 HTTP 请求加 JSON 参数。选择哪种取决于你的工作流习惯,ComfyUI 的节点图更适合批量化和参数化生产。
三、从线稿轮廓到 3D 网格的建模技巧
参考图就位后,进入实际建模环节。针对线稿轮廓的特点,推荐三种由快到精的方法。
第一种是曲线描摹法。新建贝塞尔曲线,在正交视图中沿参考图的轮廓描点,得到封闭的二维轮廓曲线。然后给曲线添加一个小半径的倒角(Bevel Depth),它立刻变成带体积的管状网格,最后配合实体修改器做布尔并集或直接使用网格化操作,就能得到粗胚模型。这种方法的优点是完全忠实于原线稿,缺点是只在单一平面上有厚度,适合徽章、Logo、低多边形道具这类浮雕感物体。
第二种是旋转与放样法。对于有明确回转体的物体(比如花瓶、酒杯、车削件),只需描出半边轮廓曲线,添加螺旋修改器或使用旋转曲面功能,一条曲线就能扫出完整三维形体。对于更复杂的物体,可以在前视图和侧视图各描一组轮廓曲线,再使用 F2 或者 Loquet 类插件做双向放样,让两个方向的截面控制形体。
第三种是结合雕刻与重拓扑。先用低成本方式搭出大致体块(可以借助 Blender 自带的镜像修改器保证对称),开启雕刻模式参考多视角图修整大形,最后用 Remesh 或四边形重拓扑获得干净的布线。这一步 AI 生成的多视角图价值最大,因为它提供了传统单张图无法给出的深度信息。
四、常见坑与优化建议
第一个常见的坑是多视角图不一致。AI 生成的 side view 和 front view 在细节上经常对不上,比如前视图里车门有一条折线,侧视图里却没有。解决办法是先用前视图生成主体,再用图生图功能以低重绘幅度生成其他视角,同时在提示词中强调相同的物体描述,减少随机漂移。
第二个坑是线稿本身质量不足。铅笔草稿常有断线、污渍,Lineart 预处理器会把噪点也提取出来。建议先在 Krita 或 Photoshop 中清理线稿,或者使用 ControlNet 的 Scribble 模型,它对潦草线条的容错更好。
第三个坑是性能问题。在 Blender 内通过 API 轮询时,如果脚本写在模态运算符里并且每帧刷新,会卡住界面。建议把长耗时任务放到 bpy.app.timers 注册的定时器回调中执行,让主线程保持响应。
import bpy
def check_task():
# 每 2 秒轮询一次推理结果,不阻塞界面
done = poll_comfy_history()
if done:
load_reference_image()
return None # 返回 None 表示定时器结束
return 2.0 # 返回秒数表示下次间隔
bpy.app.timers.register(check_task)
最后给出管线层面的建议:把线稿、生成的参考图、Blender 工程文件放在统一的目录结构中管理,脚本中的路径使用相对路径或通过环境变量配置,这样整条流水线可以迁移到团队其他成员的机器上。线稿到 3D 的全自动生成目前还不现实,但线稿到多视角参考图、参考图到粗模这两段各自都已经有成熟的工具支撑,把它们串起来就能节省大量前期建模时间,把精力留给真正的细节雕刻和材质制作。
BlenderControlNet线稿转3D修改时间:2026-09-02 18:55:09