mcpField
P
Pose Lab

Pose Lab

本地服务
github.com/hpdkhoa媒体与设计1今天更新

关于 Pose Lab

Pose Lab 是面向 Blender 第一人称游戏动画制作的空间测量与姿势校验 MCP 服务。它可测量武器与手臂的位置、穿插和可见性,并搜索或修复姿势与动画片段中的问题。

主要功能

  1. 01测量指定坐标系中的位置
  2. 02检查穿插、人体关节与握持
  3. 03评估视角中的表面朝向和可见性
  4. 04搜索符合目标的步枪姿势
  5. 05逐帧扫描并修复动画片段

适用场景

  1. 01验证第一人称武器姿势是否符合人体关节范围
  2. 02检查手臂或手指与步枪的穿插
  3. 03查找动画中握持偏移或突然跳动的帧

MCP 相关

Pose Lab 通过 MCP 工具向模型提供 Blender 骨架姿势、空间测量、姿势搜索及动画扫描和修复能力。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"hpdkhoa-poselab": {
"command": "uvx",
"args": [
"poselab-mcp"
],
"env": {
"POSELAB_BLENDER": "<POSELAB_BLENDER>",
"POSELAB_RIGS": "<POSELAB_RIGS>",
"POSELAB_OUT": "<POSELAB_OUT>"
}
}
}
}
启动命令uvx poselab-mcp
需要配置的环境变量
POSELAB_BLENDERBlender's executable, if it is not on the PATH or in the usual install folder
POSELAB_RIGSA rigs.json describing your own FBX rigs; the built-in sample rig needs none
POSELAB_OUTThe only folder Pose Lab writes to (renders, the worker's log); defaults to ~/.poselab

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiposelab-mcp0.7.0

工具

25

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

Pose Lab

为在 Blender 中摆放第一人称手臂和步枪提供经过测量的空间答案。

许可证:MIT Python 3.10+ PyPI:poselab-mcp MCP Registry:poselab-mcp Blender:已针对 5.2 测试 工具:31 PoseFault:基准测试

内置示例骨架:四个 Blender 视图,展示手持步枪的第一人称手臂

模型不擅长根据图片判断 3D 空间:步枪的哪一侧朝向眼睛、手指是否陷进机匣,以及无论如何转动枪械都能否让抛壳口显露出来。Pose Lab 为模型提供数字。它会报告物体在指定坐标系中的位置,以及任何部位嵌入的深度。它会测量表面正对眼睛的程度,以及眼睛能看到什么。其求解器会搜索步枪的移动方式以满足目标,并报告哪些目标无论怎样移动都无法实现。对于动画,它会逐帧扫描片段,使用同样的检查项进行检查,并修复未通过的部分。

我在为自己的第一人称射击游戏手工制作膛室检查时开发了它。有个问题让我完整运行 Blender 好几次:转动步枪能否让抛壳口朝向眼睛?用 Pose Lab,只需调用一次 solve。在我游戏的 AK 骨架上,仅靠转动在 60 个采样中有 0 个达成目标。这是几何结构决定的事实:眼睛沿着枪管方向看去。转动并移动步枪时,每个目标都能单独达成,但 400 个采样中没有一个能同时达成全部四个目标。因此,这项检查需要新的手部姿势,而不只是新的步枪位置。在内置示例骨架上,仅靠转动在 60 个采样中同样有 0 个达成抛壳口目标;转动并移动则在 9 s 内达成了所有目标。

它能为模型提供什么

工具回答的问题
list_rigs、load_rig、describe有哪些骨架、坐标系、符号规则、命名点、片段和活动部件
pose_idle、pose_clip、move_part、snapshot将骨架摆成某个姿势:逐次播放片段、拉回枪机、保存姿势
move_gun滚转、摆动、俯仰并移动步枪;手部通过手臂 IK 保持握持
reach通过手臂 IK 让手腕触及某个点(可尝试肘部极点来避开前臂)
turn_bone让一根骨骼绕穿过其头部的轴旋转:手指关节、手腕或整条手臂
where、distance指定坐标系中的位置
clearance步枪嵌入前臂、手掌或手指的深度,以及所在位置,按到表面的距离测量
purpose每只手都作用于一个目标:握住(捏握或环握)、拉动(捏拉或钩拉)、按压、靠放在某个部件上或伸手触及某个部件;不会有手指无故弯曲
anatomy检查每条手臂是否符合人体手臂的活动限度:肘部、手腕和每个手指关节,并列出姿势违反的所有规则
grip检查每只手如何接触步枪:用手掌而非手背;手掌本身是否握住步枪;每一侧嵌入的深度
arm_ranges这些限度的研究依据:每个关节的 AAOS 活动范围、功能活动范围、检查值及来源
faces_eye、visible、screen表面朝向眼睛的角度、眼睛能看到的表面范围,以及表面在屏幕上的位置
solve根据目标搜索步枪的移动方式;报告每个目标,以及任意样本满足目标的频率
render联系表:玩家视角和外部视角,每个图块都标注为 Blender 视图
record_clip、load_clip由关键姿势生成片段,或从文件加载片段:.pose.json、FBX 或 BVH
scan_clip检查每一帧;报告最差值、发生时间和未通过检查的时间段
fix_clip修复未通过项,并报告修复前后的扫描结果,以及无法修复的内容
save_clip将片段写出为 .pose.json 骨骼数据和供游戏引擎使用的 FBX
view_cover手臂遮挡玩家视野的程度:全部、左下方和底部中央
solve_grip搜索手部的握持方式:手掌放在枪管上的标记处、肘部极点和手部旋转;保留能维持握持、避免穿插、符合手臂规则且满足视野预算的结果
retarget_clip将其他骨架的片段重定向到此骨架,并让手部握住此枪自身的握持点:动作共享,握持适配枪身
check_set汇总片段的所有检查结果,供关卡使用:最差穿插值、违反规则的帧,以及手部松开的帧
坐标系和符号

所有位置都在指定坐标系中输入和输出,因此无需猜测轴向:

  • gun:枪骨骼所在的坐标系,采用 Unreal 风格轴向,单位为 cm:+X 指向枪的左侧,+Y 沿枪管方向,+Z 朝上(默认)
  • arms:手臂的坐标系,采用 Unreal 风格轴向,单位为 cm
  • view:以眼睛为原点,单位为 cm:+X 向右,+Y 向前,+Z 朝上

旋转使用玩家熟悉的描述:roll + 使枪的右侧抬起,swing + 使枪口向左偏,pitch + 使枪口抬起。移动(right、forward、up)以视角为基准。

在待机姿势中,手部已围绕握持点接触步枪(手指扣在扳机上,手指环绕护木)。在 pose_idle 下调用 clearance 获取基准值,并用 ignore 通配符排除这些身体部位。在内置示例中,待机时左手拇指嵌入护木 2.7 cm。clearance 按到步枪表面的距离测量(通过射线奇偶性判断内外),因此即使身体部位位于平坦表面上、网格角点之间,也能检测到。

手臂规则(anatomy)

姿势即使能避开步枪,也仍可能是人类手臂无法做到的。anatomy 会根据以下限制检查每只手臂:

关节规则
肩部手部操作枪械时,肘部至少低于肩部 2 cm
肘部像铰链一样弯曲 5 到 150 度:绝不能完全伸直
前臂前臂带动手部旋转(桡骨绕尺骨转动):从拇指朝上开始,以肘部的铰链平面为基准,旋前和旋后各不超过 80 度
前臂皮肤在带有前臂扭转骨骼的骨架上,旋转沿前臂分散:任何单个骨骼段(肘部末端、各扭转骨骼、手腕)的旋转都不超过 50 度
手腕手腕不自行扭转;在没有扭转骨骼的骨架上,手部相对于静止握姿的扭转不超过 30 度
手腕与前臂轴线的夹角不超过 30 度;活动范围在关节限度内:屈曲 80 度、伸展 70 度、桡偏 20 度、尺偏 30 度
手指每个关节只朝手掌方向弯曲:指关节 -30 到 100 度,中间关节 -5 到 110 度,末端关节 -10 到 90 度
手指每根手指都保持在自己的平面内:中间关节偏离自身铰链不超过 15 度,末端关节偏离中间关节的平面不超过 25 度
拇指指关节横跨手掌弯曲 -10 到 60 度,末端关节弯曲 -15 到 90 度;拇指根部相对于食指掌骨张开不超过 80 度,且位于手掌后方不超过 20 度

手腕和肘部的活动范围采用 AAOS 的正常值,来源于 AAOS 1965 年表格在 Greene 和 Heckman 1994 年文献中的转载。其他表格中的数值有所不同,手指和拇指的差异为 10 到 25 度。手腕与前臂轴线夹角 30 度、肘部最小弯曲 5 度以及肘部低于肩部,都是为了本游戏中手握枪械的视觉效果而设定的操作规则,并非关节限度。 手腕规则比日常活动更严格:Ryu 1991 发现,日常活动中伸展最多可达 60 度,尺偏最多可达 40 度。手指限度允许指关节和中间关节的屈曲比 AAOS 标准多 10 度; docs/ANATOMY.md 说明了为何默认值保持不变。其中列出了每个关节的标准和功能活动范围、检查的数值及来源(AAOS;Eaton;Morrey 1981;Palmer 1985;Ryu 1991;Hume 1990;Bain 2015; Soucie 2011)。arm_ranges 会向模型返回相同的数据。

anatomy 的回复会针对每只手臂列出肘部低于肩部的高度、肘部弯曲角度、手腕弯曲角度(分为屈曲和桡偏)、手腕扭转角度、每个手指关节的弯曲和扭转角度,以及 bad:姿势违反的每条规则。每条规则都按照报告的数值读取:角度精确到度,肘部高度精确到 0.1 cm。rigs.json 中骨架的 limits、finger_limits 和 thumb_limits 条目会覆盖任何数值。solve 将 {"type": "anatomy"} 作为目标。

move_gun、reach 和 fix_clip 会在转动手部时调整手部位置。它们会将手部扭转转移到前臂,因此手腕关节只负责弯曲:保持双手位置不变时,步枪旋转 60 度不会显示为手腕扭转。

如果违反了规则,请通过移动步枪、调整握姿或改变肘部的转动轴来修正。不要让关节弯得更多。

示例骨架的静止握姿违反了手腕规则:左手腕偏离前臂 44 度,右手腕偏离 58 度。使用 anatomy 检查的 fix_clip 会将左手腕的偏差降至 29 度。右手腕仍为 58 度:任何能修正它的转动都会让步枪进入手掌后方,因此这只手需要新的握姿或肘部位置,而不是转动手腕。

手部接触(grip)

手掌和手指掌侧握住步枪。通常运行 clearance 时会排除手掌和手指,因为握持时它们会接触步枪。这样也会隐藏位于错误一侧的手。grip 会检查每只手本身的接触情况:

规则默认值
手放在步枪上时,掌心朝向步枪,而不是手背(palm_faces_rifle 大于 0)在 hold_within_cm 1.0 范围内
握住步枪的手,掌心贴在步枪上,而不只是指尖接触(palm_gap_cm)palm_within_cm 1.5
步枪不接触手背和每根手指的背面back_max_cm 0.1
掌侧可以稍微压入:胶囊体比手掌更圆palm_max_cm 1.0

每段手指的掌侧,是手指弯曲的一侧。拇指的指腹朝向侧面,因此其接触只计入掌侧深度。返回结果会给出每只手的 touching(有部分位于 hold_within_cm 范围内)、holding(有接触,掌心朝向步枪,且表面位于 palm_within_cm 范围内)、palm_gap_cm、palm_faces_rifle、palm_contact_cm、back_contact_cm、背侧接触位置,以及 bad。当 hold 为 true 时,未能握住步枪的手会违反规则。

用于握持某个部件(弹匣、握把)的手还必须夹住它:当 grasp 为 true 时,拇指和一根手指必须从相对两侧接触该部件(皮肤位于 contact_cm 0.3 范围内),且它们相对于部件表面的方向夹角至少为 180 - 2 atan(friction) 度(friction 为 0.5 时为 127 度)。返回结果会给出 grasping、grasp_opposition_deg 和 digits_touching。搭在步枪上或勾住把手的手不需要夹捏:不要启用 grasp。solve 将 {"type": "grip"} 作为目标,scan_clip 作为检查项。在示例模型上,前臂旋转 180 度的手无法通过检查。空闲握姿也无法通过:左拇指位于护木内 2.8 cm,右掌压入手枪握把 1.2 cm,扳机手指的背面位于扳机护圈内 0.8 cm。示例保持原样,因此基准测试中的数字仍有原本的含义。

Motion:扫描并修复片段

scan_clip 会逐帧播放片段,并检查每一帧。检查项包括求解器的目标 (clearance、anatomy、grip、faces_eye、visible、on_screen、barrel),以及另外三项:

  • contact:手部某一点是否在标记位置上,例如指尖是否在拉机柄上(a、b、max_cm)
  • hold:手部相对于 ref_s 时握持位置在步枪上漂移了多远(side、max_cm)
  • pop:突然跳动,即两帧之间骨骼的最快速度(bones、max_cm_per_s)

所有检查项都接受 during: [from_s, to_s]。随后,fix_clip 会修复片段副本:

  • pop:根据跳动帧周围的正常帧重新混合这些帧
  • hold:通过手臂 IK 将手放回握持位置
  • contact:移动手腕,直到该点接触标记位置
  • clearance:保持手腕不动,使每个肘部绕肩部到手腕的连线转动,以刚好满足间隙所需的最小角度,并将这种转动平滑过渡到相邻帧
  • anatomy:以相同方式转动肘部,直到肘部位于肩部下方且处于其弯曲范围内。然后将手腕转回其限制范围内,并将每个手指关节转回其活动范围内。它绝不会让手腕转动过度,以致步枪插入手背;无法通过这种方式修复的手腕会保持原样,之后的扫描会报告这一点。转动手腕会使手在握持位置上转动,因此如果握持位置必须完全精确,请添加 hold 检查。
  • grip:不会修复;fix_clip 会报告修复前后的情况。握持位置在错误一侧时,需要重新设置握持位置。

它会报告修复前后的扫描结果。它还会列出手部必须到达手臂无法触及位置的帧,因为只有新姿势才能修复这些问题。

examples/motion_test.py 会在示例绑定上录制一个包含两种常见故障的片段。步枪滚转 75 度后又转回,且只在两端设置关键帧,因此两只手会在关键帧之间从步枪上漂移。一帧还会跳动 15 cm。扫描和修复结果如下:

检查项修复前修复后
左手在步枪上的漂移2.27 cm0.48 cm
右手在步枪上的漂移1.67 cm0.45 cm
手部最快速度(pop)450 cm/s33 cm/s
间隙0.93 cm0.0 cm

修复改动了 43 帧中的 34 帧,之后所有检查项均通过。它还标记了 6 帧,其中左臂与握持位置相差 0.46 cm,仍在 0.5 cm 的限制范围内。(在 0.3.1 之前,间隙读数为 0.0 cm:角点未能检测到步枪内部的前臂。)

安装

你需要 Blender 和 Python 3.10 或更高版本。我在安装了 Blender 5.2.2 和 Python 3.14 的 Windows 10 上进行了测试。目前还未测试 macOS、Linux 或较旧版本的 Blender。

uvx poselab-mcp

或者运行 pip install poselab-mcp,然后运行 poselab-mcp。

将其添加到 Claude Code:

claude mcp add poselab -- uvx poselab-mcp

或者添加到任意 MCP 客户端的配置中:

{
  "mcpServers": {
    "poselab": {
      "command": "uvx",
      "args": ["poselab-mcp"],
      "env": { "POSELAB_BLENDER": "C:/Program Files/Blender Foundation/Blender 5.2/blender.exe" }
    }
  }
}
设置
变量含义
POSELAB_BLENDERBlender 的可执行文件路径;当它不在 PATH 或常见安装目录中时使用
POSELAB_RIGS描述自定义绑定的 rigs.json(参见 examples/rigs.example.json)
POSELAB_OUTPose Lab 唯一写入的文件夹(渲染结果、保存的片段、工作进程日志);默认值为 ~/.poselab

绑定

内置示例(load_rig {"rig": "sample"})无需任何文件。Pose Lab 会通过代码在 Blender 中构建它:两条手臂使用 Unreal 人形骨骼名称,握持着一支带有可后拉式拉机柄的 AR 式步枪。

自定义绑定来自 FBX 文件:手臂网格、静止姿势、步枪和片段。请在 rigs.json 中描述它们(复制 examples/rigs.example.json),并将 POSELAB_RIGS 指向该文件。片段可以是同一骨架上的 FBX 动画,也可以是 <clip>.pose.json 骨骼数据:{"fps": 30, "frames": [{"bone": [[x, y, z], [w, x, y, z]], ...}, ...]},表示静止姿势骨架上每个骨骼的局部位置和旋转。(Blender 重新导入自己导出的 FBX 动画时会误读;使用骨骼数据可以避免此问题。describe 会报告每个 FBX 片段与骨架的匹配情况。)

安全

  • Pose Lab 只读取你的骨架和动画片段文件。它只会在 POSELAB_OUT 内写入渲染结果、保存的动画片段和日志。
  • Blender 工作进程只监听 127.0.0.1 上的空闲端口,并且只响应携带会话随机令牌的请求。它只运行 Pose Lab 自带的命令。

工作原理

  • poselab_mcp/server.py:MCP 服务(官方 Python SDK,标准输入/输出)。
  • poselab_mcp/worker_client.py:首次调用时启动一个无头 Blender,并保持骨架处于加载状态。
  • poselab_mcp/blender/lab.py:在 Blender 内部处理骨架、帧、测量、IK、求解器和渲染。
  • poselab_mcp/blender/sample.py:内置示例骨架。

测试

python examples/selftest.py

它像 MCP 客户端一样启动服务并加载示例骨架。随后它重现上面的问题:仅转动时不会显示端口,而转动并移动时会显示。联系表会保存到 ~/.poselab/renders/sheet.png。

python examples/motion_test.py

它录制上面描述的故障动画片段,对其进行扫描、修复,并将 roll_fixed.pose.json 和 roll_fixed.fbx 保存到 ~/.poselab/clips/。

blender -b -P examples/anatomy_faults.py

它每次在示例骨架上设置一个已知故障,并在检查漏检时失败:手指向侧面弯折、手部相对于前臂扭转、手部位于平坦表面内、仅指尖接触,以及带有字节顺序标记的骨架文件。这些故障来自真实骨架的基准测试(见下文)。

基准测试

benchmarks/ 用于测试与仅使用渲染结果相比,模型借助 Pose Lab 的测量数据能否更好地摆姿。它会在示例骨架上运行五项任务,并使用 Pose Lab 对结果评分。脚本化预言机和什么都不做的对照组会检查评分器。参见 benchmarks/README.md。

benchmarks/runs/2026-10-09-toangtown-m24 在真实游戏骨架上测试这些检查本身:手部放在弹匣上的 8 个姿势,其中 7 个带有已知故障。Pose Lab 0.3.0 检出了 5 个故障,并以 40% 的深度读出穿模;0.3.1 检出了全部 7 个故障,且深度读数准确。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。