想象你开了一家“动作复印店”。舞蹈大师跳了一支帅气的连招,你在她全身贴上几十张“荧光贴纸”,用一圈高速相机把她的动作完整录下来——这相当于拿到了一张“动作母带”。这时游戏公司的阿明跑来,掏出一个 U 盘说:“我要把这段动作复印到一百个角色身上!”问题是,这些角色里有矮胖的机器人、高瘦的精灵,还有一台性能堪忧的老手机。你要做的,就是把母带上的抖动、穿帮、断片全部修掉,再把“大师的舞步”翻译成每个角色“自己的身体方言”,最后压缩成不同设备都跑得动的版本。这一整套流程,就是动作捕捉(MoCap)数据的处理流程:采集、清理、重定向、选格式、做优化、进引擎。今天我们就顺着这条流水线走一遍,看看一个“直接能用”的动画背后,到底藏着多少功夫。

岗位关联

对 AI 从业者来说,动捕数据处理是理解“真实数据如何被清洗、归一化、迁移到新环境”的最佳样板——它和训练数据预处理、迁移学习的思路如出一辙,也是数字人与虚拟制片赛道的基础功。

目录
  1. 可视化演示
  2. 动捕原理基础
  3. 现场采集准备
  4. 数据清理修复
  5. 骨骼重定向
  6. 常用工具格式
  7. 性能优化
  8. 引擎集成
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

动捕数据处理流程 噪声清理:原始 vs 清理后 清理后 (平滑+插值) 骨骼重定向:源骨骼 → 目标角色 MoCap: 光学/惯性捕捉→噪声清理(抖动/穿透/缺失帧)→骨骼重定向(源骨骼→目标角色)→BVH/FBX格式存储→动画优化(平滑/循环/压缩)

动捕原理基础

复印店最核心的设备是那面“高速相机墙”。大师身上贴了几十张荧光贴纸,也就是标记点,相机墙从四面八方同时拍照。每台相机看到的贴纸位置都不一样,就像你闭上一只眼、再换另一只眼看远处的灯,灯的“背景”会移动。计算机正是利用这种视差,反推出每个贴纸在三维空间中的坐标,这就是光学动捕的基本原理。

除了光学动捕,还有惯性动捕——不用相机,而是在关节上绑小陀螺仪和加速度计,像揣在口袋里的计步器,但它会随时间慢慢“漂移”,需要定期校准。标记点采集的质量直接决定后期清理工作量:贴纸掉了、被手挡住、灯光反光,都是常见事故。

把标记点连成骨骼后,系统真正关心的是“关节弯了多少度”,而不是“贴纸在哪”。因为游戏引擎里的角色姿势靠关节旋转表达。相邻两块骨头之间的夹角,是动捕数据最基本的单元。

所以“复印”的第一步,是把大师身上每个关节的“弯曲度数”记成一张精确的“身体刻度表”。刻度表准不准,决定后面复印出的动作像不像大师本人。这就像学跳舞,如果只记“手抬到胸口”而不记“上臂与躯干成 45 度”,跳出来就会千奇百怪。

θ=cos⁡−1(a⃗⋅b⃗∣a⃗∣ ∣b⃗∣)\theta = \cos^{-1}\left(\frac{\vec{a} \cdot \vec{b}}{|\vec{a}| \, |\vec{b}|}\right)
这个公式用两个骨头的方向向量算出关节弯曲角度,是动捕数据从“坐标”变成“姿势”的翻译官。
  1. 构造骨骼向量把相邻两个关节连成一个向量,比如“上臂”这条骨头。
    a⃗=pelbow−pshoulder\vec{a} = p_{\text{elbow}} - p_{\text{shoulder}}
  2. 理解点积点积把两个向量的长度和方向综合成一个数,它与夹角的余弦成正比。
    a⃗⋅b⃗=∣a⃗∣ ∣b⃗∣cos⁡θ\vec{a} \cdot \vec{b} = |\vec{a}| \, |\vec{b}| \cos\theta
  3. 归一化成余弦两边同时除以模长乘积,得到夹角的余弦值,范围在 -1 到 1 之间。
    cos⁡θ=a⃗⋅b⃗∣a⃗∣ ∣b⃗∣\cos\theta = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| \, |\vec{b}|}
  4. 反余弦还原角度对余弦值取反余弦,就得到这个关节当前弯曲了多少度。
    θ=cos⁡−1(a⃗⋅b⃗∣a⃗∣ ∣b⃗∣)\theta = \cos^{-1}\left(\frac{\vec{a} \cdot \vec{b}}{|\vec{a}| \, |\vec{b}|}\right)

