掌握鼠标事件,玩转WebGL旋转立方体
2024-02-05 05:37:14
在现代网页开发中,WebGL 作为一种强大的图形库,因其出色的 3D 渲染能力而备受推崇。它允许开发者在浏览器中创建复杂的交互式三维图形。本文将带您领略 WebGL 的魅力,学习如何通过鼠标事件来控制立方体的旋转,让您轻松构建出炫酷的三维动画。
一、WebGL 简介
WebGL的全称是Web Graphics Library,是专为渲染2D和3D图形而设计的JavaScript API,为HTML5标准的一部分。它提供了使用硬件加速的图形渲染,允许开发者使用OpenGL ES 2.0进行3D图形编程。
二、创建 WebGL 画布
首先,我们需要创建一个 WebGL 画布作为我们绘图的区域。我们可以使用 HTML5 的<canvas>
标签来创建画布。
<canvas id="webgl-canvas"></canvas>
三、初始化 WebGL 上下文
接下来,我们需要初始化 WebGL 上下文。WebGL 上下文是与显卡进行通信的桥梁,允许我们控制 WebGL 的功能和状态。
const canvas = document.getElementById('webgl-canvas');
const gl = canvas.getContext('webgl');
四、创建顶点着色器和片元着色器
顶点着色器和片元着色器是 WebGL 中用来处理顶点数据和像素数据的程序。我们可以使用 WebGL 的 createShader()
方法来创建着色器,然后使用 shaderSource()
方法来设置着色器的源代码。
顶点着色器:
attribute vec3 a_position;
attribute vec3 a_color;
varying vec3 v_color;
uniform mat4 u_modelViewMatrix;
uniform mat4 u_projectionMatrix;
void main() {
gl_Position = u_projectionMatrix * u_modelViewMatrix * vec4(a_position, 1.0);
v_color = a_color;
}
片元着色器:
precision mediump float;
varying vec3 v_color;
void main() {
gl_FragColor = vec4(v_color, 1.0);
}
五、创建缓冲区对象
缓冲区对象是 WebGL 中用来存储顶点数据和索引数据的对象。我们可以使用 WebGL 的 createBuffer()
方法来创建缓冲区对象,然后使用 bindBuffer()
方法来绑定缓冲区对象。
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
const indexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
六、编译着色器程序
着色器程序是将顶点着色器和片元着色器连接在一起的程序。我们可以使用 WebGL 的 createProgram()
方法来创建着色器程序,然后使用 attachShader()
方法将顶点着色器和片元着色器附加到着色器程序中。
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
七、设置 WebGL 状态
在绘制图形之前,我们需要设置 WebGL 的一些状态,比如启用顶点属性数组、指定使用的着色器程序等。
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(colorAttributeLocation);
gl.vertexAttribPointer(colorAttributeLocation, 3, gl.FLOAT, false, 0, 0);
gl.useProgram(program);
八、绘制图形
最后,我们可以使用 WebGL 的 drawElements()
方法来绘制图形。
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
九、鼠标事件控制旋转
接下来,我们需要通过鼠标事件来控制立方体的旋转。我们可以使用 addEventListener()
方法来监听鼠标事件。
canvas.addEventListener('mousemove', (event) => {
const dx = event.movementX;
const dy = event.movementY;
xAngle += dx * 0.01;
yAngle += dy * 0.01;
});
十、键盘事件控制运动方向
最后,我们需要通过键盘事件来控制立方体的运动方向。我们可以使用 addEventListener()
方法来监听键盘事件。
document.addEventListener('keydown', (event) => {
switch (event.keyCode) {
case 37: // left arrow
xSpeed = -0.1;
break;
case 38: // up arrow
ySpeed = 0.1;
break;
case 39: // right arrow
xSpeed = 0.1;
break;
case 40: // down arrow
ySpeed = -0.1;
break;
}
});