Threejs案例
Encom Boardroom - 用 Three.js 重现《创战纪》数据可视化场景

从电影到代码:如何用 Three.js 构建实时 3D 数据可视化

Encom Boardroom 是一个使用 HTML5 和 Three.js 技术重现迪士尼电影《创战纪:战神崛起》(Tron: Legacy)中会议室场景的开源项目。

它的核心功能是将来自 GitHub 和 Wikipedia 的实时数据流通过 3D 可视化方式呈现在一个交互式地球上。

项目目标是展示如何将电影级的视觉效果与真实世界的数据流结合,创造出具有实用价值的数据可视化界面。作者明确表示这是一个"loose adaptation"(宽松改编),而非精确复刻,因为原电影场景包含了大量细节。

能力边界: 这是一个展示性质的可视化项目,不是数据分析平台或监控系统。它不提供数据存储、历史回溯或统计分析功能,主要价值在于实时数据流的视觉呈现。

核心功能与设计机制

3D 地球可视化

项目使用 Three.js 渲染一个交互式 3D 地球,这是整个可视化的基础。地球的实现基于作者提取的独立库 Encom Globe,该库使用了 Hexasphere.js 来生成几何球体,以及 Quadtree2 作为空间数据结构。

这样设计的原因是:3D 球体相比 2D 地图能更直观地展示全球范围的数据分布,同时保持空间关系的准确性。球体表面可以承载多层信息(如地理边界、数据点、连线),适合表现数据流动的方向性。

实时数据流接入

项目接入了两个公开数据源:

GitHub 公开时间线: 通过 GitHub 的 public timeline feed 获取全球范围内的代码提交、PR、Issue 等活动。每个事件通过 geonames.org 进行地理位置映射,用户头像通过 Gravatar 获取。

Wikipedia 实时 IRC: 接入 Wikipedia 的 IRC feed,获取匿名用户的编辑活动。匿名用户的 IP 地址通过 freegeoip.net 转换为地理坐标。

这种设计允许项目展示全球范围内开源协作和知识贡献的实时动态,试图解决"如何让抽象的数据活动具象化"这一问题。

数据流动画系统

当数据事件发生时,系统会在地球表面对应位置生成视觉标记,并通过动画线条展示数据流向。这些动画使用 Three.js 的粒子系统和线条渲染实现,配合适当的缓动函数创造流畅的视觉效果。

如何使用

基础部署方式

如果只需要展示静态效果或使用预设数据,可以直接部署 HTML 文件:

方式一:直接打开

# 克隆项目
git clone https://github.com/arscan/encom-boardroom.git
cd encom-boardroom
 
# 使用任意 HTTP 服务器运行
# 例如使用 Python
python -m http.server 8000
 
# 或使用 Node.js 的 http-server
npx http-server -p 8000

访问 http://localhost:8000 即可看到可视化效果。

完整部署方式(含实时数据流)

如果需要接入实时 GitHub 和 Wikipedia 数据,需要运行后端服务器:

步骤命令作用
1npm install安装项目依赖
2PORT=8000 node stream-server.js启动数据流服务器
3访问 http://localhost:8000在浏览器中打开应用

使用示例: 假设你想在本地运行并接入实时数据

# 1. 安装依赖
npm install
 
# 2. 启动服务器(监听 8000 端口)
PORT=8000 node stream-server.js
 
# 3. 在浏览器中访问
open http://localhost:8000

此时页面会实时显示:

  • GitHub 上的代码提交和 PR 活动(地球上显示为发光点)
  • Wikipedia 的编辑活动(以不同颜色或样式区分)
  • 数据点之间的连线动画(表示数据流向)

自定义配置

如果需要修改数据源或视觉效果,可以编辑配置文件:

数据源配置:stream-server.js 中修改 GitHub API 端点或 Wikipedia IRC 连接参数

视觉效果配置: 在前端 JavaScript 中调整 Three.js 场景参数,如相机位置、粒子大小、颜色方案等

独立使用 Encom Globe 库

项目将地球可视化功能提取为独立库,可以在其他项目中使用:

// 引入 Encom Globe
const globe = new EncomGlobe(container, options);
 
// 添加数据点
globe.addMarker({
  lat: 37.7749,
  lon: -122.4194,
  label: 'San Francisco'
});
 
// 添加连线
globe.addConnection({
  from: { lat: 37.7749, lon: -122.4194 },
  to: { lat: 40.7128, lon: -74.0060 }
});

这使得开发者可以将类似的地球可视化效果集成到自己的项目中,而无需完整复制整个 Boardroom 系统。

总结

Encom Boardroom 展示了如何将电影级视觉效果转化为可运行的 Web 应用。它的价值不在于提供一个开箱即用的产品,而在于展示一种将艺术创意与工程实现结合的思路。

对于 Three.js 学习者,这是一个值得研究的实践案例,可以了解 3D 可视化项目的完整结构。对于需要构建展示型应用的开发者,Encom Globe 库提供了一个可复用的地球可视化基础。但如果目标是构建生产级的数据平台,则需要在此基础上进行大量工程化改造。

https://github.com/arscan/encom-boardroom (opens in a new tab)