现场采集准备

正式开印之前,复印店要先“校版”——把复印机的白边对齐、纸放正。动捕现场也一样,第一步是场地标定:让相机们认识这片地板,确定原点和方向坐标,相当于给舞蹈室画好地砖线,这样所有相机看到的标记点才有共同语言。

接着是动作编排。别看大师跳得随意,好的动捕拍摄会像拍电影一样定“分镜”:起手式多停两帧、关键爆发点面向哪台相机,都要先说清楚。因为游戏动画讲究“可拼接”,动作开头和结尾通常要回到一个中立姿势,方便引擎做状态切换。

采集时计算机会实时预览骨架,导演盯着屏幕喊“这条过了”。此时原始数据还没清理,但已经能看出大体节奏。采集的帧率和标记点数直接决定了文件体积,这就是为什么动捕文件动辄几百兆——每一个标记点的 x、y、z 坐标,每一帧都要记一遍。

“校版”校得好,后面每张“复印纸”都清晰;现场多花十分钟检查标定,省的是后期几小时的清理。就像做菜前把葱姜蒜切好备齐,下锅时才不会手忙脚乱。

D=F×J×3×T×4D = F \times J \times 3 \times T \times 4
数据量等于帧率、标记点数、坐标通道数、时长和单值字节数的乘积,帮你在拍摄前就估算出“母带”要占多大硬盘。
  1. 帧率 F每秒拍多少帧,动捕常见 60 到 240 帧每秒,帧率越高越能捕捉爆发动作。
    F=120 帧/秒F = 120\ \text{帧/秒}
  2. 标记点数 J全身贴纸数量,一般 40 到 70 个,每个都要记录位置。
    J=60 个标记点J = 60\ \text{个标记点}
  3. 通道数 3三维空间里每个位置需要 x、y、z 三个数值。
    3=x, y, z 三个坐标轴3 = \text{x, y, z 三个坐标轴}
  4. 时长 T 与字节 4乘上跳舞的秒数,再乘上每个浮点数占的 4 字节,就是总数据量。按上面数字拍 10 秒,约 864KB。
    D=120×60×3×10×4=864000 字节D = 120 \times 60 \times 3 \times 10 \times 4 = 864000\ \text{字节}

数据清理修复

母带拿到手,问题就来了:大师身上贴纸偶尔被手臂挡住,相机会“卡壳”丢几帧;器材的电子噪音让关节像得了帕金森一样抖;动作太猛时手直接穿进了身体,这叫“穿模”。所有这些问题都要在“剪辑台”上修掉,这是动捕流程里最耗时的一步。

噪音消除最常用的是滤波。想象你握住一条抖动的水管——握得越紧,水越平稳,但水流细节也越少。滑动平均滤波就是让每个点参考前后几个邻居,把孤立的小抖动“平均”掉。窗口大小是个平衡:太小去不干净,太大动作变“棉花拳”。

穿模修复要借助碰撞体——给身体和手各套一个看不见的“安全气泡”,一旦手伸进别的气泡,就把它推出来。缺帧插值则简单些:上一帧手在左边,下一帧手在右边,中间没录到的几帧按时间均匀补上,动作看起来还是连贯的。

