1. 当 Rigify 报错 spine.004 时,先别急着重建骨架
如果你在 Blender 里用 Rigify 给角色绑骨,点下 Generate Rig 的那一刻,控制台弹出一行红字:
RIGIFY ERROR: Bone 'spine.004': Cannot connect chain - bone position is disjoint. Incorrect armature for type 'chain_rigs'然后骨架没生成,或者只生成了一半,视图里那个 metarig 还杵在原地。这个报错在 Rigify 使用者里出现频率相当高,尤其是自己手动搭 metarig、或者从别的文件里合并骨骼的时候。它说的其实是一件很具体的事:spine.004 这根骨头和它前面的骨头没有真正接上,位置是断开的(disjoint),而 Rigify 的 chain_rigs 类型要求整条脊柱链必须首尾相连。
Rigify 是什么?它是 Blender 自带的一套自动绑骨系统,你按它的命名规则搭一套 metarig(元骨架),它就能生成带 IK/FK 切换、手指控制、面部控制的完整 rig。适合谁?适合不想从零手 K 权重和约束、又想快速拿到可用控制器的动画人、独立开发者、做游戏原型的人。它能做什么?把一套标准命名的骨骼,自动转成几十上百根带自定义形状的控制骨。
问题在于,Rigify 对骨骼的“连接关系”非常敏感。它不只看你骨头摆在哪,还看 bone 的 head(头)和 parent 的 tail(尾)是否重合、是否勾了 Connected。spine.004 这个位置通常是胸腔到脖子之间的过渡段,很多人在这里要么多插了一根骨头,要么从别的骨架复制过来时坐标偏了几毫米,肉眼看不出来,Rigify 一算就报 disjoint。
我试过最典型的一种情况:脖子那里其实有两段分离的脊柱,两个关节球没有对齐在一起。你在视图里放大看,spine.003 的尾巴和 spine.004 的头之间有个小缝,或者干脆错开了一个身位。Rigify 生成 chain 的时候要求这两点必须重合,否则整条链就断了。
所以排查的核心思路就一句话:让 spine.004 的 head 和它父级的 tail 精确重合,并且确认父子关系是对的。下面我把从定位到修复的完整路径拆开讲,包括 Shift+S 的用法、命名检查清单,以及怎么验证 Rigify 能不能正常生成控制器。
先明确一点:这个报错不是 Blender 崩了,也不是 Rigify 坏了,纯粹是骨骼数据的问题。你只要把坐标和层级理顺,它立刻就能过。很多人一看到红字就慌,去重装插件、重开文件,其实没必要。真正要做的,是进编辑模式,一根一根看。
2. 用 Shift+S 定位 spine.004 与父子关系检查
进入正题。第一步永远是先选中 metarig,按 Tab 进编辑模式(Edit Mode)。注意是 metarig,不是生成出来的 rig,也不是其他骨架。Rigify 只认 metarig 上的命名和结构。
进去之后,在右上角大纲视图(Outliner)或者直接在视图里点选,找到 spine.004 这根骨头。如果视图里骨头太多看不清,可以按 A 全选再按 Alt+M 合并?不行,别乱动。更稳的做法是用大纲视图,展开 Armature,逐级找 spine 系列。
找到 spine.004 后,选中它,你会看到它的 head 和 tail 两个端点。现在关键动作来了:我们要把它的 head 对齐到父级 spine.003 的 tail 上。
具体操作,按报错提示里的方法走一遍:
先在编辑模式下,把 3D 游标(Cursor)放到 spine.003 的 tail 位置。怎么放?选中 spine.003,按 Shift+S,在弹出的饼菜单里选“Cursor to Selected”,游标就跳到 spine.003 的 tail 了。等等,这里要小心:Cursor to Selected 是把游标放到选中骨骼的哪个位置?默认是放到骨骼的 head 还是 tail?实际上 Blender 里 Cursor to Selected 对骨骼是把游标放到骨骼的 head(根部)。所以更精确的做法是手动在两根骨头之间点一下,把游标放在关节处。
原文给的做法是:选择 Cursor,在两个关节之间点一下,然后选择头部的 spine.004,按 Shift+S 选“Selection to Cursor”。这一步就是把 spine.004 整体移动到游标位置。但注意,Selection to Cursor 移动的是整根骨头,它的 head 会落到游标上,tail 跟着平移。所以你要先把游标放在 spine.003 的 tail 上,再对 spine.004 执行 Selection to Cursor,这样 spine.004 的 head 就和 spine.003 的 tail 重合了。
同样的方法,对 spine.003 也来一遍:把游标放到 spine.002 的 tail,选中 spine.003,Shift+S → Selection to Cursor。这样整条链就逐级对齐了。
这里有个坑:Selection to Cursor 会移动整根骨骼,如果你之前手动调过 spine.004 的角度或长度,移动后可能位置对了但朝向歪了。所以对齐之后,还要再圈选节点微调。原文特别强调“注意是圈选”,意思是框选(Box Select)那几个端点,而不是单点拖拽,避免误动其他骨头。
对齐完,还要检查父子关系。选中 spine.004,看它的 Parent 是谁。正常应该是 spine.003。如果 Parent 是空的,或者指向了别的骨头(比如从别的骨架合并过来时指向了原骨架的某根),Rigify 一样会报错。检查方法:在编辑模式选中 spine.004,按 N 打开侧边栏,看 Item 面板里的 Parent 字段;或者用快捷键 Ctrl+P 重新设父级。如果 Parent 对了,还要看 Connected 有没有勾上。对于脊柱链,通常希望是 connected 的,但 Rigify 的 chain_rigs 其实允许不勾 Connected,只要 head 和 parent tail 重合即可。不过为了保险,建议勾上 Connected,这样你移动父级 tail 时子级 head 会跟着走。
再给一个检查清单,你可以照着核对:
| 检查项 | 正确状态 | 错误表现 |
|---|---|---|
| spine.004 的 Parent | spine.003 | 空 / 指向其他骨骼 |
| spine.004 head 与 spine.003 tail | 坐标完全重合 | 有缝隙或错位 |
| Connected 勾选 | 建议勾上 | 未勾且坐标不重合 |
| 骨骼命名 | 严格 spine.003 / spine.004 | spine.003.001 之类 |
| 是否有重复骨骼 | 无重名 | 两根 spine.004 |
命名这块特别容易出问题。Rigify 是按名字找骨头的,如果你从别的文件 append 进来,Blender 会自动加 .001 后缀,变成 spine.004.001,Rigify 就找不到它认识的 spine.004 了,于是报错。所以检查大纲视图里有没有带后缀的重复骨骼,有就改名或删掉。
还有一个隐藏问题:spine.004 可能根本不该存在。Rigify 的标准 metarig 里,脊柱链通常是 spine、spine.001、spine.002、spine.003,然后接 neck、head。spine.004 往往是用户自己多加的一根,或者从别的骨架带过来的。如果你不需要它,直接删掉,把 neck 的父级改成 spine.003,问题可能就没了。但如果你确实需要这根过渡骨,那就按上面的方法对齐。
排查完这些,基本就能定位到问题。接下来讲怎么把配置固化下来,避免下次再踩。
3. 可复制的骨骼命名与层级配置片段
光靠手动对齐,下次换个文件可能又乱。更稳的做法是把 metarig 的骨骼命名和层级关系写成一份可核对的清单,甚至用脚本批量检查。下面给你一份可以直接对照的配置片段,包含命名规范和层级结构。
先看标准 Rigify 人形 metarig 的脊柱部分命名,这是官方 metarig 的默认结构:
{ "spine_chain": [ { "name": "spine", "parent": "hips", "connected": false }, { "name": "spine.001", "parent": "spine", "connected": true }, { "name": "spine.002", "parent": "spine.001", "connected": true }, { "name": "spine.003", "parent": "spine.002", "connected": true }, { "name": "spine.004", "parent": "spine.003", "connected": true }, { "name": "neck", "parent": "spine.004", "connected": true }, { "name": "head", "parent": "neck", "connected": true } ] }注意 spine.004 在这里是作为胸腔到脖子的过渡,它必须和 spine.003 连接。如果你的 metarig 里 spine.004 的 parent 不是 spine.003,或者 connected 是 false 且坐标没对齐,就会报 disjoint。
如果你用的是 Blender 的 Rigify 插件,它的 metarig 其实存在一个 Python 定义里。你可以打开 Blender 的脚本工作区,运行下面这段代码,批量检查当前选中骨架的脊柱链是否合规:
import bpy arm = bpy.context.object if arm and arm.type == 'ARMATURE': bones = arm.data.bones chain = ["spine", "spine.001", "spine.002", "spine.003", "spine.004", "neck", "head"] for i, name in enumerate(chain): if name not in bones: print(f"缺失骨骼: {name}") continue b = bones[name] parent_name = b.parent.name if b.parent else "None" head = b.head_local tail = b.tail_local print(f"{name}: parent={parent_name}, connected={b.use_connect}, head={tuple(round(v,4) for v in head)}, tail={tuple(round(v,4) for v in tail)}") if i > 0: prev = bones[chain[i-1]] dist = (b.head_local - prev.tail_local).length if dist > 0.0001: print(f" -> 警告: {name} 的 head 与 {chain[i-1]} 的 tail 距离 {dist:.6f},未对齐")这段脚本会打印每根骨头的父级、连接状态、头尾坐标,并计算与上一根骨头 tail 的距离。距离大于 0.0001 就说明没对齐,Rigify 大概率会报 disjoint。你可以直接复制到 Blender 的文本编辑器里运行,选中 metarig 即可。
如果你更习惯用 TOML 记录配置,也可以这样写一份检查表:
[metarig.spine] name = "spine" parent = "hips" connected = false [metarig.spine_001] name = "spine.001" parent = "spine" connected = true [metarig.spine_002] name = "spine.002" parent = "spine.001" connected = true [metarig.spine_003] name = "spine.003" parent = "spine.002" connected = true [metarig.spine_004] name = "spine.004" parent = "spine.003" connected = true # 关键:head 必须等于 spine.003 的 tail这份配置的意义在于,你可以把它当成修复目标。每次报错,就对照着看哪一项不满足。尤其是 spine.004 的 parent 和 connected 两项,出问题最多。
另外,如果你在团队里协作,建议把 metarig 的骨骼命名规范写进项目文档。Rigify 对大小写也敏感,spine.004 不能写成 Spine.004 或 spine_004。下划线、点号都要严格一致。我见过有人把 spine.004 写成 spine004,Rigify 直接找不到,报的错却是另一根骨头,排查半天。
配置片段给完了,接下来是实际验证。光对齐还不够,得让 Rigify 真的生成一次,看它过不过。
4. 验证 Rigify 生成控制器与请求成功结果
对齐和检查做完,回到物体模式(Object Mode),选中 metarig,打开右侧的 Rigify 面板(通常在 Armature 属性里,或者按 N 侧边栏找 Rigify)。点 Generate Rig。
如果一切正常,你会看到视图里多出一套带各种圆形、方形控制器的骨架,metarig 通常会被隐藏或移到一边。控制台不再报错。这就是成功的结果。
但怎么确认 spine.004 那一段真的没问题?生成之后,选中生成的 rig,进姿态模式(Pose Mode),找到 spine 相关的控制骨。Rigify 会把脊柱链转成一组叫 spine_follow、torso 之类的控制。你可以旋转 torso 控制,看整条脊柱是否平滑弯曲,脖子和头是否跟着动。如果 spine.004 那段没接上,生成的控制骨可能会断开,或者旋转时脖子不跟。
更直接的验证是看控制台输出。Rigify 生成成功时,控制台会打印类似:
Rigify: Generated rig 'rig' from metarig 'metarig'如果还有警告,比如某根骨头被跳过,它会提示。你可以把控制台往上翻,确认没有 spine.004 相关的 ERROR。
还有一种情况:生成成功了,但控制器数量不对,或者某些控制骨位置偏移。这通常是因为 metarig 的骨骼朝向(roll)不对。Rigify 对 roll 也有要求,尤其是脊柱链。你可以在编辑模式选中 spine.004,按 Ctrl+N 重新计算 roll,或者手动在 N 面板里调 roll 值。不过 roll 一般不会导致 disjoint 报错,它影响的是生成后的控制方向。
验证请求这块,如果你是把 Rigify 用在自动化流程里,比如通过脚本批量生成,可以用下面这段代码触发并捕获结果:
import bpy # 选中 metarig metarig = bpy.data.objects.get("metarig") if metarig: bpy.context.view_layer.objects.active = metarig metarig.select_set(True) # 调用 Rigify 生成 try: bpy.ops.pose.rigify_generate() print("Rigify 生成成功") except Exception as e: print(f"Rigify 生成失败: {e}") else: print("未找到 metarig")运行后看输出。如果成功,说明你的修复生效了。如果还报 spine.004,那就回到第 2 步继续查。
成功生成后,建议把这份 metarig 另存一份,或者把修复后的骨骼坐标记下来。下次再遇到类似问题,直接对比。
实测下来,绝大多数 spine.004 的 disjoint 报错,都是因为 head 和 parent tail 没对齐,或者 parent 指错了。把这两点修好,Rigify 基本都能过。下面把常见的错误和排查方法整理一下,方便你对照。
5. 本篇常见错排查:401、local proxy failed 与 reading choices
虽然 Rigify 是本地 Blender 插件,不涉及网络请求,但很多人在排查过程中会用到外部工具或脚本,这时候容易碰到一些通用报错。我把几类高频错误列出来,对照着看。
第一类,OAuth 或 API 相关的 401。如果你在写脚本调用外部服务来辅助处理骨骼数据,比如把骨骼坐标发到某个接口做校验,可能会遇到 401 Unauthorized。这通常意味着你的 API Key 没带对,或者过期了。检查请求头里的 Authorization 字段,确认 Key 是有效的。如果你用的是 TaoToken 这类平台,可以在控制台重新生成 Key,然后更新到脚本里。注意 Base URL、Key、Model ID 三件套要配套,缺一个都可能 401。
第二类,local proxy failed。这个报错一般出现在你本地起了代理服务,但脚本或 Blender 连不上。比如你设置了 HTTP_PROXY 环境变量,但代理没启动,就会报 local proxy failed。解决办法是检查环境变量,或者临时取消代理设置。在 Blender 的 Python 环境里,可以用:
import os os.environ.pop("HTTP_PROXY", None) os.environ.pop("HTTPS_PROXY", None)然后再跑你的请求。如果你确实需要走某个本地服务,确认端口和地址写对了。
第三类,reading choices 报错。这个通常出现在解析 API 返回的 JSON 时,代码期望一个 choices 数组,但实际返回的结构不对。比如你调用某个模型接口,返回的是 error 字段而不是 choices,代码却直接读 response["choices"],就会抛 KeyError 或 reading choices 失败。排查方法是先把原始返回打印出来:
import json resp = ... print(json.dumps(resp, indent=2, ensure_ascii=False))看清楚结构再取字段。如果是 TaoToken 的接口,返回格式一般和 OpenAI 兼容,choices 在顶层。如果返回的是流式数据,要按行解析。
第四类,OAuth 回调失败。如果你在用需要 OAuth 授权的工具,回调地址填错、或者本地端口被占用,都会导致授权失败。检查回调 URL 是否和注册时一致,端口是否空闲。
回到 Rigify 本身,还有一个容易混淆的报错:Bone 'spine.004': Cannot connect chain。它和 disjoint 是同一个问题的不同表述。有时候你明明对齐了,还是报,那可能是骨骼的 roll 或者 scale 不为 1。在编辑模式选中 spine.004,按 Alt+S 清掉 scale,按 Alt+R 清掉 rotation,再重新对齐一次。
另外,如果你从别的 Blender 文件 append 骨骼进来,记得检查是否有重复的 metarig。有时候场景里有两个 metarig,你改了一个,Rigify 却读了另一个。在大纲视图里确认只有一个 metarig,其他的删掉或改名。
排查顺序建议:先看命名有没有后缀,再看 parent 对不对,再看 head 和 parent tail 距离,最后看 connected 和 scale。按这个顺序走,基本不会漏。
如果你在接入外部服务辅助排查时遇到网络层报错,可以对照 TaoToken 的接入文档检查配置。文档里有完整的 Base URL 和 Key 用法说明,地址是 https://taotoken.net/api,Key 在控制台的 API Keys 页面生成。模型对话可以在模型对话页面直接测试,确认 Key 能用再写进脚本。
6. 把 Rigify 排查流程固化成习惯
Rigify 的 spine.004 报错,说到底是个数据一致性问题。它不神秘,也不难修,难的是每次都要重新找一遍。我的建议是,把第 3 节那份检查清单存成项目里的一个文本文件,每次搭完 metarig 就跑一遍脚本。这样在点 Generate Rig 之前,你就知道会不会报错。
具体习惯可以这样:搭完 metarig,先在大纲视图里核对命名,确保没有 .001 后缀;然后进编辑模式,用 Shift+S 把脊柱链逐级对齐;接着跑一遍检查脚本,看距离是否都小于 0.0001;最后再生成。这套流程走下来,五分钟不到,比报错后回头查快得多。
如果你经常做角色绑定,还可以把标准 metarig 存成资产,下次直接拖进来用,避免手动搭错。Blender 的资产浏览器可以存 Armature,用的时候 append 进来,命名和层级都是现成的。
另外,Rigify 的 metarig 其实可以自定义。你可以在 Blender 的插件目录里找到 rigify 的 metarig 定义文件,照着改一份自己的模板。不过那是进阶玩法,先把标准流程跑顺再说。
最后提醒一句:生成 rig 之前,记得保存文件。Rigify 生成失败有时会留下半成品骨架,撤消不一定干净。保存一份,出问题直接回退。
如果你在排查过程中需要调用外部接口做辅助校验,记得把 Base URL 写成 https://taotoken.net/api,Key 从控制台拿,模型 ID 按文档填。三件套齐了,请求才通。模型对话页面可以先手动测一下,确认返回正常再写进脚本。接入文档里有各语言的示例,照着改就行。
Rigify 这个报错,修一次记一辈子。下次再看到 spine.004,你直接进编辑模式,Shift+S 对齐,收工。