设想你是一位音乐制作人,面前摆着一台 32 路的调音台。键盘手的声音从第一路进来,贝斯手在第二路,主唱在第三路——你不需要让乐手重新排练,只需要拨动推子,就能让某一轨大声、某一轨安静,最后混出一首全新的歌。数字人的脸,就是一支永远在线的乐队;Blendshape 表情系统,就是那台调音台。 在 3D 世界里,一张“面无表情”的中性脸是乐队的干声底稿;每一个基础表情靶标——微笑、难过、惊讶、生气——都是提前录好的单轨音色;推子的位置对应代码里的“权重”。权重大,这个表情的痕迹就明显;权重小,它就悄悄退到背景里。把所有音轨按比例混合,就能得到千变万化的最终表情。本文会带你从录制音轨(靶标建模)、拨弄推子(权重混合)、写自动化台本(控制器),到加限幅器防爆音(极限控制),一步步搭起属于你的表情调音台。

岗位关联

掌握 Blendshape,你就拿到了 3D 数字人表情驱动的“通用接口”——无论是虚拟主播、游戏角色还是影视替身,这套底层逻辑都能让你把僵硬的假脸调成细腻的真实表演,是数字人领域最有复利的技术底座之一。

目录
  1. 可视化演示
  2. 核心原理:一支乐队,一套推子
  3. 靶标建模:给乐队写标准谱子
  4. 权重混合:推子怎么动,混音就怎么来
  5. 控制器设计:把推子写进自动化台本
  6. 自然度优化:让混音不刺耳
  7. 极限控制:压缩器与防爆音
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示Blendshape表情系统核心机制:权重混合模式可视化FACS靶标AU4/AU6/AU12/AU15/AU25的权重动态与网格顶点变形,靶标模式对比五类基础表情靶标的面部示意与权重值。

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

Blendshape权重混合 AU4皱眉靶标权重 AU6颊升靶标权重 AU12微笑靶标权重 V=B+Σ(wᵢ·Tᵢ) 线性混合公式

核心原理:一支乐队,一套推子

想象一位调音师站在 32 路调音台前:键盘的旋律在第 1 路,贝斯的根音在第 5 路,主唱的嗓音在第 12 路。要让一首歌听起来完全不同,他不需要让乐手重新进棚录音,只需要把某一轨的推子推高、另一轨拉低,混音就有了新的灵魂。数字人的脸,就是一支永远在线的乐队;而 Blendshape 表情系统,就是这张脸的调音台。

在 3D 世界里,模型的脸不是照片,而是由成千上万个“顶点”围成的网格。表情变化,本质上是顶点的位置发生了移动。Blendshape(混合变形)的思路极其朴素:先准备一张面无表情的中性网格作为“干声底稿”,再为每种基础表情准备一套“靶标网格”作为单轨音色,最后按比例把靶标叠加回中性网格上。

如果用数学语言描述这个过程,每一套靶标与中性网格的差值,就是该表情的“位移方向”;而权重则决定了这个方向被施加多少。完整的混合公式如下:

回到调音台:每一条靶标音轨都在表演前录好了,调音师要做的只是推推子。权重为 0,推子到底,音轨静音;权重为 1,推子拉满,脸上完全是靶标的表情。中间任意值,都是两者之间的混合状态——这正是 Blendshape 名字里 “Blend(混合)” 的含义。

S=S0+∑i=1nwi⋅(Ti−S0)\displaystyle S = S_0 + \sum_{i=1}^{n} w_i \cdot (T_i - S_0)
通俗地说:把每个顶点从“中性位置”走向“靶标位置”的路径看作一根箭头,权重就是箭头伸出去的长度。把所有箭头按比例加回中性脸上,就是最终表情。
  1. 中性网格 $S_0$所有变形的起跑线,记录每个顶点的初始坐标;没有它,位移就无从度量。
    S0S_0
  2. 靶标位移 $(T_i - S_0)$靶标顶点与中性顶点的差值,指明该表情要“往哪个方向掰多少”。
    Ti−S0T_i - S_0
  3. 权重系数 $w_i$0 到 1 之间的参与度,越大该表情越明显,越小越接近中性。
    0≤wi≤10 \le w_i \le 1
  4. 累加混合把所有靶标的加权位移逐顶点加到中性网格上,得到最终表情。
    S=S0+∑i=1nwi⋅(Ti−S0)\displaystyle S = S_0 + \sum_{i=1}^{n} w_i \cdot (T_i - S_0)