这一步相当于把大师的原始录像剪成干净利落的“教学带”:没有雪花、没有穿帮、没有断片。教学带越干净,后面每个照着学的人才不会把错误动作也学走。

yt=12k+1∑i=−kkxt+iy_t = \frac{1}{2k+1}\sum_{i=-k}^{k} x_{t+i}
滑动平均滤波:把第 t 帧的坐标替换成它前后共 2k+1 帧的平均值,像用毛刷把抖动的曲线“捋”平。
  1. 确定窗口大小k 是半窗口,比如 k=3 表示取前后各 3 帧,共 7 帧参与平均。
    2k+1=2×3+1=72k+1 = 2 \times 3 + 1 = 7
  2. 累加求和把这 7 帧的位置数值全部加起来。
    ∑i=−33xt+i=xt−3+⋯+xt+⋯+xt+3\sum_{i=-3}^{3} x_{t+i} = x_{t-3} + \dots + x_t + \dots + x_{t+3}
  3. 除以帧数取平均总和除以 7,得到本帧的平滑值。
    yt=xt−3+⋯+xt+37y_t = \frac{x_{t-3} + \dots + x_{t+3}}{7}
  4. 逐帧滑动对每一帧都做同样操作,窗口像一只眼睛顺着时间轴滑过去。k 越大越平滑,但细节丢失越多。

骨骼重定向

教学带准备好了,但学生来了——游戏里的角色可不像大师。大师身高 1.7 米,精灵角色 2.2 米,机器人甚至没有腰。要让所有学生都能学会这支舞,就得把“舞谱”翻译成各自的“身体方言”,这就是骨骼重定向。

翻译分三步。骨架映射:把大师骨架的“肩膀”对上精灵骨架的“肩膀”,解决骨骼命名和层级不一致的问题;比例缩放:精灵腿长,那就把大师每一帧的腿部关节偏移按长度比放大;IK 约束:保证精灵的脚在蹲下时死死踩在地上不滑步,手不插进大腿里。

技术上,重定向普遍用“局部相对”思路:不直接搬运世界坐标,而是以每个角色的骨盆为原点,只搬运“相对于骨盆的偏移”,再乘上比例系数。这样角色站在原地和移动时,重定向结果都稳定。

这就像同一套广播体操,校长做、小学生做、机器人做,动作结构一样,幅度各自调整。好的重定向会让每个角色都跳得“像大师”,又“像自己”。

pj′=proot′+s⋅(pj−proot),s=LtargetLsourcep'_j = p'_{\text{root}} + s \cdot (p_j - p_{\text{root}}), \qquad s = \frac{L_{\text{target}}}{L_{\text{source}}}
重定向公式:先算出关节相对根节点的偏移,再按源骨骼与目标骨骼的长度比例缩放,最后对齐到目标角色的根节点上。
  1. 确定根节点通常选骨盆作为“复印基准线”,所有偏移都相对于它计算。
    proot=源骨骼的骨盆位置p_{\text{root}} = \text{源骨骼的骨盆位置}
  2. 计算相对偏移用关节位置减去根节点位置,得到“离骨盆多远”这个关键量。
    pj−prootp_j - p_{\text{root}}
  3. 求比例系数 s目标骨骼的某根骨头长度除以源骨骼对应骨头长度。
    s=LtargetLsource=0.7 米0.5 米=1.4s = \frac{L_{\text{target}}}{L_{\text{source}}} = \frac{0.7\ \text{米}}{0.5\ \text{米}} = 1.4
  4. 缩放并对齐偏移乘以 s 后,加上目标角色的根节点位置,就得到新骨架上的关节坐标。
    pj′=proot′+1.4×(pj−proot)p'_j = p'_{\text{root}} + 1.4 \times (p_j - p_{\text{root}})

常用工具格式

