Canvas 旋转星空

本文将介绍如何使用 Canvas 和 JavaScript 创造一个逼真的旋转星空效果。我们将会涉及到一些基础概念,包括 Canvas 的基本操作和三维向量的计算。

Canvas 基础

首先,让我们回顾一下 Canvas 是什么以及如何在页面中创建一个 Canvas 元素。HTML5 中新增了 <canvas> 标签,用于在网页上绘制图形。通过 JavaScript 操作 Canvas 可以实现各种图形效果,包括动画、游戏等。

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

要在 JavaScript 中获取该元素并进行操作:

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

ctx 对象是 CanvasRenderingContext2D 类型的,提供了众多绘图方法,包括 fillRect()strokeRect()lineTo() 等。

创建星空背景

接下来,我们需要生成几百个随机位置和大小的星星。为了使视觉效果更丰富,我们可以让星星呈现不同的颜色和亮度。

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

以上代码创建了一个 Star 类,每个实例都包含随机的 x、y、z 坐标和大小,以及随机的颜色。接下来我们需要将这些星星绘制到 Canvas 上。

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

以上代码遍历所有星星,根据每个星星的 x、y、z 坐标计算在 Canvas 上的位置,并绘制出来。

旋转效果

现在我们已经成功创建了一个静态的星空背景,但它还不够酷炫。我们希望能够让星空在屏幕上旋转。

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

以上代码定义了一个 angle 变量来表示旋转的角度,并在每一帧中调用 rotateStars() 函数计算并更新每个星星的新位置。其中,使用了一个名为 multiplyMatrixVector() 的函数,它用于计算矩阵和向量的乘积。

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

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