4. 坐标系与变换:屏幕坐标系、极坐标系、仿射变换、旋转矩阵在指针动画中的应用

在 IVI 仪表指针动画渲染引擎中,坐标系与几何变换是驱动指针平滑、精准旋转的数学基础。本章将系统讲解屏幕坐标系、极坐标系、仿射变换以及旋转矩阵的核心概念,并揭示它们如何在指针动画中协同工作。

4.1 屏幕坐标系与极坐标系

指针动画涉及两种核心坐标系:屏幕坐标系(笛卡尔坐标系)用于定位像素位置,极坐标系用于描述指针的角度与长度。

坐标系 基本元素 在指针动画中的角色
屏幕坐标系 原点 (0,0) 在左上角,x 轴向右,y 轴向下 定义指针锚点、表盘中心、刻度位置的像素坐标
极坐标系 极点 (圆心)、极径 r、极角 θ 描述指针长度、旋转角度,直接对应仪表读数
关键转换:指针动画引擎通常将仪表读数(如车速 0~240 km/h)映射为极角 θ,再通过三角函数转换为屏幕坐标,最终驱动指针绘制。

4.2 仿射变换与旋转矩阵

仿射变换是保持点、直线和平行性的几何变换,在指针动画中主要用于旋转、平移和缩放。旋转矩阵是仿射变换的核心子集。

4.2.1 二维旋转矩阵

绕原点逆时针旋转 θ 角度的标准旋转矩阵为:

R(θ) = | cosθ  -sinθ |
       | sinθ   cosθ |

指针上任意一点 P(x, y) 旋转后的新坐标 P'(x', y') 通过矩阵乘法计算:

x' = x * cosθ - y * sinθ
y' = x * sinθ + y * cosθ

4.2.2 指针动画中的复合变换

仪表指针通常不绕原点旋转,而是绕表盘中心(锚点)旋转。这需要复合仿射变换:先平移到原点,旋转,再平移回原位置。

  1. 平移至原点:将指针锚点 (cx, cy) 移动到 (0, 0)。
  2. 应用旋转矩阵:绕原点旋转目标角度 θ。
  3. 平移回原位:将旋转后的坐标移回 (cx, cy)。
引擎实现要点:现代图形 API(如 Canvas 2D、OpenGL ES)内置矩阵堆栈,开发者只需调用 translate(cx, cy)、rotate(θ)、translate(-cx, -cy) 即可完成复合变换,无需手动计算矩阵乘法。

4.3 坐标系与变换在指针动画中的集成流程

下图展示了从仪表读数到指针渲染的完整坐标系与变换链路:

指针动画坐标系与变换流程 指针动画坐标系与变换流程 仪表读数 角度映射 极坐标 (r, θ) 旋转矩阵 R(θ) 复合仿射变换 屏幕坐标 (x, y) 指针渲染输出 核心公式 x' = x·cosθ - y·sinθ y' = x·sinθ + y·cosθ + 平移补偿

4.4 指针动画中的坐标系变换实战

以下代码片段演示了如何在 Canvas 中实现指针的复合变换动画:

// 指针锚点(表盘中心)
const cx = 200, cy = 200;
// 指针长度
const length = 120;
// 当前角度(弧度)
let angle = 0;

function drawPointer(ctx, angle) {
    ctx.save();
    // 1. 平移至表盘中心
    ctx.translate(cx, cy);
    // 2. 旋转指针
    ctx.rotate(angle);
    // 3. 绘制指针(从中心向外)
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(length, 0);
    ctx.strokeStyle = '#e74c3c';
    ctx.lineWidth = 4;
    ctx.stroke();
    ctx.restore();
}

// 动画循环:角度随时间变化
function animate() {
    angle += 0.02;  // 每帧增加角度
    ctx.clearRect(0, 0, 400, 400);
    drawPointer(ctx, angle);
    requestAnimationFrame(animate);
}
常见陷阱:Canvas 的 rotate() 默认绕当前原点旋转。如果忘记先 translate() 到指针锚点,指针将绕画布左上角旋转,导致动画完全错位。务必遵循“平移→旋转→绘制→恢复”的顺序。

4.5 极坐标与屏幕坐标的转换公式

在指针动画初始化或刻度绘制时,需要频繁在极坐标与屏幕坐标之间转换:

转换方向 公式 说明
极坐标 → 屏幕坐标 x = cx + r * cos(θ)
y = cy + r * sin(θ)
已知角度和半径,求指针末端位置
屏幕坐标 → 极坐标 r = sqrt((x-cx)² + (y-cy)²)
θ = atan2(y-cy, x-cx)
已知触摸点坐标,反推角度(用于交互)
引擎优化技巧:在指针动画的每帧更新中,预计算 cos(θ) 和 sin(θ) 值,避免在循环中重复调用三角函数。对于固定步长的动画,可使用查找表(LUT)进一步提升性能。

4.6 本章小结

  • 屏幕坐标系是像素定位的基础,极坐标系天然适配指针的旋转特性。
  • 旋转矩阵是仿射变换的核心,通过 cosθ 和 sinθ 实现精确角度旋转。
  • 复合仿射变换(平移→旋转→平移)解决指针绕任意锚点旋转的问题。
  • 坐标系转换公式是连接仪表读数、指针角度与屏幕像素的数学桥梁。