复印店的工作台上摆着几样固定工具:一台行业标准的“剪辑台”和几种不同的“乐谱格式”。动画界谈动捕编辑,绕不开 MotionBuilder——它几乎是所有动捕数据的第一站,专门用来导入原始数据、清理、重定向、微调曲线,是技术动画师的“主战场”。

格式方面,BVH 像一个纯文本的“简谱”:记录骨骼层级和每个关节的旋转通道,体积小、容易解析,很多 AI 动作生成的研究都用它做训练数据。但它不保存网格和蒙皮。FBX 则是“总谱”,能把骨骼、蒙皮权重、动画曲线、约束一网打尽,是游戏引擎和 DCC 软件之间交换的标准格式。

工具里频繁出现的操作是“重采样”:原始 120fps 数据太大,游戏通常只留 30fps,中间帧要用插值重新算出来。线性插值假设动作在两帧之间匀速变化,简单可控、代价低。

选对工具和格式,就像给复印店配好正版墨盒——BVH 轻便适合批量处理,FBX 完整适合进引擎,MotionBuilder 顺手适合精细修。用具不合适,再好的动作也会“印花”。

p(t)=(1−α) pi+α pi+1,α=t−titi+1−tip(t) = (1-\alpha)\,p_i + \alpha\,p_{i+1}, \qquad \alpha = \frac{t - t_i}{t_{i+1} - t_i}
线性插值公式:在前后两个关键帧之间,按时间比例把位置“等比拉扯”出中间帧。
  1. 定位前后关键帧找到 t 时刻落在哪两帧之间,取左帧 p_i 和右帧 p_{i+1}。
    ti≤t≤ti+1t_i \le t \le t_{i+1}
  2. 计算时间比例 αt 在区间内走了百分之多少,范围是 0 到 1。
    α=t−titi+1−ti\alpha = \frac{t - t_i}{t_{i+1} - t_i}
  3. 加权求和α 越接近 1,越靠近右帧,p_{i+1} 占比越大。
    p(t)=(1−α) pi+α pi+1p(t) = (1-\alpha)\,p_i + \alpha\,p_{i+1}
  4. 批量生成中间帧对每个关节、每根曲线都做同样处理,30fps 的骨架就平滑地“长”出来了。

性能优化

舞蹈教学带做出来了,可偏远山区的小剧场,也就是那些老手机,播放器带不动高清母带。动作数据也一样:一个 60 秒动作,30fps、60 个关节,光曲线就有几千条,移动端每帧都要解算。不优化,游戏就会卡成 PPT。

曲线抽稀是最常用的手段——动作曲线里大部分帧点其实落在一条“大致直线”上,把中间冗余的点去掉,只保留转折处,曲线形状几乎不变。数据压缩则是把 32 位浮点小数压到 16 位甚至 8 位,牺牲一点精度换体积和带宽。LOD 分层更聪明:远处角色用抽稀到极致的“简笔动画”,近处角色用完整动画,人眼根本看不出差别。

抽稀的判断逻辑像“三点共线测试”:如果中间点几乎落在前后两点连成的直线上,就把它删掉。怎么判断“几乎”?看两条首尾相连的小线段围成的平行四边形面积大不大。

优化讲究“看着像就行”。就像舞台剧排练,远处观众看不清手指细节,演员只需要做大动作——省下的力气可以用来多演几场。游戏的“力气”就是帧率和内存。

