HTML5 Canvas 相机/视口 - 如何实现?

HTML5 Canvas 是一个强大的绘图技术,提供了丰富的 API 来绘制 2D 和 3D 图形。但是,当我们需要展示一个比画布尺寸更大的场景时,就需要使用相机/视口(Camera/Viewport)来进行移动和缩放。

相机/视口是什么?

在绘制一个复杂的场景时,通常会将其分成多个层次,每个层次包含不同的元素。相机/视口就是用来选择哪些元素需要呈现在画布上的工具,它可以实现移动、旋转、缩放等操作。在 2D 场景中,通常使用平移操作来模拟相机/视口。

如何实现?

坐标系

在进行相机/视口操作之前,需要先了解坐标系。在 HTML5 Canvas 中,默认情况下的坐标系原点位于画布的左上角,横轴向右为正,纵轴向下为正。在进行相机/视口操作时,坐标系的原点不变,但坐标系的比例和位置会发生变化。

平移

平移操作可以实现相机/视口的移动,即改变坐标系的位置。在 Canvas 中,平移操作是通过 translate 方法实现的。

----------------------- ----------

上述代码将坐标系左移 cameraX,上移 cameraY,即实现了相机/视口在场景中的移动。注意,这段代码应该放在场景绘制代码之前。

缩放

缩放操作可以实现相机/视口的缩放,即改变坐标系的比例。在 Canvas 中,缩放操作是通过 scale 方法实现的。

--------------- ------

上述代码将横轴和纵轴都按比例 zoom 进行缩放,即实现了相机/视口的缩放。同样地,这段代码应该放在场景绘制代码之前。

旋转

旋转操作可以实现相机/视口的旋转,即改变坐标系的方向。在 Canvas 中,旋转操作是通过 rotate 方法实现的。

------------------

上述代码将坐标系按逆时针方向旋转 angle 弧度,即实现了相机/视口的旋转。同样地,这段代码应该放在场景绘制代码之前。

示例代码

下面是一个使用相机/视口的示例代码,实现了一个类似于“魔兽争霸”游戏的场景。

------- ----------- ----------- ----------------------
--------
----- ------ - ----------------------------------
----- --- - ------------------------

-- ----
----- --------- - -
  - -- ---- -- ---- ------ ---- ------- --- --
  - -- ---- -- ---- ------ ---- ------- --- -
--
----- ----- - -
  - -- ---- -- ---- ------ --- ------- -- --
  - -- ---- -- ---- ------ --- ------- -- -
--

-- -------
--- ------- - --
--- ------- - --
--- ---- - --

-- ----
-------- ----------- -
  -- ----
  ---------------- -- ------------- ---------------

  -- -----------
  ----- ------ - --- -----------
    --------------------------- - -- ------------- - --
    ------------

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------