一个实验性尝试,使用 webgl 开发的三维开放世界笔记系统《赛博城寨》
一个实验性尝试使用 WebGL 开发的三维开放世界笔记系统《赛博城寨》在数字时代的浪潮中笔记工具从纸质笔记本进化到云笔记再到如今的三维空间笔记每一步都承载着人类对信息组织方式的探索。今天我想分享一个实验性的项目——《赛博城寨》它是一个使用 WebGL 技术构建的三维开放世界笔记系统。在这里笔记不再是一维的文本列表而是漂浮在虚拟城市中的“知识建筑”用户可以像探索城市一样穿梭于自己的思维之间。## 从零搭建WebGL 基础与三维世界的诞生WebGLWeb Graphics Library是浏览器中的 3D 图形 API它允许 JavaScript 直接调用 GPU 渲染三维场景。要理解《赛博城寨》的底层逻辑我们先从最基础的 WebGL 渲染管线开始。### 基础概念顶点、着色器与三角形三维世界由无数个三角形组成。每个三角形有三个顶点每个顶点包含位置、颜色等信息。WebGL 通过两个关键程序——顶点着色器和片元着色器——将数据处理成屏幕上的像素。下面是一个最简单的 WebGL 示例绘制一个彩色三角形javascript// 步骤1获取 WebGL 上下文const canvas document.getElementById(myCanvas);const gl canvas.getContext(webgl);// 步骤2定义三角形的三个顶点x, y, z 坐标const vertices [ -0.5, -0.5, 0.0, // 左下 0.5, -0.5, 0.0, // 右下 0.0, 0.5, 0.0 // 顶部];// 步骤3创建缓冲区存储顶点数据const vertexBuffer gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);// 步骤4编写顶点着色器处理顶点位置const vertexShaderSource attribute vec3 aPosition; void main() { gl_Position vec4(aPosition, 1.0); };// 步骤5编写片元着色器决定颜色const fragmentShaderSource void main() { gl_FragColor vec4(0.0, 0.8, 0.6, 1.0); // 青色 };// 步骤6编译并链接着色器function createShader(gl, source, type) { const shader gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); return shader;}const vertexShader createShader(gl, vertexShaderSource, gl.VERTEX_SHADER);const fragmentShader createShader(gl, fragmentShaderSource, gl.FRAGMENT_SHADER);const program gl.createProgram();gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);gl.linkProgram(program);gl.useProgram(program);// 步骤7绑定顶点属性const positionAttrib gl.getAttribLocation(program, aPosition);gl.vertexAttribPointer(positionAttrib, 3, gl.FLOAT, false, 0, 0);gl.enableVertexAttribArray(positionAttrib);// 步骤8绘制三角形gl.clearColor(0.1, 0.1, 0.2, 1.0); // 深蓝背景gl.clear(gl.COLOR_BUFFER_BIT);gl.drawArrays(gl.TRIANGLES, 0, 3);这段代码展示了 WebGL 的核心流程定义几何数据 → 编写着色器 → 编译链接 → 绘制。在《赛博城寨》中每个笔记卡片都被视为一个独立的“建筑”其六面体结构就是由 12 个三角形每个面 2 个构成的。## 进阶探索从静态三角形到动态开放世界掌握了基础之后我们进入《赛博城寨》的核心如何让笔记在三维空间中交互这里需要引入矩阵变换和用户输入处理。### 三维变换让笔记“漂浮”起来每个笔记卡片在场景中有一个位置、旋转和缩放。这些通过模型矩阵Model Matrix实现。同时我们需要相机矩阵View Matrix和投影矩阵Projection Matrix来实现第一人称视角。下面是一个更完整的交互示例用户可以通过鼠标拖拽旋转视角点击笔记卡片查看内容javascript// 假设已加载 Three.js 库简化 WebGL 开发import * as THREE from three;// 初始化场景、相机、渲染器const scene new THREE.Scene();scene.background new THREE.Color(0x0a0a23); // 赛博朋克风格深蓝const camera new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.set(10, 5, 15);camera.lookAt(0, 0, 0);const renderer new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);// 创建笔记卡片一个带文字的立方体function createNoteCard(content, position, color 0x00ffcc) { // 几何体立方体 const geometry new THREE.BoxGeometry(2, 1.5, 0.3); const material new THREE.MeshPhongMaterial({ color: color, emissive: 0x004422, transparent: true, opacity: 0.9 }); const cube new THREE.Mesh(geometry, material); cube.position.set(position.x, position.y, position.z); // 添加文字标签使用 Canvas 纹理 const canvas document.createElement(canvas); canvas.width 256; canvas.height 128; const ctx canvas.getContext(2d); ctx.fillStyle rgba(0,0,0,0.8); ctx.fillRect(0, 0, 256, 128); ctx.fillStyle #00ffcc; ctx.font 20px monospace; ctx.fillText(content.substring(0, 12) ..., 10, 60); const texture new THREE.CanvasTexture(canvas); const textMaterial new THREE.SpriteMaterial({ map: texture }); const sprite new THREE.Sprite(textMaterial); sprite.position.set(0, 0, 0.2); // 在立方体前面 cube.add(sprite); return cube;}// 添加几个笔记卡片到场景const notes [];notes.push(createNoteCard(WebGL 基础顶点与着色器, { x: 2, y: 0, z: -3 }, 0xff6600));notes.push(createNoteCard(Three.js 高级粒子系统, { x: -2, y: 1, z: 1 }, 0x00ccff));notes.push(createNoteCard(赛博城寨架构设计, { x: 0, y: -1, z: 4 }, 0xff00aa));notes.forEach(note scene.add(note));// 添加灯光const ambientLight new THREE.AmbientLight(0x404040);scene.add(ambientLight);const dirLight new THREE.DirectionalLight(0xffffff, 1);dirLight.position.set(5, 10, 7);scene.add(dirLight);// 鼠标交互点击检测const raycaster new THREE.Raycaster();const mouse new THREE.Vector2();document.addEventListener(click, (event) { // 将鼠标坐标转换为归一化设备坐标 mouse.x (event.clientX / window.innerWidth) * 2 - 1; mouse.y -(event.clientY / window.innerHeight) * 2 1; raycaster.setFromCamera(mouse, camera); const intersects raycaster.intersectObjects(notes); if (intersects.length 0) { const clickedNote intersects[0].object; // 打开笔记详情此处简化为控制台输出 console.log(打开笔记, clickedNote.children[0].material.map.image.toDataURL()); // 实际项目中可弹出模态框显示完整内容 }});// 动画循环function animate() { requestAnimationFrame(animate); // 让笔记卡片缓慢旋转增加沉浸感 notes.forEach((note, index) { note.rotation.y 0.005 * (index 1); }); renderer.render(scene, camera);}animate();这段代码展示了《赛博城寨》的交互核心每个笔记卡片是一个独立的 3D 对象拥有自己的位置和外观通过射线检测实现点击交互通过动画循环保持场景动态。用户可以在城市中漫步点击漂浮的“知识建筑”查看内容。## 架构设计如何组织三维笔记系统《赛博城寨》的架构分为三层1.数据层使用 IndexedDB 存储笔记元数据标题、内容、位置坐标。每个笔记是一个 JSON 对象包含{id, title, content, x, y, z, color}。2.逻辑层管理笔记的增删改查以及三维世界的更新。当用户新建笔记时逻辑层会在场景中生成新的卡片并分配唯一的空间坐标。3.渲染层基于 Three.jsWebGL 封装库实现 3D 渲染包括光照、阴影、粒子特效模拟城市灯光。### 核心流程-加载从数据库读取所有笔记按坐标生成卡片用户看到的是“知识城市”。-导航用户通过键盘 WASD 移动鼠标拖动旋转视角实现第一人称探索。-交互点击卡片打开笔记详情长按可拖拽移动卡片位置重新组织“建筑布局”。-持久化任何位置变化都会自动保存到 IndexedDB。## 总结《赛博城寨》是一个实验性的尝试它将笔记系统从二维平面提升到三维空间利用 WebGL 技术创造了一个可交互的“知识城市”。从最基础的三角形绘制到动态的交互式世界我们看到了 WebGL 在数据可视化领域的潜力。虽然这个项目目前还处于原型阶段但它展示了几个有趣的可能性-空间记忆人类对空间的记忆优于对列表的记忆三维布局可能帮助用户更直观地组织知识。-沉浸式学习在虚拟城市中“漫步”于自己的笔记之间可能激发新的思维连接。-技术栈融合WebGL IndexedDB 现代前端框架可以构建轻量级的 3D 应用。如果你也想尝试可以从上面的代码片段开始逐步添加更多功能——比如笔记之间的“空中走廊”连接线、按主题划分的“街区”区域颜色编码、甚至多人协作的“城市共建”。这只是一个起点三维笔记的世界等待你的探索。

