资源推荐
用 Three.js 做游戏?这个开源引擎实现了第三人称控制和载具物理

用 Three.js 做游戏?这个开源引擎实现了第三人称控制和载具物理

Sketchbook 是一个基于 Three.js 和 Cannon.js 构建的 Web 3D 引擎,专注于第三人称角色控制和相关的游戏玩法机制。它的定位是一个"游乐场"(playground),用于探索现代游戏中常见的第三人称玩法机制是如何工作的,并以通用的方式将它们实现出来。

这个项目不是一个成熟的商业游戏引擎,而是一个学习和实验性质的工具。它提供了角色控制、物理交互、载具系统等核心功能,适合希望了解第三人称游戏机制实现原理的开发者。

包含哪些内容

Sketchbook 围绕"世界""角色"和"载具"三个核心模块组织功能。

世界系统

世界(World)是整个引擎的容器,负责管理场景、物理和渲染:

  • 场景管理:基于 Three.js 的场景系统,支持从 Blender 导出的 GLB 格式场景文件
  • 物理模拟:集成 Cannon.js 物理引擎,提供刚体碰撞和重力模拟
  • 时间控制:支持可变时间缩放(variable timescale)和帧跳过(frame skipping),有助于在性能波动时保持物理模拟稳定性
  • 画面优化:内置 FXAA 抗锯齿、HDR 渲染和胶片色调映射(filmic tonemapping),改善视觉质量

角色系统

角色系统是 Sketchbook 的核心,实现了第三人称游戏中常见的控制逻辑:

  • 第三人称相机:相机跟随角色移动,支持视角旋转和距离调整
  • 射线投射角色控制器:使用射线检测地面和障碍物,结合胶囊体(capsule)碰撞器,实现平滑的角色移动和碰撞响应
  • 状态系统:角色行为通过状态机管理(如站立、行走、跳跃等),便于扩展不同的动作逻辑
  • 角色 AI:提供基础的 AI 行为框架,可以控制 NPC 的移动和交互

这里的"射线投射角色控制器"是指通过向下发射射线来检测角色脚下的地面,从而判断角色是否在地面上、是否可以行走等。胶囊体碰撞器则是一个圆柱体两端加半球的形状,常用于角色的碰撞检测,因为它能够平滑地穿过小障碍物。

载具系统

Sketchbook 支持三类载具的物理模拟:

  • 汽车:包含悬挂、转向和驱动的基础车辆物理
  • 飞机:实现升力、阻力和俯仰、偏航、翻滚控制
  • 直升机:模拟旋翼产生的升力和扭矩

每种载具都实现了 IControllable 接口,这意味着角色可以"进入"并控制这些载具,实现上下车、驾驶等交互。

安装与使用

Sketchbook 提供两种使用方式:一种是直接运行项目自带的演示场景,另一种是将 Sketchbook 作为库引入到自己的项目中。

方式一:本地开发与调试

适用于想要修改引擎代码或研究实现细节的开发者。

前提条件:需要安装 Node.js 16 LTS 版本。

步骤命令作用
1Fork 并克隆仓库获取项目源码
2npm install安装项目依赖(three.js、cannon.js、webpack 等)
3npm run dev启动本地开发服务器(使用 webpack-dev-server)
4访问 http://localhost:8080 (opens in a new tab)在浏览器中查看演示场景

使用示例:假设你想研究角色的跳跃逻辑是如何实现的。你可以按上述步骤启动项目后,在 src/ts/characters/Character.ts 中找到角色状态相关代码,修改跳跃高度或持续时间,保存后浏览器会自动刷新显示效果。

方式二:作为库使用

适用于想要在自己的项目中使用 Sketchbook 提供的角色控制和物理功能的开发者。

Sketchbook 可以打包为库(library),通过 npm 或直接引入构建后的文件来使用。项目提供了一个"Sketch 模板项目"帮助理解如何以库的形式使用 Sketchbook。

基本用法

const world = new Sketchbook.World('scene.glb');

这行代码会加载一个 GLB 格式的场景文件(通常从 Blender 导出),并初始化 Sketchbook 的世界系统。

注意事项:由于需要加载外部资源(GLB 文件、纹理等),Sketchbook 必须运行在本地服务器上(如 http-server 或 webpack-dev-server),不能直接通过 file:// 协议打开 HTML 文件。

构建生产版本

如果需要发布到生产环境,可以运行:

命令作用
npm run build使用 webpack 打包并压缩代码,生成最小化的 sketchbook.min.js 文件

写在最后

Sketchbook 是一个典型的实验性项目,它的价值在于展示了如何将 Three.js 和 Cannon.js 结合起来实现具体的游戏机制。对于希望理解第三人称游戏控制、物理交互或载具模拟的开发者,Sketchbook 提供了一个可以直接运行和修改的参考实现。

需要注意的是,该项目已于 2024 年 10 月由作者归档,不再进行新功能开发或问题修复。如果有兴趣在此基础上继续开发,可以通过 GitHub 的 Fork 功能创建自己的版本,或者在项目的 Network Graph 中查找社区维护的分支。

项目采用 MIT 许可证,可以自由用于学习和修改。对于希望在 Web 平台上探索 3D 游戏机制的开发者来说,这仍然是一个有参考价值的资源。

https://github.com/swift502/Sketchbook (opens in a new tab)