本页目录

three.js —— JavaScript 3D 图形库(WebGL / WebGPU)

three.js · mrdoob/three.js

three.js 是一个 JavaScript 3D 图形库,项目目标是做一个易用、轻量、跨浏览器的通用 3D 库。根据 README,当前构建只包含 WebGL 与 WebGPU 渲染器,SVG 与 CSS3D 渲染器则以 addons 形式提供;仓库 topics 覆盖 WebXR、虚拟现实、增强...

沙盒生存 多人对战 自研引擎 C 角色控制 碰撞检测 程序化生成 存档系统 中级
★ Stars 11,139 Forks 1,460 License MIT 更新 2026-11-07

国内开发环境适配

Windows
官方声明支持
Linux
官方声明支持
macOS
官方声明支持
引擎 / 框架:自研引擎 暂无中文教程标记 未标记站长实测
依赖库(GLEW、GLFW、cURL、SQLite3 等)可通过系统包管理器安装,国内网络可能需配置镜像源。官方服务器已下线,多人联机需自建服务端。

中文项目介绍

Craft 是一个用 C 语言编写的简易《Minecraft》风格沙盒游戏,采用现代 OpenGL(着色器)渲染,代码量仅数千行。它支持 Windows、macOS 和 Linux 平台,并内置了基于 Python 服务端的在线多人联机功能。项目作者是 Michael Fogleman,其官方网站提供了更多信息与可执行文件下载。

Craft 的目标并非完整复刻《Minecraft》,而是以极简的代码展示一个可玩、可扩展的沙盒世界核心机制。它包含了地形生成、方块交互、昼夜循环、持久化存储和多人联机等基础模块,适合作为学习现代 OpenGL 和游戏编程的参考项目。

核心功能

地形生成

使用 Perlin / Simplex 噪声生成简单但观感自然的地形。

方块系统

内置超过 10 种方块类型,且易于添加更多。

植物与透明

支持植物(草、花、树等)和透明效果(玻璃)。

静态云朵

天空中包含简单的云朵(不会移动)。

昼夜循环与天空穹顶

实现昼夜交替,并使用带纹理的天空穹顶。

世界持久化

用户对世界的修改保存在 SQLite3 数据库中。

多人联机

支持在线多人游戏,服务端使用 Python 编写。

技术架构分析

技术要点

地形生成

地形基于 Simplex 噪声生成,这是一种确定性噪声函数,根据位置播种,因此同一位置的世界总是以相同方式生成。世界在 XZ 平面上被划分为 32x32 方块的区块(Y 轴向上),这使得世界可以“无限”延伸(但在较大的 X 或 Z 值处存在浮点精度问题),同时也便于数据管理。只有可见的区块才会从数据库查询。

渲染优化

  • 仅渲染暴露面:只有暴露在外的面才会被渲染,因为绝大多数方块要么完全隐藏,要么只暴露一两个面。每个区块会记录相邻区块的一格宽度重叠,以确定边界上的方块是否暴露。
  • 视锥剔除:仅渲染可见区块,使用简单的视锥剔除方法测试区块是否在相机视野内,不在则跳过渲染,从而提升性能。
  • 区块缓冲区重建:当区块中的方块发生变化时,整个区块的缓冲区会重新生成,而不是尝试更新 VBO。
  • 文本渲染:使用位图图集,每个字符渲染为两个三角形组成的 2D 矩形。
  • 现代 OpenGL:不使用废弃的固定功能管线,使用顶点缓冲对象(VBO)存储位置、法线和纹理坐标,并通过顶点和片段着色器进行渲染。矩阵操作函数位于 matrix.c 中,3D 模型由简单的立方体和矩形在 cube.c 中生成。
  • 透明效果:玻璃和植物的透明通过片段着色器丢弃洋红色像素实现(植物不占满三角形图元的整个矩形)。

数据库存储

用户对世界的修改存储在 SQLite 数据库中,仅存储增量变化。加载时先生成默认世界,再应用用户修改。主表名为“block”,包含列 p、q、x、y、z、w,其中 (p, q) 标识区块,(x, y, z) 标识方块位置,w 标识方块类型(0 表示空气)。游戏内区块使用哈希表存储方块,键为 (x, y, z),值为 w。方块的 Y 坐标限制在 0 <= y < 256,上限为防止建造过高结构的人为限制,且不允许破坏 y = 0 的方块以避免掉出世界。

多人联机实现

