使用 WebGL 创建 3D 动画

简介: 【10月更文挑战第3天】使用 WebGL 创建 3D 动画

使用 WebGL 创建 3D 动画

WebGL 是一种用于渲染交互式 3D 图形的标准,它不需要任何插件就能在现代浏览器中运行。本文将介绍如何使用 WebGL 和 JavaScript 来创建一个简单的旋转立方体动画。

1. 设置基本的 HTML 结构

首先,我们需要创建一个 HTML 文件,包含一个 <canvas> 元素来显示 WebGL 渲染的内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebGL Cube</title>
    <style>
        body {
     margin: 0; }
        canvas {
     width: 100%; height: 100vh; display: block; }
    </style>
</head>
<body>
    <canvas id="cubeCanvas"></canvas>
    <script src="webgl-cube.js"></script>
</body>
</html>

2. 初始化 WebGL 上下文

接下来,在 webgl-cube.js 文件中,我们需要初始化 WebGL 上下文,并设置一些基本的属性。

const canvas = document.getElementById('cubeCanvas');
const gl = canvas.getContext('webgl');

if (!gl) {
   
    console.error('Unable to initialize WebGL. Your browser may not support it.');
}

// 设置视口大小
gl.viewport(0, 0, canvas.width, canvas.height);

// 清除颜色
gl.clearColor(0.0, 0.0, 0.0, 1.0);

// 清除深度缓冲区
gl.clearDepth(1.0);

// 开启深度测试
gl.enable(gl.DEPTH_TEST);

3. 创建顶点着色器和片段着色器

为了绘制3D图形,我们需要定义顶点着色器和片段着色器。这两个着色器负责处理顶点数据和像素着色。

function createShader(gl, type, source) {
   
    const shader = gl.createShader(type);
    gl.shaderSource(shader, source);
    gl.compileShader(shader);
    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
   
        console.error(gl.getShaderInfoLog(shader));
        gl.deleteShader(shader);
        return null;
    }
    return shader;
}

const vertexShaderSource = `
attribute vec4 a_position;
void main() {
    gl_Position = a_position;
}`;

const fragmentShaderSource = `
precision mediump float;
void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}`;

4. 编译着色器并创建着色器程序

编译着色器并创建一个着色器程序,该程序将用于渲染。

const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
   
    console.error("Unable to initialize the shader program.");
}

gl.useProgram(program);

5. 定义几何体数据

为了绘制一个立方体,我们需要定义它的顶点坐标。

const positions = [
    // 前面
    -1.0, -1.0, 1.0,
     1.0, -1.0, 1.0,
     1.0,  1.0, 1.0,
    -1.0,  1.0, 1.0,

    // 后面
    -1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
     1.0,  1.0, -1.0,
     1.0, -1.0, -1.0,

    // 左边
    -1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    -1.0,  1.0,  1.0,
    -1.0, -1.0,  1.0,

    // 右边
     1.0, -1.0, -1.0,
     1.0,  1.0, -1.0,
     1.0,  1.0,  1.0,
     1.0, -1.0,  1.0,

    // 顶部
    -1.0,  1.0, -1.0,
     1.0,  1.0, -1.0,
     1.0,  1.0,  1.0,
    -1.0,  1.0,  1.0,

    // 底部
    -1.0, -1.0, -1.0,
     1.0, -1.0, -1.0,
     1.0, -1.0,  1.0,
    -1.0, -1.0,  1.0
];

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 3, gl.FLOAT, false, 0, 0);

6. 绘制立方体

最后,我们需要一个函数来绘制立方体,并让它旋转起来。

let angle = 0;

function drawScene() {
   
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

    const matrix = mat4.create();
    mat4.rotateX(matrix, matrix, degToRad(angle));
    mat4.rotateY(matrix, matrix, degToRad(angle));

    const u_matrix = gl.getUniformLocation(program, "u_matrix");
    gl.uniformMatrix4fv(u_matrix, false, matrix);

    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 36);

    requestAnimationFrame(drawScene);
}

function degToRad(degrees) {
   
    return degrees * Math.PI / 180;
}

angle += 0.5;
requestAnimationFrame(drawScene);

以上代码创建了一个旋转的3D立方体。你可以在此基础上扩展,添加更多的几何体、纹理或者光照效果。WebGL 是一个强大的工具,通过它你可以创建出非常丰富的3D体验。

相关文章
|
2月前
Threejs实现动画
这篇文章讲解了如何使用Three.js实现动画效果,并介绍了如何控制动画的时间轴。
72 3
Threejs实现动画
|
JavaScript 前端开发 Web App开发
带你读《Three. js开发指南: 基于WebGL和HTML5在网页上渲染 3D图形和动画(原书第3版)》之一:使用Three.js创建你的第一个三维场景
本书将介绍如何直在浏览器中创建漂亮的3D场景和动画,并且充分发挥WebGL和现代浏览器的潜能。首先介绍基本概念和基础组件,然后通过逐渐扩展示例代码逐步深讲解更多高级技术。在本书中读者将学到如何从外部加载3D模型和具有真实效果的材质纹理、学习使用Three.js提供的摄像机组件来实现在3D场景中飞行和走动、如何将HTML5视频和画布作为材质贴在3D模型表面。此外还将学习变形动画和骨骼动画,甚至还会涉及在场景中使用物理模拟的方法,例如重力、碰撞检测等等。
|
1月前
|
XML 前端开发 JavaScript
如何使用 SVG 和 Canvas 来创建动画?
【10月更文挑战第24天】使用 SVG 和 Canvas 创建动画都有各自的特点和优势,SVG 更适合基于 XML 和 CSS 的简单动画,而 Canvas 则更适合通过 JavaScript 实现复杂的、高性能的动画效果。在实际应用中,可以根据具体的需求和场景选择合适的技术来创建动画。
48 1
|
1月前
|
前端开发 JavaScript API
如何使用 Canvas 实现复杂的动画效果?
【10月更文挑战第24天】使用Canvas实现复杂的动画效果,需要综合运用JavaScript、数学知识以及对Canvas API的深入理解。
89 2
|
2月前
ThreeJs使用tweenjs动画库制作动画
这篇文章介绍了如何在Three.js中使用Tween.js动画库来简化动画制作流程,并演示了如何通过简单的代码实现动画效果。
109 1
ThreeJs使用tweenjs动画库制作动画
|
2月前
|
JavaScript
ThreeJs实现简单的动画
这篇文章介绍了如何使用Three.js实现简单的动画效果,并提供了利用requestAnimationFrame动态改变模型状态的代码示例。
61 0
ThreeJs实现简单的动画
|
2月前
|
存储 JavaScript
ThreeJS创建关键帧动画
这篇文章讲解了如何在Three.js中利用关键帧轨道 (`KeyframeTrack`) 创建动画效果,并提供了详细的步骤和代码示例。
90 0
|
5月前
|
前端开发 JavaScript
canvas系列教程07 ——捕获、拖拽、抛掷、缓动动画、弹性动画
canvas系列教程07 ——捕获、拖拽、抛掷、缓动动画、弹性动画
60 1
|
5月前
|
前端开发 JavaScript 流计算
canvas系列教程05 ——交互、动画
canvas系列教程05 ——交互、动画
33 0
|
7月前
|
前端开发 JavaScript 程序员
webgl学习笔记1_创建场景
webgl学习笔记1_创建场景
56 0