靶标建模:给乐队写标准谱子

乐队演出前,每一位乐手必须对着同一份谱子排练。如果吉他手理解的“微笑”是下压琴弦,鼓手理解的“微笑”却是砸镲片,那合奏必然是灾难。表情靶标也是同样的道理:它是整个 Blendshape 系统的“标准谱”,所有后续的混合、控制、修正都要以它为准。

为了让“谱子”有科学依据,业界普遍参考 FACS(面部动作编码系统)。FACS 把面部肌肉动作拆解成一个个动作单元(AU),例如 AU6 表示脸颊提升、AU12 表示嘴角上拉、AU4 表示眉毛下压。任何一个基础表情靶标,都可以看成若干动作单元按强度叠加而成:

建靶标时有几条硬规矩:第一,靶标网格必须与中性网格同拓扑、同顶点数,否则无法逐顶点相减;第二,常用基础表情集覆盖微笑、难过、惊讶、愤怒、厌恶、恐惧六大类;第三,优先做左右对称设计,只绑定半张脸的靶标,再利用镜像生成另一半,效率翻倍的同时还能保证对称性。

谱子写得越标准,后面的混音越省事。FACS 是乐理,基础表情集是乐谱,对称拆分是排练时的双人合练——这些准备工作决定了一支“表情乐队”能演得多好。

E=∑k=1mak⋅AUk\displaystyle E = \sum_{k=1}^{m} a_k \cdot AU_k
组合公式:微笑 ≈ 0.8×AU6(脸颊提升) + 0.9×AU12(嘴角上拉) + 0.3×AU25(嘴唇分开)。动作单元是音色的“基频”,叠加起来才是一段完整的旋律。
  1. 动作单元 $AU_k$FACS 定义的最细粒度肌肉动作,一个 AU 只负责一块区域的运动。
    AUkAU_k
  2. 激活强度 $a_k$该动作单元参与表情的程度,越大越明显。
    aka_k
  3. 叠加成表情 $E$把多个动作单元按强度叠加,得到一个基础表情靶标。
    E=∑k=1mak⋅AUk\displaystyle E = \sum_{k=1}^{m} a_k \cdot AU_k

权重混合:推子怎么动,混音就怎么来

调音台上最热闹的永远是那些推子。推子往上,音轨的声音变大;推子往下,声音变小。在 Blendshape 里,推子的位置就是“权重”——一个决定靶标影响程度的数值。

听起来很简单,但问题来了:同一个顶点可能同时隶属于微笑、惊讶、说话三套靶标。三个靶标朝三个方向拉扯这个顶点,它到底听谁的?如果直接相加,顶点可能被拉出正常范围,脸就“爆”了。解决办法是归一化:让所有参与混合的权重先除以它们的总和。

除了归一化,工程上还会给权重做“插值平滑”:权重不能一帧从 0 跳到 1,否则表情会像抽搐。常见的做法是用缓动函数把权重变化拉成 S 形曲线,让表情在几帧内自然过渡。另外还有多轴混合:把脸分成眼、眉、嘴等多个区域,每个区域独立混合后再拼回整体,互不干扰。

老调音师的经验是“总音量永远留三成余量”。归一化就是表情系统的总音控,它保证无论多少靶标同时参与,混音都不会失真,这也是 Blendshape 能稳定用于实时驱动的原因之一。

wi=wi′∑j=1nwj′\displaystyle w_i = \frac{w_i'}{\sum_{j=1}^{n} w_j'}
通俗地说,归一化就像调音台上的“总音量自动平衡”:无论你推了几个推子,混音总线都不会爆表。
  1. 原始权重 $w_i'$控制器或用户直接给出的初始权重,可能没有经过任何约束。
    wi′w_i'
  2. 总和归一 $\sum_{j=1}^{n} w_j'$分母是当前所有目标权重的总和,把比例压缩到和为 1。
    ∑j=1nwj′\displaystyle \sum_{j=1}^{n} w_j'
  3. 归一化结果 $w_i$除以总和后,所有权重相加等于 1,顶点位移被控制在合理范围内。
    wi=wi′∑j=1nwj′\displaystyle w_i = \frac{w_i'}{\sum_{j=1}^{n} w_j'}