d=∣(Bx−Ax)(Cy−By)−(By−Ay)(Cx−Bx)∣d = |(B_x - A_x)(C_y - B_y) - (B_y - A_y)(C_x - B_x)|
三点共线判定公式:上一帧、当前帧、下一帧构成两条线段,叉积的绝对值近似“弯曲程度”,接近 0 就说明三点几乎在一条直线上,可以删除中间点。
  1. 取三个相邻点曲线上取上一帧 A、当前帧 B、下一帧 C。
    A=(Ax,Ay),B=(Bx,By),C=(Cx,Cy)A = (A_x, A_y),\quad B = (B_x, B_y),\quad C = (C_x, C_y)
  2. 构造两条线段向量AB 是 A 指向 B 的向量,BC 是 B 指向 C 的向量。
    AB⃗=(Bx−Ax, By−Ay),BC⃗=(Cx−Bx, Cy−By)\vec{AB} = (B_x - A_x,\ B_y - A_y), \quad \vec{BC} = (C_x - B_x,\ C_y - B_y)
  3. 计算叉积绝对值叉积的模等于这两条线段围成的平行四边形面积,三点共线时面积为 0。
    d=∣(Bx−Ax)(Cy−By)−(By−Ay)(Cx−Bx)∣d = |(B_x - A_x)(C_y - B_y) - (B_y - A_y)(C_x - B_x)|
  4. 阈值判定d 小于某个阈值就说 B 对曲线形状影响很小,删除 B,保留 A 和 C,然后继续检查下一个点。

引擎集成

学生终于拿到舞蹈 DVD,但 DVD 播放器,也就是游戏引擎,还要会剪辑播放顺序和调整速度。一个角色不能永远在跳这支舞——他要在城镇里走路、跑步、转向,被打时还要踉跄。这就轮到引擎里的动画状态机登场。

先把优化好的 FBX 导入引擎,设置好单位比例和坐标轴朝向——很多穿模、悬浮问题其实只是单位错了。然后把动作按“待机-走路-跑步”做成状态切换,状态之间用过渡条件连接。速度变化时则用混合空间:它像 DJ 打碟,根据摇杆的速度和方向,实时把两段动画按权重混成一段。

混合空间的核心就是看当前输入落在哪两个采样动作之间,按距离算权重,再线性混合。比如角色转身 30 度,引擎就在“原地转 0 度”和“原地转 60 度”两段动画之间按比例取中间姿态。

到这一步,“动作复印店”的整个流水线才算闭环:大师起舞,摄像机记录,工程师清洗翻译压缩,最后引擎里的每一个角色都活了起来。下次你在游戏里看到一个角色跑步、转身、拔剑一气呵成,那就是一整套动捕流水线在背后无声运转。

α=∣θ−θ1∣∣θ2−θ1∣,P=(1−α) P1+α P2\alpha = \frac{|\theta - \theta_1|}{|\theta_2 - \theta_1|}, \qquad P = (1-\alpha)\,P_1 + \alpha\,P_2
混合权重公式:输入的角度离哪个采样点近,哪个动画的权重就大,最终姿态是两段动画的加权平均。
  1. 输入目标条件比如角色当前要转向的角度 θ。
    θ=30∘\theta = 30^\circ
  2. 定位两边的采样点在混合空间里找到左右两段动画 P_1 和 P_2,对应角度 θ_1 和 θ_2。
    θ1=0∘,θ2=60∘\theta_1 = 0^\circ, \quad \theta_2 = 60^\circ
  3. 计算权重 α目标角度离左端点越远,α 越大,右段动画占比越高。
    α=∣30−0∣∣60−0∣=0.5\alpha = \frac{|30 - 0|}{|60 - 0|} = 0.5
  4. 加权混合得到最终姿态左右两段动画各占一半,就是平滑的 30 度转向姿态。
    P=0.5×P1+0.5×P2P = 0.5 \times P_1 + 0.5 \times P_2

AI 应用场景

游戏公司动作中台的清洗流水线

阶段:数据预处理

解决的问题:外包和动捕棚交来的数据格式混乱、噪音多、骨骼命名不统一。传统方式是动画师手动一帧帧修,一条 30 秒片段要改一整天。AI 公司会用规则引擎加小模型自动检测断帧、标记穿模、统一重定向到标准骨架,把“人工精修”压缩成“机器粗洗+人工抽查”。

具体案例:某大厂的动作库有上万条动捕片段,技术动画师写脚本批量跑清洗:先滤波再补帧,再用标准骨架重定向,全部成功后自动导入引擎,出错的进“待人工修”清单,整体效率提升 70%。

