Z 轴位移缓动选择与晕动症阈值

空间界面做 Z 轴动画——把一个 Panel 从远处拉近,或者把详情从近处推远——是常见交互。但这个动画比 2D 的平移/缩放危险得多:Z 轴位移改变物体到眼睛的距离,大脑会预期头部前倾/后仰来配合距离变化。如果头没动但物体在 Z 轴上移动,视觉和前庭系统冲突,就晕。我们第一版用 linear 缓动把商品详情从 3m 拉到 1m,5 个测试同事里 3 个说"有点晕",1 个直接恶心想吐。这篇把 Z 轴位移动画的缓动选择和晕动症阈值量化,给一组真机测过的数据。

能力面:Z 轴位移动画与晕动症的成因

2D 动画在屏幕平面内移动,不改变物体到眼睛的物理距离,大脑不预期身体配合移动,不晕。Z 轴动画改变物理距离,大脑预期身体前后移动来配合——头该前倾或后仰。但用户实际没动,前庭系统报告"静止",视觉报告"物体在靠近",冲突产生晕动症。

这个冲突的强度取决于三个因素:

  • 位移速度:物体 Z 轴移动多快。越快视觉变化越剧烈,冲突越强。
  • 加速度:速度变化率。匀速移动只有视觉流冲突,加减速还有前庭预期冲突,更晕。
  • 缓动曲线:决定速度和加速度的时序分布。linear 全程匀速无加速(只有视觉流冲突),ease-in-out 两端有加速(叠加前庭冲突),spring 全程有振荡(冲突最强)。

反直觉的是 linear 缓动晕动症最轻,因为它匀速无加速度,只有视觉流冲突没有前庭冲突。但 linear 动画视觉上"生硬",设计师不爱用。ease-in-out 视觉柔和但两端加减速叠加前庭冲突,更晕。这是设计审美和生理舒适的根本矛盾。

三种缓动的晕动症对比

我们让 12 个同事看同一组 Z 轴位移动画(从 3m 拉到 1m,耗时 1s),用不同缓动,填 SSQ 量表(Simulator Sickness Questionnaire,标准晕动症评估,分数越高越晕):

缓动曲线SSQ 均分恶心人数主观评价
linear8.20/12“生硬但不晕”
ease-in-out14.62/12“柔和但有点晕”
spring(轻振荡)22.34/12“弹一下很晕”
spring(强振荡)31.86/12“想吐”
ease-out11.41/12“开始快后面慢,还行”
ease-in12.71/12“开始慢后面快,略晕”

ease-out 是折中最好的——开始有速度(视觉流冲突弱),后面减速(加速度冲突只在结尾短时出现),SSQ 14.6 降到 11.4。linear 最不晕但视觉生硬,ease-out 稍晕一点但视觉可接受。

spring 最晕是因为振荡。物体拉到位后回弹一下,回弹时 Z 轴方向反转,视觉流方向突变,大脑更困惑。Z 轴动画尽量别用 spring,要弹也只在 X/Y 轴弹,Z 轴保持单调。

约束面:位移速度和加速度的阈值

缓动曲线选定后,位移速度和加速度的上限决定晕动症强度。

速度阈值

我们测了不同位移速度(3m→1m,总位移 2m)下的 SSQ:

耗时平均速度SSQ 均分评价
0.3s6.7 m/s28.4“太快了晕”
0.5s4.0 m/s18.7“快,有点晕”
1.0s2.0 m/s11.4“合适”
1.5s1.3 m/s8.6“稍慢但不晕”
2.0s1.0 m/s6.2“慢,不晕但等得急”

速度 2 m/s(1s 走 2m)是阈值,超过明显晕。1.3 m/s 以下几乎无人晕。但太慢(1 m/s)用户觉得"等半天才过来",体验也不好。1~1.5s 耗时(速度 1.3~2 m/s)是甜点。

加速度阈值

加速度比速度更影响晕动症。匀速 2 m/s 不太晕,但从 0 加速到 2 m/s 的过程如果有大加速度,那一段会晕。

我们用 ease-out 拆开看:ease-out 的加速度集中在开头 0.2s,峰值加速度约 6 m/s²。人体前庭系统感知线性加速度阈值约 0.1 m/s²,6 m/s² 远超阈值——但这是视觉加速度不是物理加速度,前庭没真正感知到,只是视觉流暗示了加速,大脑误判。这个误判的强度因人而异,前庭敏感的人 6 m/s² 就晕,不敏感的 15 m/s² 才晕。

我们的阈值定在峰值加速度 ≤ 5 m/s²,覆盖前庭敏感人群。ease-out 1s 动画峰值 6 m/s² 略超,调到 1.2s 降到 4.2 m/s²,在阈值内。

场景落地:商品详情拉近动画

用户点击商品卡片,详情 Panel 从 3m 拉到 1m。总位移 2m。

方案缓动耗时峰值速度峰值加速度SSQ选用
Alinear1.0s2.0 m/s0 m/s²8.2备选
Bease-out1.0s3.2 m/s6.0 m/s²11.4
Cease-out1.2s2.7 m/s4.2 m/s²9.1选用
Dease-in-out1.5s2.7 m/s5.0 m/s²12.3
Espring1.0s3.5 m/s8.0 m/s²22.3淘汰