控制器设计:把推子写进自动化台本

真正演出时,调音师不可能同时握住 32 个推子。专业调音台支持“自动化”:先把推子动作录成台本,播放时电动推子自己动,调音师只需盯总控。表情控制器就是数字人脸上的自动化台本。

在工程里,用户不会直接写一串权重数组。他们操作的是“控制器参数”:一个 0~1 的滑块、麦克风音量、手柄摇杆的偏移量。控制器模块的任务,是把这些五花八门的参数翻译成 Blendshape 需要的权重。最简单的翻译就是线性映射加钳制:

真实工程不会只有一层控制器。常见的架构是分层的:顶层是情绪层(愤怒、喜悦),中层是语音层(嘴型、眨眼),底层是细节层(眉毛微动)。每一层输出若干个权重,叠加后才是最终送进混合公式的权重。动捕数据也是如此:演员的 AU 强度经过降噪、归一化后,映射到角色对应的靶标权重上。

自动化台本让乐队可以“无人演奏”,但调音师依然在现场。直播场景中,主播只要开口说话,语音音量就自动驱动嘴部权重;弹幕引爆时,惊讶靶标自动触发——这一切都靠控制器这一层台本在背后跑。

w=clamp(k⋅p,  0,  1)\displaystyle w = \mathrm{clamp}(k \cdot p, \; 0, \; 1)
clamp 是“夹住”的意思:结果小于 0 就取 0,大于 1 就取 1,保证权重永远合法。
  1. 控制器参数 $p$用户输入,比如滑块位置、语音音量、视线方向。
    pp
  2. 灵敏度系数 $k$决定同样的输入能产生多大的表情幅度。
    kk
  3. 钳制 clamp把 $k \cdot p$ 的结果限制在 [0,1] 区间内,超出的部分被截掉。
    w=clamp(k⋅p,  0,  1)\displaystyle w = \mathrm{clamp}(k \cdot p, \; 0, \; 1)

自然度优化:让混音不刺耳

新手调音师有个通病:把几个推子全推满,结果低频轰头、高频刺耳。老手会留余地:该收的收,该柔的柔。表情也一样,权重全部拉满的脸,看起来像教科书式的僵硬夸张表演,观众一眼就能看出“假”。

不自然有三个来源:第一,权重超出了人类肌肉的真实极限,比如嘴角上提 3 厘米,现实中根本做不到;第二,表情之间缺乏联动,现实中皱眉和微笑几乎不会同时满强度出现;第三,缺少微表情细节,真实人脸有不易察觉的颤动。针对这些,工程上有三招:限定合理权重范围、联动衰减、微表情叠加。

其中最基础的一刀是给权重加一条柔化曲线。把一次线性映射变成指数映射,让权重在低区段更“轻”,高区段才逐渐发力,这样表情启动时是缓慢的、收尾时是柔和的,符合肌肉发力习惯:

一台成熟调音台会挂上 EQ 和压缩器让声音“贴耳”;自然度优化就是表情系统的 EQ。极限参数限制是生理边界,联动衰减是表情间的化学反应,微表情是画龙点睛——三者合起来,数字人的脸才从“假脸”过渡到“活脸”。

weff=wγ,γ>1\displaystyle w_{\mathrm{eff}} = w^{\gamma}, \quad \gamma > 1
指数柔化:γ 越大,曲线中段被压得越狠,表情的“起势”越平缓。就像吉他手推揉弦,先轻后重,而不是一把按死。
  1. 原始权重 $w$线性混合计算出的权重。
    ww
  2. 柔化指数 $\gamma$大于 1 的常数,控制柔化程度,越大越平缓。
    γ>1\gamma > 1
  3. 有效权重 $w_{\mathrm{eff}}$经过柔化后真正送入混合公式的权重。
    weff=wγw_{\mathrm{eff}} = w^{\gamma}

极限控制:压缩器与防爆音

再好的调音师也防不住乐手 solo 时的疯狂输出。专业调音台最后一道防线是一台“限幅器”:音量超过阈值,直接压掉。Blendshape 的极限控制,就是面部动画的限幅器。

多个靶标组合叠加时,顶点可能被拉到物理上不可能的位置,产生头部穿透、嘴角撕裂、眼皮凹陷等伪影。极限控制分两层:数值钳制,限制每个权重的上限;修正形状,为特定组合准备“补丁靶标”。最终的表情输出公式变成:

工程实现里,修正形状的触发通常是“查表 + 实时判断”:系统维护一张组合表,例如“惊讶+大笑”对应一个嘴角拉伸修正,“闭眼+大笑”对应一个眼睑保护修正。当控制器的输入组合接近表里的条件时,$c_j$ 自动升高,把伪影悄悄压下去。数值钳制则更简单粗暴:每个权重在进混合公式前先 clamp 到 [0, w_max],w_max 由该靶标的生理极限决定。

限幅器和补录音轨,保证了无论乐手多疯狂,最终输出的声音都是安全的。数字人的脸也一样:无论观众弹幕如何引爆表情,无论语音音量飙到多高,极限控制都会兜住网格的每一次位移,让脸永远“不爆”。

Sfinal=S+∑i=1nwi⋅(Ti−S0)+∑j=1mcj⋅Cj\displaystyle S_{\mathrm{final}} = S + \sum_{i=1}^{n} w_i \cdot (T_i - S_0) + \sum_{j=1}^{m} c_j \cdot C_j
前两项是常规混合,最后一项是“急救包”:当大笑+张嘴同时发生时,自动触发一个防止嘴角撕裂的补丁形状。
  1. 基础混合结果前两项就是前面学过的标准 Blendshape 计算。
    S+∑i=1nwi⋅(Ti−S0)\displaystyle S + \sum_{i=1}^{n} w_i \cdot (T_i - S_0)
  2. 修正形状 $C_j$平时权重为 0,专门用来修补特定组合伪影的靶标。
    CjC_j
  3. 触发系数 $c_j$由组合检测模块计算出的修正强度,只在需要时大于 0。
    cjc_j

AI 应用场景

场景一:虚拟主播实时表情驱动

阶段:输入(语音/摄像头)→ 特征提取 → 权重映射(Blendshape 驱动)

解决的问题:传统手动按键做表情,反应慢 0.3~0.5 秒,而且只有五六种表情循环切换,观众一眼看穿“假脸”。用 Blendshape + 语音音量映射,就像调音台自动化一样,把音频振幅换算成嘴部 AU 权重,直播时嘴型自然跟上说话节奏。

具体案例:某虚拟主播在直播软件中用音频响度驱动张嘴权重,麦克风音量超过阈值时皱眉权重联动衰减,弹幕引爆时自动触发惊讶靶标 0.6 权重并持续 0.4 秒,直播效果从“面无表情念稿”变成“情绪饱满的临场表演”。

场景二:游戏角色对话动画

阶段:语义理解 → 情感标签 → 表情权重生成

解决的问题:手 K 关键帧动画量大、成本高,无法为每句 NPC 对话单独调表情。用 Blendshape 做程序化表情,台词情绪直接映射为基础表情权重组合,批量生成自然对话动画。

具体案例:开放世界 RPG 中,NPC 说话时程序根据台词情绪(愤怒/悲伤/轻松)生成基础表情权重组合,再叠加随机微表情和眨眼节奏,玩家路过同一个 NPC 多次也不会觉得“他在复读机式表演”。

场景三:影视数字替身表演重定向

阶段:表演捕捉 → 重定向 → 修正形状

解决的问题:真人演员的表情数据直接搬到 CG 角色上,骨骼比例不同、脸型不同,直接映射会崩坏。Blendshape 把演员的 AU 强度映射到 CG 角色靶标权重,靠修正形状兜住极端表情。

具体案例:某电影用头戴摄像头捕获演员 52 个 AU,通过 Blendshape 把 AU 强度映射到 CG 角色的靶标权重,并对嘶吼、大哭等极端表情自动触发修正形状,防止角色“爆脸”。

Python 演示