虚拟主播实时驱动

阶段:模型部署与实时推理

解决的问题:直播时主播戴惯性动捕套装,数据自带漂移,而且虚拟形象是 Q 版大头短腿,比例和真人差异巨大,直接用会不停穿模。

具体案例:系统每帧做滑动平均去噪、骨骼比例重定向、IK 约束脚部,把真人动作实时映射到 Q 版形象上,再用 LOD 让手机端流畅渲染。观众看到的主播比心、摇头、跺脚,其实每帧都经历了完整的动捕流水线。

用动捕数据训练 AI 动作生成模型

阶段:训练数据构建

解决的问题:动作生成模型(如 Motion Diffusion 系列)需要大量干净、骨骼一致的训练数据,原始动捕数据无法直接喂给模型。

具体案例:团队把清理重定向后的 BVH 数据统一重采样成 30fps、规整到同一套骨架,作为扩散模型的 ground truth,再结合自然语言指令生成新动作。清洗质量直接决定生成动作的逼真度——这就像“复印店”的母带越干净,印出来的每一张越像大师本人。

Python 演示

python60 行
import mathimport random  def noisy_trajectory(frames=120, period=8.0, noise_amp=0.3):    # 生成一段含噪的关节轨迹,模拟动捕原始数据    pts = []    for f in range(frames):        x = f / 10.0        y = math.sin(f / period) * 2.0 + random.uniform(-noise_amp, noise_amp)        pts.append((x, y))    return pts  def moving_average(pts, half_window=3):    # 滑动平均滤波:每个点用前后 half_window 个点的均值替换    cleaned = []    n = len(pts)    for i in range(n):        start = max(0, i - half_window)        end = min(n, i + half_window + 1)        avg_y = sum(p[1] for p in pts[start:end]) / (end - start)        cleaned.append((pts[i][0], avg_y))    return cleaned  def retarget(pts, source_bone=1.0, target_bone=1.4):    # 骨骼重定向:以首帧为根,按骨骼长度比例缩放各帧偏移    s = target_bone / source_bone    root_x, root_y = pts[0]    return [(root_x + (px - root_x) * s, root_y + (py - root_y) * s) for px, py in pts]  def angle_simplify(pts, keep=0.15):    # 角度抽稀:中间点与首尾点近似共线就删掉,模拟 LOD 优化    simplified = [pts[0]]    for i in range(1, len(pts) - 1):        ax, ay = pts[i - 1]        bx, by = pts[i]        cx, cy = pts[i + 1]        cross = abs((bx - ax) * (cy - by) - (by - ay) * (cx - bx))        if cross > keep:            simplified.append(pts[i])    simplified.append(pts[-1])    return simplified  def main():    raw = noisy_trajectory()    clean = moving_average(raw)    mapped = retarget(clean, target_bone=1.4)    lod = angle_simplify(mapped)    print("原始帧数:", len(raw))    print("清理后帧数:", len(clean))    print("重定向后关节首坐标:", tuple(round(v, 2) for v in mapped[0]))    print("抽稀后保留帧数:", len(lod), "占比 %.0f%%" % (len(lod) / len(raw) * 100))  if __name__ == "__main__":    main()
目的:用一小段脚本模拟完整的动捕处理流水线——生成带噪轨迹、滑动平均去噪、按骨骼比例重定向、角度抽稀简化,展示“采-清-重-优”四个环节。
  1. y = math.sin(f / period) * 2.0 + random.uniform(-noise_amp, noise_amp)用正弦曲线模拟干净动作,再叠加随机噪音模拟动捕硬件抖动
  2. avg_y = sum(p[1] for p in pts[start:end]) / (end - start)滑动平均核心,把前后窗口内的 y 值求平均,噪音被“抹平”
  3. s = target_bone / source_bone计算源骨骼与目标骨骼的长度比例,这是重定向的“缩放系数”
  4. (root_x + (px - root_x) * s, ...)只缩放相对根节点的偏移,根节点本身不动,保证角色站位不飘
  5. cross = abs((bx - ax) * (cy - by) - (by - ay) * (cx - bx))用叉积判断三点是否近似共线,共线就删中间点,对应曲线抽稀
  6. print("抽稀后保留帧数:", len(lod), ...)打印压缩效果,让优化成果看得见

