🌐 一、WebGL 基础入门:搭建动画舞台
getContext('webgl')
获取 WebGL 上下文,这是后续操作的基础。然后,初始化着色器程序,包括顶点着色器和片段着色器。顶点着色器负责处理顶点坐标的变换,片段着色器则决定每个像素的颜色。- 创建 Canvas 并获取上下文:
const canvas = document.createElement('canvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
document.body.appendChild(canvas);
const gl = canvas.getContext('webgl');
- 编写着色器代码:
顶点着色器(处理坐标变换):
attribute vec4 a_Position;
void main() {
gl_Position = a_Position;
}
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
}
- 编译并链接着色器程序:
const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
const program = linkProgram(gl, vertexShader, fragmentShader);
gl.useProgram(program);
🚀 二、构建自行车模型:分解与绘制
车轮是自行车的关键部件,需要绘制圆形轮廓和辐条。使用
gl.drawArrays
方法绘制三角形带形成圆形,再通过顶点坐标的变换绘制辐条。const wheelVertices = new Float32Array([/* 顶点坐标数据 */]);
const wheelBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, wheelBuffer);
gl.bufferData(gl.ARRAY_BUFFER, wheelVertices, gl.STATIC_DRAW);
车架和车把可以通过简单的矩形和线条组合而成。使用
gl.LINES
或 gl.TRIANGLES
模式绘制,通过顶点坐标的调整实现不同的形状。🎮 三、实时交互自定义:让自行车动起来
监听鼠标移动事件,计算鼠标位置相对于 Canvas 的坐标,将其转换为自行车的旋转角度。
canvas.addEventListener('mousemove', (e) => {
const x = e.clientX - canvas.offsetLeft;
const y = e.clientY - canvas.offsetTop;
// 计算旋转角度并更新模型矩阵
});
监听键盘按键事件,当按下特定键(如空格键)时,增加自行车的速度。
document.addEventListener('keydown', (e) => {
if (e.code === 'Space') {
speed += 0.1;
}
});
⚡ 四、性能优化与兼容性处理
根据自行车与摄像机的距离动态调整模型的细节。远处使用低精度模型,近处使用高精度模型,减少渲染压力。
function updateLOD() {
const distance = getDistanceToCamera();
if (distance > ) {
useLowDetailModel();
} else {
useHighDetailModel();
}
}
使用 Polyfill 库(如
@luma.gl/webgl2-polyfill
)提供 WebGL 2 的兼容性支持,确保在旧版浏览器中也能正常运行。import { polyfillContext } from '@luma.gl/webgl2-polyfill';
const gl = polyfillContext(canvas.getContext('webgl'));
🎨 五、进阶技巧:添加纹理与特效
gl.texImage2D
加载纹理图片,并应用到模型上。const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, , gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
添加尘土、烟雾等粒子特效,增强真实感。使用粒子系统库(如
three.js
的粒子系统)实现动态效果。📚 六、总结与资源推荐
- Three.js:简化 WebGL 开发的 3D 库,适合构建复杂场景。
- GSAP:强大的动画库,用于实现平滑的过渡效果。
- Box2D.js:物理引擎,可添加真实的物理模拟。