使用 WebGL 制作动画对象

使正方形旋转

在这个示例中,我们将实际旋转我们的相机。这样做会使它看起来像是我们正在旋转正方形。首先,我们需要一些变量来跟踪相机的当前旋转。

注意:在您的“webgl-demo.js”脚本的开头添加此代码

js
let squareRotation = 0.0;
let deltaTime = 0;

现在我们需要更新 drawScene() 函数,以便在绘制相机时将当前旋转应用于相机。在将相机平移到正方形的初始绘制位置后,我们应用旋转。

注意:在您的“draw-scene.js”模块中,更新 drawScene() 函数的声明,以便可以传递要使用的旋转。

js
function drawScene(gl, programInfo, buffers, squareRotation) {

注意:在您的 drawScene() 函数中,在 mat4.translate() 调用行的正下方添加此代码

js
mat4.rotate(
  modelViewMatrix, // destination matrix
  modelViewMatrix, // matrix to rotate
  squareRotation, // amount to rotate in radians
  [0, 0, 1],
); // axis to rotate around

这将围绕 Z 轴根据 squareRotation 的当前值旋转 modelViewMatrix。

为了真正制作动画,我们需要添加更改 squareRotation 值的代码。

注意:在您的 main() 函数的末尾添加此代码,替换现有的 drawScene() 调用

js
let then = 0;

// Draw the scene repeatedly
function render(now) {
  now *= 0.001; // convert to seconds
  deltaTime = now - then;
  then = now;

  drawScene(gl, programInfo, buffers, squareRotation);
  squareRotation += deltaTime;

  requestAnimationFrame(render);
}
requestAnimationFrame(render);

此代码使用 requestAnimationFrame 请求浏览器在每一帧上调用函数“render”。requestAnimationFrame 将页面加载以来的时间(以毫秒为单位)传递给我们。我们将它转换为秒,然后从中减去上次时间来计算 deltaTime,它是自渲染上一帧以来经过的秒数。

最后,我们更新 squareRotation

查看完整代码 | 在新页面中打开此演示