常见误区

误区动捕棚导出的动画文件导入引擎就能得到和现场一样的效果,不需要额外处理。

正解原始数据充满噪音、丢帧、穿模和比例不适配。就像现场录的舞蹈视频有杂音和穿帮镜头,必须经过清理和重定向才能进引擎。跳过清洗直接上线,角色会抖动、滑步、穿模,返工成本比先清洗高得多。

为何常见:厂商 Demo 展示的都是处理后的成品,让人误以为“捕捉即所得”。

误区把骨骼整体缩放一下,动画自然就适合新角色了。

正解整体缩放只解决长度问题。骨骼层级、命名、旋转顺序甚至关节数量都可能不同;还需要 IK 约束来保证脚不穿地、手不插身。就像把成人舞谱硬塞给小孩,不调整节拍和幅度,孩子跳不出那个味道。

为何常见:直观上觉得“大号复制小号”就是缩放,忽略了骨架结构差异。

误区为了消除抖动,把平滑窗口开得很大,结果动画变得很软,还觉得是手感问题。

正解窗口越大细节丢失越多,爆发力动作会变成“棉花拳”。正确做法是先用小窗口试,对四肢和躯干用不同强度,甚至用保留细节的平滑算法。

为何常见:“去噪”两个字让人以为噪音越少越好,忽略了动作本身才是主体。

误区动捕都拍 120fps,游戏也应该全部用 120fps 才顺滑。

正解游戏通常 30fps 就够,高帧率数据占用大量内存带宽。高频细节在游戏里感知不到,反而拖累性能。正确做法是离线重采样到目标帧率,顺便把高频抖动滤掉。就像电影 24 帧就让人感觉流畅,盲目加帧只是浪费胶片。

为何常见:“参数越高越好”的思维惯性,没考虑渲染预算。

误区都是动作文件,改个名字就能互相换。

正解BVH 是纯文本的骨骼层级旋转数据,不含网格蒙皮;FBX 是容器格式,包含骨架、蒙皮权重、约束、动画曲线甚至自定义属性。两者转换常有信息丢失。就像简谱和总谱都能演奏同一首歌,但总谱包含的演奏信息完整得多。

为何常见:在软件里都能导入,看起来“都是动作”。

面试题

Q1. 动捕数据从设备拿到后,第一步通常要做什么?

单选题 · easy

  • A.直接导入引擎播放
  • B.清理噪音和断帧← 正确答案
  • C.压缩成低帧率数据
  • D.拆分成多个小片段

答案:B。原始动捕数据充满传感器抖动、遮挡断帧和穿模,直接进引擎会让角色像帕金森一样抖、脚下滑步。就像录音棚原声带要先去噪修音才能发唱片。压缩和拆分都是清理之后的后处理,播放更是最后的事。

Q2. 下列哪种动捕方式最依赖反光标记点?

单选题 · mid

  • A.惯性动捕的关节传感器
  • B.光学动捕的多相机捕捉← 正确答案
  • C.视频动捕的单目估算
  • D.游戏手柄的按键输入

答案:B。光学动捕靠多台相机捕捉身体上反光贴纸的影像来重建三维坐标,最依赖标记点。惯性动捕用陀螺仪不依赖贴纸,视频动捕靠图像算法,手柄输入则与标记点完全无关。

Q3. BVH 动作文件里主要保存的内容是?

单选题 · mid

  • A.关节层级与旋转通道← 正确答案
  • B.网格顶点与颜色数据
  • C.材质贴图与光照参数
  • D.音频和音效时间轴