多人模式使用普通套接字和简单的 ASCII 行协议。每行由命令码和零个或多个逗号分隔的参数组成。客户端通过 C,p,q,key 请求区块,服务端返回方块更新 B,p,q,x,y,z,w 和缓存键 K,p,q,key。玩家位置以 P,pid,x,y,z,rx,ry 格式发送,客户端对过去两次位置更新进行插值以实现平滑动画。客户端最多每 0.1 秒发送一次自身位置。客户端使用 SQLite 数据库进行缓存,写入在后台线程中进行,每 5 秒提交一次事务,使用环形缓冲区作为写入队列。多人模式下,玩家可以在主视图或画中画视图中观察彼此,画中画实现简单,只需更改视口并从其他玩家视角重新渲染场景。

碰撞检测与天空穹顶

  • 碰撞检测:通过从玩家位置沿视线向量发射射线进行命中测试(扫描步长可调以提高精度)。碰撞检测则调整玩家位置,使其与相邻障碍方块保持一定距离(云和植物不是障碍,可直接穿过)。
  • 天空穹顶:使用带纹理的天空穹顶,纹理的 X 坐标表示一天中的时间,Y 值从天空球底部映射到顶部,玩家始终位于球心。方块的片段着色器也会采样天空纹理,根据方块相对于背景天空的位置确定合适的雾颜色进行混合。
  • 环境光遮蔽:按照指定网页描述的方法实现。

依赖库

  • GLEW:跨平台管理 OpenGL 扩展。
  • GLFW:跨平台窗口管理。
  • CURL:用于认证过程的 HTTPS / SSL POST 请求。
  • lodepng:加载 PNG 纹理。
  • sqlite3:保存用户添加/移除的方块。
  • tinycthread:跨平台线程。

构建与运行

安装依赖

macOS:安装 CMake,可使用 Homebrew 简化:brew install cmake。

Linux (Ubuntu):

sudo apt-get install cmake libglew-dev xorg-dev libcurl4-openssl-dev
sudo apt-get build-dep glfw

Windows:安装 CMake 和 MinGW,将 C:\MinGW\bin 加入 PATH。安装 cURL,确保 CURL/lib 和 CURL/include 位于 Program Files 目录。使用以下命令替代后续编译命令:

cmake -G "MinGW Makefiles"
mingw32-make

编译与运行

git clone https://github.com/fogleman/Craft.git
cd Craft
cmake .
make
./craft

多人游戏

官方服务器 craft.michaelfogleman.com 已下线,可自行搭建服务器。

客户端:通过命令行参数连接服务器:./craft [HOST [PORT]],或在游戏内使用 /online [HOST [PORT]] 命令。

服务端:服务端使用 Python 编写,但需要编译一个 DLL 以执行与客户端相同的地形生成:

gcc -std=c99 -O3 -fPIC -shared -o world -I src -I deps/noise deps/noise/noise.c src/world.c
python server.py [HOST [PORT]]

补充说明

操作与命令

控制

  • WASD:前进、左移、后退、右移。
  • 空格:跳跃。
  • 左键点击:破坏方块。
  • 右键点击或 Cmd + 左键点击:放置方块。
  • Ctrl + 右键点击:切换方块为光源。
  • 1-9:选择要放置的方块类型。
  • E:循环切换方块类型。
  • Tab:切换行走/飞行模式。
  • ZXCVBN:沿 XYZ 轴精确移动。
  • 左 Shift:缩放。
  • F:正交模式显示场景。
  • O:在主视图中观察玩家。
  • P:在画中画视图中观察玩家。
  • T:输入聊天文本。
  • 斜杠(/):输入命令。
  • 反引号(`):在方块上写文字(告示牌)。
  • 方向键:模拟鼠标移动。
  • 回车:模拟鼠标点击。

聊天命令

  • /goto [NAME]:传送到其他用户,未指定 NAME 则随机选择。
  • /list:显示已连接用户列表。
  • /login NAME:切换到另一个注册用户名(区分大小写),会重新联系登录服务器。
  • /logout:取消认证,成为访客用户,直到再次使用 /login 才会自动登录。
  • /offline [FILE]:切换到离线模式,FILE 指定存档文件,默认为 "craft"。
  • /online HOST [PORT]:连接到指定服务器。
  • /pq P Q:传送到指定区块。
  • /spawn:传送回出生点。

学习建议

Craft 是一个优秀的 C 语言 + 现代 OpenGL 入门项目,代码量小但功能完整。建议学习者从地形生成和渲染优化入手,理解区块管理、视锥剔除和着色器使用;随后可研究 SQLite 持久化和多人联机协议。项目结构清晰,适合作为图形学与游戏开发的实践案例。

开源许可证与版权说明

许可证标识:MIT。源码、资源与依赖许可可能不同,请以官方仓库为准。本站仅做索引,不托管源码。

相似项目