相关新闻

VLC视频转码架构深度解析:如何实现多格式媒体转换的底层机制

VLC视频转码架构深度解析:如何实现多格式媒体转换的底层机制

VLC视频转码架构深度解析:如何实现多格式媒体转换的底层机制 【免费下载链接】vlc VLC media player - plays everything, runs anywhere. Code here: https://code.videolan.org/videolan/vlc 项目地址: https://gitcode.com/gh_mirrors/vl/vlc VLC媒体播放…

2026/7/28 20:31:13 阅读更多 →
统一拦截操作(Filter和interceptor)Filter的实现

统一拦截操作(Filter和interceptor)Filter的实现

tlias中的改动根据字母排序先后执行过滤器

2026/7/28 20:30:13 阅读更多 →
抖音无水印下载神器:从零开始高效管理你的视频素材库

抖音无水印下载神器:从零开始高效管理你的视频素材库

抖音无水印下载神器:从零开始高效管理你的视频素材库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…

2026/7/28 20:30:13 阅读更多 →

最新新闻

Unity资源逆向工程完整指南:AssetStudio深度解析与实战应用

Unity资源逆向工程完整指南:AssetStudio深度解析与实战应用

Unity资源逆向工程完整指南:AssetStudio深度解析与实战应用 【免费下载链接】AssetStudio AssetStudio is an independent tool for exploring, extracting and exporting assets. 项目地址: https://gitcode.com/gh_mirrors/ass/AssetStudio AssetStudio是一…