答案:A。BVH 是纯文本的骨骼层级加每个关节的旋转通道数据,相当于“简谱”。它不保存网格顶点、材质贴图和音频,所以网格、光照、音效相关的选项都是干扰项。

Q4. 动捕数据的清理修复通常包括哪些工作?

多选题 · mid

  • A.消除传感器的抖动噪音← 正确答案
  • B.修复肢体穿模的问题← 正确答案
  • C.补齐被遮挡的缺失帧← 正确答案
  • D.为模型重新绘制贴图

答案:ABC。清理修复三大件是去噪、修穿模、补缺帧,对应“教学带”去掉雪花、穿帮和断片。绘制贴图是美术环节,和动作数据无关。

Q5. 骨骼重定向时,遇到身高差异大的角色,最基础的处理是?

单选题 · easy

  • A.按骨骼长度比例缩放偏移← 正确答案
  • B.把动画帧率改成相同
  • C.直接复制关节旋转值
  • D.删除多余的全部骨骼

答案:A。重定向最基础是按骨骼长度比例缩放关节相对根节点的偏移,就像把大师的舞步按学生腿长换算。改帧率不解决长度差异,直接复制旋转值在长骨架上会造成末端大幅偏差,删骨骼会破坏层级。

Q6. 滑动平均滤波的窗口 k 调得过大,主要风险是?

单选题 · mid

  • A.动作细节被过度抹平← 正确答案
  • B.骨骼比例发生了改变
  • C.动画文件体积成倍增大
  • D.穿模问题变得严重

答案:A。窗口越大,参与平均的帧越多,高频细节被抹得越狠,爆发性动作会变软。它不改变骨骼比例,也不增加文件体积,更不会直接解决穿模——穿模要靠碰撞体与 IK 修复。

Q7. 把动作重定向到体型差异巨大的角色时,正确的做法包括?

多选题 · hard

  • A.建立正确的骨架映射表← 正确答案
  • B.用 IK 约束脚不穿地面← 正确答案
  • C.注意骨骼旋转顺序差异← 正确答案
  • D.把所有旋转值强制归零

答案:ABC。映射表解决“哪个关节对哪个关节”,IK 约束解决滑步和穿刺,旋转顺序不同会导致方向错误。归零旋转是破坏性操作,会毁掉整个动作,相当于把舞谱全部涂掉。

Q8. 移动端游戏采用动捕动画 LOD 的主要目的是?

单选题 · mid

  • A.远距离角色用简化动画← 正确答案
  • B.提高动捕相机的分辨率
  • C.增加骨骼节点的数量
  • D.缩短动画文件的导出

答案:A。LOD 的思路是远处角色用抽稀到极致的简笔动画,近处才用完整动画,人眼看不出差别但性能省一大截。它和相机分辨率、骨骼数量、导出时间都没有关系。

Q9. 关于 BVH 与 FBX 动作格式,下列说法正确的有?

多选题 · hard

  • A.BVH 是纯文本层级旋转格式← 正确答案
  • B.FBX 能保存蒙皮权重约束← 正确答案
  • C.FBX 常用于引擎与 DCC 交换← 正确答案
  • D.BVH 可以保存完整角色网格

答案:ABC。BVH 只存骨骼层级和旋转通道,是“简谱”;FBX 是“总谱”,能保存蒙皮权重、约束和动画曲线,也是引擎与 DCC 之间的事实标准。BVH 不含网格,D 错误。

Q10. 角色转向与奔跑速度动画混合,引擎中最常用的手段是?

单选题 · easy

  • A.混合空间做速度过渡← 正确答案
  • B.骨骼权重重新绘制
  • C.贴图纹理的压缩
  • D.屏幕反走样设置

答案:A。混合空间像 DJ 打碟,根据输入的速度和方向给左右两段动画加权混合。骨骼权重是蒙皮的事,纹理压缩和反走样是渲染的事,与动作混合无关。