SuperAPI AI 工具集

blender-hardsurface

设计与创作

查看项目

更新于 10-15 12:38

技能介绍

用途

这是一个在 Blender 中制作硬表面太空船并完成打光与渲染的技能包,通过 BlenderMCP 的本地套接字驱动。作者说明所有内容来自端到端制作一艘 162 米测量补给舰的经验,并强调技术本身比这艘船更重要:原始体拼装存在硬性上限,再多的打光或构图也无法突破。

主要能力

  • 建模:三种手法,按影响力排序。一是 loft 截面扫掠,不为堆叠原始体——定义宽度、高度、倒角沿长度变化的截面轮廓,穿过多个站位后连成一张连续蒙皮;八边形配合独立倒角宽度读起来像轧制钢板,超椭圆则像模压成型的梭形。二是把细节切入蒙皮:面板舱、沟槽、龙骨通道和机库,是对选中面做 bmesh.ops.inset_region 后沿面法线向内平移,而不是把盒子粘在表面上。三是细节层级,分初级体量、中等面板舱、约船体长度 1/60 的细小 greeble 三层,并且要克制,留出干净的面板——第一版给每个面都加 greeble 的结果是一片噪点,分区并让背部保持干净后才读得出细节。船体使用平直着色,呈“板件”而非“塑料”质感。
  • 贴图(程序化,无图像贴图):两个节点承担让漆面看起来像“造出来的”大部分工作。逐板色调变化用 TexVoronoi(物体坐标,scale 约 0.16)→ RGBToBW → 重映射到 0.9–1.1 → 乘进基础色。边缘磨损用 NewGeometry → Pointiness,重映射到约 0.49–0.56 区间,混向裸金属并抬高 Metallic,仅适用于 Cycles。另可用朝向恒星法线的漂白(dot(Normal, sun_dir))和朝尾部的烟熏(物体空间 Y)。
  • 布光:一盏硬主光(SUN,角度约 0.9°)、一盏大而弱的区域光作为星云/行星反照补光(色调取主光的补色),以及一道冷色轮廓光。阴影永远不是纯黑。相机要放在主光一侧。
  • 星空:用 Voronoi,而不是阈值化的噪声。噪声无法分离密度与大小;Voronoi 中格子尺度决定数量、距离阈值决定大小,逐格随机值丢弃大多数并变化亮度。球面上格子数约为 4π·scale²,一帧所见不足 1%,所以 scale=30 时画面里约十五个格子,应使用 scale ≈ 110;角半径 = 阈值 / scale,两者一起移动。
  • 渲染与相机:相机由场景包围盒推导,绝不手工摆放(手工摆的相机会落到船体内部)。合成器用于镜头效果:Glare Fog Glow(光晕)→ Glare Streaks(变形宽银幕)→ Lensdist dispersion(色差)。使用 AgX。草稿 64 采样 / 1280×720(约 2 秒),最终 96–400 / 1920×1080(在 M 系列 GPU 上约 4–8 秒)。

使用方式

BlenderMCP 插件在 localhost:9876 上开启一个 JSON 套接字。MCP 工具在会话开始时加载,如果服务器是在会话中途注册的,工具不会出现在工具列表中,此时应直接与套接字通信。资料给出的通道代码:

import json, socket
def send(cmd, params=None, timeout=900.0):
    s = socket.socket(); s.settimeout(timeout); s.connect(("localhost", 9876))
    s.sendall(json.dumps({"type": cmd, "params": params or {}}).encode())
    buf = b""
    while True:
        buf += s.recv(65536)
        try: return json.loads(buf.decode())
        except json.JSONDecodeError: continue

def run(code): return send("execute_code", {"code": code})

命令包括:get_scene_info、get_object_info、execute_code、get_viewport_screenshot。其中 execute_code 最关键,所有内容都是通过它发送 bpy 代码。插件无法在后台模式下启动服务器,Blender 必须以 GUI 打开,侧边栏(N)→ BlenderMCP → Connect to Claude;套接字只在这个开关打开时存在。若在 Blender 已运行时安装插件,该实例没有它,需要重启 Blender。参考代码位于 reference/:bmcp_client.py(套接字)、build_tender.py(整艘船——loft、内凹、greeble、材质、灯光)、cinematic.py(贴图、星球、星空、相机运动、镜头)。可用以下命令约两秒内从零重建整个场景:

cat build_tender.py cinematic.py | python3 bmcp_client.py code

适用场景与限制

适用于在该游戏美术方向下制作硬表面太空船、需要程序化建模与打光流程的场合。资料中记录的、耗费大量时间的陷阱包括:相机位于几何体内部会使渲染时间变成 80 倍(同一场景 166 秒对 2 秒);背景几何体必须只对相机可见,一个 2600 单位自发光大气壳会变成每个着色点都要重要性采样的区域光(通过设置 visible_diffuse/glossy/transmission/volume_scatter/shadow = False,时间从 145 秒降到 4.3 秒);先 o.scale = size 再加 Bevel 修改器会变成枕头状,应先用 bpy.ops.object.transform_apply(scale=True);matrix_parent_inverse = parent.matrix_world.inverted() 会抵消父级;绕错误轴旋转会静默地毫无可见变化;Map Range 在 To Min > To Max 且开启 clamp 时会坍缩为零,应改用 SUBTRACT 节点反转;RGBA 模式下的 Mix 节点可能静默丢弃一个分支;图像预览会降采样,4 像素的星星在预览中会被平均掉。

Blender 5.x 的 API 变更(4.x 代码在这些点全部失败):Scene.node_tree 已移除 → Scene.compositing_node_group,且 CompositorNodeComposite 不再存在;合成组必须包含 CompositorNodeRLayers,否则 Blender 会完全跳过渲染并在 0.1 秒内写出透明的黑色帧;Action.fcurves 已移除(slotted actions),需在插入关键帧前通过 context.preferences.edit.keyframe_new_interpolation_type 设置插值;Glare/Lensdist 设置从属性移至套接字,枚举使用显示名("Fog Glow"、"Streaks"、"High")。旧版插件仍安装到 ~/Library/Application Support/Blender/<ver>/scripts/addons/。

导出到该游戏时:游戏的过程化船体由 src/gfx/greeble.js、src/ship/hull.js 生成,不附带构建期资产,代码树中没有 GLTFLoader,所以惯用路径是把 loft/内凹方法移植进 greeble 套件,而不是加载网格。若确实要导出:bpy.ops.export_scene.gltf(export_format='GLB', use_selection=True, export_apply=True, export_yup=True) 输出到 public/models/;程序化节点材质无法保留,应导出平直基础色,让游戏的 dress() 处理漂白/烟熏/板件。以米为单位建模,游戏为 1 单位 = 1 公里,因此要在全新的根节点上按 0.001 缩放(且不要对 greeble 套件构建的任何东西调用 setScalar)。导出前按材质合并:一个 Blender 物体变成一个 glTF 节点变成一次绘制调用,这艘船松散导出时 11 个材质产生了 78 次,先按材质组执行 bpy.ops.object.join(),网格到达时约为 11 次绘制。survey.mjs 会报告绘制调用数,添加任何东西后都要检查。KHR_materials_emissive_strength 能完整往返,因此航行灯、窗格和 Choir 自发光会保留作者设定的强度。

资料中未提供具体收费标准、平台支持范围或效果承诺等信息。