2026/7/28 20:43:19 阅读更多 →
JAVA毕业设计-基于 SpringBoot 的前后端分离的高校大学生心理健康互助社区平台 面向大学生的线上心理疏导与交流支持系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

JAVA毕业设计-基于 SpringBoot 的前后端分离的高校大学生心理健康互助社区平台 面向大学生的线上心理疏导与交流支持系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/28 20:43:19 阅读更多 →
惊!My Eicher 车队管理系统 API 漏洞,可致账户接管与大量数据泄露

惊!My Eicher 车队管理系统 API 漏洞,可致账户接管与大量数据泄露

利用沃尔沃/依维柯的车队管理平台控制所有用户和车辆2026 年 7 月 27 日消息,VE 商用车公司是沃尔沃集团和依维柯汽车的合资企业,为印度商用车客户打造并维护了一个名为 My Eicher 的车队管理系统。官方称,“My Eicher 是一款专为商用车车主、…

2026/7/28 20:43:19 阅读更多 →
Windows热键冲突终极指南:3步找回你的快捷键控制权

Windows热键冲突终极指南:3步找回你的快捷键控制权

Windows热键冲突终极指南:3步找回你的快捷键控制权 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾经按…

2026/7/28 20:43:19 阅读更多 →
多端同步的知识库工具哪家强?几款主流产品横评前言

多端同步的知识库工具哪家强?几款主流产品横评前言

作为一个每天在多台设备间反复横跳的AI博主,我太懂那种“资料在电脑上,但人只有手机”的痛了。所以这几个月,我把市面上主流的支持多端同步的知识库工具都深度体验了一遍,今天从多端同步能力这个核心维度,给大家做个横…

2026/7/28 20:43:19 阅读更多 →
还在为音频转文字而烦恼?这款免费智能工具让你3步搞定

还在为音频转文字而烦恼?这款免费智能工具让你3步搞定

还在为音频转文字而烦恼?这款免费智能工具让你3步搞定 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate …

2026/7/28 20:42:19 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