python56 行
class BlendShapeSystem:    """极简 Blendshape 表情混合系统(纯 Python 实现)"""     def __init__(self, neutral):        self.neutral = [list(v) for v in neutral]        self.targets = {}     def add_target(self, name, vertices):        if name in self.targets:            raise ValueError("target 已存在: " + name)        delta = []        for k, v in enumerate(vertices):            row = [v[i] - self.neutral[k][i] for i in range(len(v))]            delta.append(row)        self.targets[name] = delta     def blend(self, weights):        result = [list(v) for v in self.neutral]        for name, delta in self.targets.items():            w = weights.get(name, 0.0)            if w < 0.0 or w > 1.0:                raise ValueError("权重超出范围: " + name)            for k, d in enumerate(delta):                result[k] = [result[k][i] + w * d[i] for i in range(len(d))]        return result  def normalize_weights(raw_weights):    total = sum(raw_weights.values())    if total <= 0:        return {k: 0.0 for k in raw_weights}    return {k: v / total for k, v in raw_weights.items()}  def main():    neutral = [[0, 10], [0, -10], [-8, 2], [8, 2], [-4, -2], [4, -2]]    system = BlendShapeSystem(neutral)    smile = [[1, 8], [1, -8], [-4, 6], [4, 6], [0, 8], [0, 4]]    sad = [[-1, 12], [-1, -12], [-7, 0], [7, 0], [-3, -6], [3, -6]]    surprise = [[0, 10], [0, -10], [-7, 4], [7, 4], [0, -2], [0, 2]]    system.add_target("smile", smile)    system.add_target("sad", sad)    system.add_target("surprise", surprise)     weights = normalize_weights({"smile": 0.7, "sad": 0.1, "surprise": 0.2})    blended = system.blend(weights)     print("归一化权重:", weights)    names = ["左眼", "右眼", "左嘴角", "右嘴角", "上唇", "下唇"]    print("混合后的关键顶点:")    for name, pt in zip(names, blended):        print("  %s: (%.2f, %.2f)" % (name, pt[0], pt[1]))  if __name__ == "__main__":    main()
目的:用 6 个关键顶点模拟一张脸,实现 Blendshape 的“录制靶标位移 + 权重混合 + 归一化”全流程,直观展示公式 $S = S_0 + \sum w_i (T_i - S_0)$ 的落地写法。
  1. class BlendShapeSystem:定义一个极简的表情混合系统,neutral 存中性网格,targets 存各靶标位移。
  2. row = [v[i] - self.neutral[k][i] for i in range(len(v))]逐顶点计算“位移箭头”,相当于录好的音轨波形。
  3. result[k] = [result[k][i] + w * d[i] for i in range(len(d))]把位移乘上权重叠加回中性网格,推子生效。
  4. total = sum(raw_weights.values())求所有权重的总和,为归一化做准备。
  5. system.add_target("smile", smile)注册一个基础表情靶标,名字是“微笑”。

常见误区

误区我觉得 Blendshape 就是给模型准备几张表情贴图,播放时换图就能换表情,像 PPT 切换一样简单。

正解贴图(纹理)管的是颜色,Blendshape 管的是顶点位置。换贴图后脸还是那块静态的“石膏脸”,而 Blendshape 让顶点真正发生位移——就像调音台改变的是波形本身,而不是换一张唱片封面。

为何常见:日常见的“表情包”是 2D 图片,很容易把 3D 顶点变形的概念类比成换图。

误区把每个表情的权重都调到最大值,表情最夸张,看起来最活泼、最有表现力。

正解权重一旦超过真实肌肉的活动极限,顶点位移会产生诡异拉扯,像调音台推子推爆后的破音。自然度靠限定合理范围和柔化曲线获得,而不是一味拉满。

为何常见:初学演示时“越大越明显”,容易把夸张误当成生动,忽略了真实人脸是有生理边界的。

误区给微笑、难过、惊讶各做一个滑块,调哪个就把哪个拉高,互不干扰不是很方便吗?

正解表情会抢同一个顶点。嘴部区域同时被微笑、惊讶、说话三个靶标控制,不做归一化和联动衰减,顶点就会乱跑。调音台里每路推子也不能独自决定最终音量,总线才是关键。

为何常见:单靶标单独看确实独立可控,只有做组合测试时才发现“抢戏”,属于典型的局部思维。

误区表情系统主要是让嘴巴动,眼睛和眉毛交给骨骼动画就够了。

正解眼睑、眉毛、脸颊有大量细微顶点位移,眼神的微表情全靠 Blendshape 的细节靶标实现;骨骼只能做大尺度运动,做不了 1 毫米级的眼皮颤抖。

为何常见:嘴部动画需求最直观,眼睛部分被骨骼动画的固有认知覆盖,导致忽略了 FACS 中眼周 AU 的巨大占比。

