admin 管理员组

文章数量: 1184232

CSS Perspective 与 3D Transform 的空间矩阵原理

大家好!今天我们来深入探讨 CSS perspective 和 3D transform 的底层原理,特别是它们如何通过空间矩阵来实现 3D 变换。理解这些概念对于构建复杂的 3D CSS 动画和场景至关重要。

1. 3D 变换的基础:齐次坐标系

在进入矩阵之前,我们先要理解齐次坐标系。在传统的笛卡尔坐标系中,一个 3D 点由 (x, y, z) 表示。但在齐次坐标系中,我们使用 (x, y, z, w) 来表示,其中 w 是一个比例因子。

  • 为什么要使用齐次坐标?

    • 平移操作的矩阵表示: 齐次坐标允许我们用矩阵乘法同时表示旋转、缩放和平移等变换。 如果没有齐次坐标,平移操作将需要矩阵加法,导致操作不统一。
    • 透视投影: 齐次坐标是实现透视投影的关键。 通过在变换过程中改变 w 值,并在投影到 2D 屏幕时进行归一化,我们可以模拟物体远小近大的透视效果。
    • 仿射变换的统一表示: 齐次坐标可以统一表示仿射变换,包括线性变换(旋转、缩放、剪切)和平移。
  • 齐次坐标与笛卡尔坐标的转换:

    • 从齐次坐标 (x, y, z, w) 转换为笛卡尔坐标 (x’, y’, z’),需要进行归一化:

      x' = x / w
      y' = y / w
      z' = z / w
    • 从笛卡尔坐标 (x, y, z) 转换为齐次坐标 (x, y, z, 1)。 w 通常设为 1。

2. 变换矩阵:核心概念

变换矩阵是一个 4×4 的矩阵,它可以用来表示旋转、缩放、平移和透视投影等 3D 变换。 我们将齐次坐标表示的点乘以变换矩阵,得到变换后的齐次坐标。

[x', y', z', w'] = [x, y, z, 1] * M

其中 M 是 4×4 变换矩阵。

下面我们来分解几种常见的变换矩阵:

2.1 平移矩阵 (Translation Matrix)

平移矩阵用于将物体沿 x, y, z 轴移动。

[ 1  0  0  0 ]
[ 0  1  0  0 ]
[ 0  0  1  0 ]
[ Tx Ty Tz 1 ]

其中 Tx, Ty, Tz 分别是沿 x, y, z 轴的平移量。

示例代码:

function createTranslationMatrix(tx, ty, tz) {
  return [
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    tx, ty, tz, 1
  ];
}

let point = [1, 2, 3, 1]; // 齐次坐标
let translationMatrix = createTranslationMatrix(5, 10, 15);
let transformedPoint = multiplyMatrixAndPoint(point, translationMatrix);

console.log(transformedPoint); // 输出:[6, 12, 18, 1]
2.2 缩放矩阵 (Scale Matrix)

缩放矩阵用于沿 x, y, z 轴缩放物体。

[ Sx  0  0  0 ]
[ 0  Sy  0  0 ]
[ 0  0  Sz  0 ]
[ 0  0  0  1 ]

其中 Sx, Sy, Sz 分别是沿 x, y, z 轴的缩放比例。

示例代码:

function createScaleMatrix(sx, sy, sz) {
  return [
    sx, 0, 0, 0,
    0, sy, 0, 0,
    0, 0, sz, 0,
    0, 0, 0, 1
  ];
}

let point = [1, 2, 3, 1];
let scaleMatrix = createScaleMatrix(2, 3, 4);
let transformedPoint = multiplyMatrixAndPoint(point, scaleMatrix);

console.log(transformedPoint); // 输出:[2, 6, 12, 1]
2.3 旋转矩阵 (Rotation Matrix)

旋转矩阵用于绕 x, y, z 轴旋转物体。 旋转矩阵相对复杂,我们分别给出绕三个轴旋转的矩阵:

  • 绕 X 轴旋转:

    [ 1  0      0       0 ]
    [ 0  cosθ  -sinθ   0 ]
    [ 0  sinθ   cosθ   0 ]
    [ 0  0      0       1 ]

本文标签: 矩阵 原理 空间 css perspective