选 C:ease-out 1.2s。峰值速度 2.7 m/s 略超 2 m/s 阈值但可接受,峰值加速度 4.2 m/s² 在 5 m/s² 阈值内,SSQ 9.1 低于 10(我们的可接受线)。视觉上 ease-out 开始快后面慢,“嗖一下过来然后稳稳停住”,比 linear 自然比 spring 不晕。

上面这张表是静态对比,真正落地时按下面这条链逐步收敛。

超出

达标

超出

达标

不达标

达标

确定 Z 轴位移距离

列举候选缓动曲线

校验峰值速度 ≤ 2 m/s

调时长或换缓动

校验峰值加速度 ≤ 5 m/s²

SSQ 预评估

SSQ 低于 10 且视觉可接受?

选定缓动与时长

先卡速度再卡加速度,最后用 SSQ 兜底,任何一步超出阈值都回到调时长或换缓动的环节。

// entry/src/main/ets/animation/ZAxisTransition.ets
import { animateTo, Curves } from '@kit.ArkUI';

@Component
export struct ZAxisTransition {
  @State panelDepth: number = -3.0;  // 初始 3m 远
  private readonly TARGET_DEPTH = -1.0;  // 目标 1m 近
  private readonly DURATION = 1200;     // 1.2s

  pullPanelNear() {
    // ease-out 缓动,1.2s,峰值加速度 4.2 m/s² 在阈值内
    animateTo({
      duration: this.DURATION,
      curve: Curves.easeOut,
      onFinish: () => {
        // 到位后可以加 X/Y 轴的微弹(不晕),增加生动感
        this.addBounceOnXY();
      }
    }, () => {
      this.panelDepth = this.TARGET_DEPTH;
    });
  }

  // X/Y 轴弹跳不引发晕动症,可以放心用 spring
  addBounceOnXY() {
    animateTo({
      duration: 200,
      curve: Curves.springMotion(0.3, 0.8)
    }, () => {
      // X/Y 轴微弹 2mm,视觉生动不晕
      this.panelOffsetX = 0.002;
    });
  }

  build() {
    SpatialNode({ depth: this.panelDepth }) {
      DetailPanel()
    }
  }
}

关键点:Z 轴用 ease-out 不用 spring,X/Y 轴可以用 spring。Z 轴到位后再加 X/Y 微弹,既有生动感又不晕。

踩坑与取舍

坑一:linear 缓动匀速最不晕但用户嫌生硬

linear SSQ 最低(8.2),但 12 个同事里 8 个说"动画太生硬,像 PPT 切换"。完全不晕但视觉差,用户不满意。

ease-out SSQ 稍高(9.1~11.4)但视觉自然,用户满意度高。我们选了 ease-out 接受稍高的 SSQ。这是设计审美和生理舒适的取舍——完全消除晕动症要牺牲视觉质感,我们选了"几乎不晕且视觉可接受"的中间态。

坑二:连续 Z 轴动画累积晕动症

单次 Z 轴动画 SSQ 9.1 可接受,但连续做 5 次(用户快速翻 5 个商品详情),SSQ 累积到 18.7,开始有人晕。晕动症是累积的,单次不晕不代表连续不晕。

我们的处理是连续操作时缩位移幅度。第一次从 3m 拉到 1m(位移 2m),连续操作时只从 2m 拉到 1m(位移 1m),幅度减半 SSQ 增长放缓。另外连续操作间隔 <500ms 时把缓动改成 linear(最不晕),牺牲视觉质感保生理舒适。

被放弃的方案:Z 轴不动画,用淡入淡出

试过 Z 轴不做位移动画,详情 Panel 直接在 1m 处淡入。完全不晕(没有 Z 轴位移就没有视觉流冲突),但用户失去"从远处拉过来"的空间感,反馈说"不知道详情从哪来的,没有空间层次"。Z 轴位移虽然有晕动症风险,但它传递了空间深度信息,完全去掉损失太大。放弃了淡入淡出,回到 ease-out 位移。

总结一下下

  • Z 轴位移动画用 ease-out,别用 spring(振荡最晕)
  • 位移速度 ≤ 2 m/s,耗时 1~1.5s 为宜
  • 峰值加速度 ≤ 5 m/s²,覆盖前庭敏感人群
  • 连续 Z 轴动画缩位移幅度,间隔 <500ms 切 linear 缓动
  • X/Y 轴动画可以用 spring,不引发晕动症
  • 单次 SSQ < 10 可接受,连续操作注意累积效应

目前阈值是按 12 个同事的测试定的,样本量小。下一步打算做更大规模用户测试(50+ 人),把 SSQ 阈值校准得更可靠。另外想试一下视差补偿——Z 轴动画时轻微移动相机位置模拟头部前倾,让视觉和前庭预期对齐,理论上能降晕动症。这个要改相机管线,工程量大,先验证可行性再决定做不做。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