面试题

Q1. Blendshape 表情混合的本质是什么?

单选题 · easy

  • A.给模型切换不同颜色贴图
  • B.骨骼关节的旋转驱动
  • C.顶点位置的加权求和← 正确答案
  • D.光照参数的逐帧插值

答案:C。Blendshape 的核心是把靶标相对中性网格的位移按权重叠加,属于顶点级变形。贴图管颜色,骨骼管大尺度姿态,光照管明暗,都不是表情混合的本质。

Q2. 中性网格 S0 在混合公式中的作用是?

单选题 · easy

  • A.决定最终渲染的光照
  • B.所有变形的基准← 正确答案
  • C.贴图的透明度控制
  • D.修正形状的唯一来源

答案:B。中性网格是所有靶标位移的基准点。每个靶标存储的是“相对中性移动了多少”而不是绝对坐标,所以 S0 就像调音台的干声底稿,没有它位移方向无从谈起。

Q3. 权重归一化最直接的好处是?

单选题 · easy

  • A.让总权重等于 1← 正确答案
  • B.加快网格渲染速度
  • C.减少模型顶点数量
  • D.提高贴图分辨率

答案:A。归一化让所有参与混合的权重相加等于 1,防止多个靶标抢同一个顶点时把脸拉爆。它不改变顶点数量、渲染速度或贴图分辨率。

Q4. 以下哪些是常见的基础表情靶标?

多选题 · mid

  • A.微笑← 正确答案
  • B.难过← 正确答案
  • C.惊讶← 正确答案
  • D.跳跃

答案:ABC。微笑、难过、惊讶属于六大基础表情靶标之一,跳跃是全身姿态动作,不属于面部表情靶标。

Q5. FACS 中的 AU 指的是什么?

单选题 · mid

  • A.动作单元← 正确答案
  • B.顶点编号
  • C.纹理坐标
  • D.骨骼名称

答案:A。FACS(面部动作编码系统)把面部肌肉动作定义为动作单元(Action Unit),每个 AU 管一块区域,比如 AU12 管嘴角上拉。它是靶标建模的乐理基础。

Q6. 控制器把参数映射为权重时,通过什么保证不越界?

单选题 · mid

  • A.clamp 钳制← 正确答案
  • B.随机采样
  • C.矩阵求逆
  • D.纹理压缩

答案:A。clamp 把线性映射结果限制在 [0,1],权重越界时自动截断,就像限幅器压掉爆音。随机采样、矩阵求逆、纹理压缩都与控制器映射无关。

Q7. 下列哪些做法能提升表情自然度?

多选题 · mid

  • A.限定权重合理范围← 正确答案
  • B.加入联动衰减← 正确答案
  • C.添加微表情细节← 正确答案
  • D.把权重全部拉满

答案:ABC。限定合理范围、联动衰减、微表情细节都是自然度优化的常用手段。把权重全部拉满恰恰是自然度的大忌,相当于把推子全推满的破音混音。

Q8. “修正形状”在极限控制中的主要作用是?

单选题 · hard

  • A.修补组合伪影← 正确答案
  • B.提升渲染帧率
  • C.增加贴图分辨率
  • D.替换中性表情

答案:A。修正形状是为特定组合准备的补丁靶标,专门修补多靶标叠加产生的伪影,比如大笑+张嘴时的嘴角撕裂。它不负责帧率、贴图或中性表情。

Q9. 对称拆分实现 Blendshape 的好处是?

单选题 · hard

  • A.降低模型面数
  • B.制作效率更高← 正确答案
  • C.减少权重数量
  • D.简化光照计算

答案:B。对称拆分只制作半张脸的靶标再镜像复制,大幅提升制作效率。模型面数、权重数量、光照计算均不受影响。

Q10. 若所有目标权重 wi=1,混合公式 S=S0+Σwi(Ti−S0) 的结果是?

多选题 · extreme

  • A.结果是全部靶标叠加← 正确答案
  • B.容易产生顶点穿透← 正确答案
  • C.等同于中性表情
  • D.无需修正形状

答案:AB。当所有权重等于 1 时,公式变成 S0 + Σ(Ti−S0),所有靶标完整叠加,顶点极易超出生理范围产生穿透伪影,所以必须靠数值钳制和修正形状兜底,C、D 错误。