Initial commit: RHINE LAB · ANALYSIS OS:三维界面与动效实验(本仓库不含个人归档索引数据)

This commit is contained in:
WpyQwq
2026-09-19 13:04:56 +08:00
commit 3f422218a5
1098 changed files with 39410 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
# 真实文件夹与玻璃档案交互
2026-09-10 用户提出:将当前阵列交互迁移到桌面真实文件夹。当前阶段为可行性评估,没有安装额外服务或读取用户目录。
## 结论
现有 Three.js 模型与拖动、波浪、抽取交互可以复用。若需要展示普通文件夹的内容,并由系统默认程序打开文件,建议网页壁纸配合一个本地程序;或将前端装入桌面应用容器。当前网页壁纸公开接口不足以单独承诺完整功能。
Wallpaper Engine 的网页 directory 属性支持图片、视频目录,不等于通用文件系统浏览。官方 openUserShortcut 文档属于 SceneScript,文档明确只允许在鼠标事件中调用,不能直接当成网页 JavaScript 接口使用。
## 推荐的后续小范围试验
由用户选择一个根目录;每列代表子文件夹、每张玻璃档案代表文件。选中显示名称、类型、大小和修改日期,点击“打开”调用系统默认程序,另提供“在资源管理器中显示”。缺失文件有明确提示,目录改动后刷新。初版不包含删除、移动、重命名,也不要求接管系统桌面图标。
本地程序只监听回环地址,用每次启动的访问凭据限制网页访问;只允许用户选定根目录下的文件,校验解析后的路径及链接目标,不接受任意命令行。网页发送文件标识,由本地程序解析已登记路径后打开。配套程序需要安装/启动/退出入口;发布时必须明确它是额外组件。
独立桌面应用能更完整地支持键盘、文件拖放和系统对话框,但嵌入桌面背景、多显示器与桌面图标的关系需要单独实机验证。不能把普通透明窗口称作已完成桌面集成。
## 官方依据
- 网页用户属性与目录范围:https://docs.wallpaperengine.io/en/web/customization/properties.html
- SceneScript 用户快捷方式:https://docs.wallpaperengine.io/en/scene/userproperties/usershortcut.html
+146
View File
@@ -0,0 +1,146 @@
# 本地归档接入(LOCAL ARCHIVE)
把 `E:\归档` 接进本界面:主阵列展示从归档中精选的四十条档案,**LOCAL ARCHIVE** 面板负责检索归档的全部条目并直接执行归档写操作。
## 两块数据的关系
| | 三维阵列 | 主检索的本地归档栏 + LOCAL ARCHIVE 面板 |
| --- | --- | --- |
| 数据 | `public/archive-index.json`(全量,运行时载入) | 同一份索引 |
| 内容 | 列 = 归档顶层内容分类,列内 = 该分类的**全部真实归档条目** | 全量条目(约 5 万条路径) |
| 用途 | 三维阵列、详情、解密动效、抽盘与拖拽 | 列表检索、打开、定位、归档操作 |
| 条数约束 | 无(随归档变化) | 无 |
| 降级 | 索引不可用时退回 `content/archives.json` 的四十条精选档案 | 退回静态快照,只读 |
**2026-09-12 起阵列已改为全量归档驱动**,因此归档里新增的文件会直接出现在阵列中(换到它所在的列即可)。三维阵列与检索列表共用同一份内存索引(`loadArchiveIndex`),不会重复下载。
四十条精选档案现在只作为降级数据集与 TXT 摘要来源,见 [`../content/README.md`](../content/README.md)。全量阵列的设计、性能与证据见 [`../verification/ARCHIVE-ARRAY.md`](../verification/ARCHIVE-ARRAY.md)。
## 启动
推荐一条命令同时拉起归档服务与开发服务器:
```bash
npm run dev:archive
```
也可以分开启动(两个终端):
```bash
npm run archive:serve # 归档服务,默认 127.0.0.1:43117
npm run dev # Vite 开发服务器
```
只跑 `npm run dev` 也能用:面板会退回**只读检索模式**,此时打开文件、定位与归档操作会被禁用并给出提示。
启动后点击顶部导航的 **LOCAL ARCHIVE**。
## 数据更新
服务启动时会扫描一次归档并在 `E:\归档` 上挂一个递归监视器。归档里新增或改动文件后,约 2.5 秒防抖,服务自动重新生成快照,并通过事件流通知已打开的页面重新载入索引——不需要手动刷新。
也可以点面板状态栏的**重新扫描 ↻**,或调用 `POST /archive-api/refresh`。
`npm run dev` / `npm run build` 的钩子也会各生成一次快照。
## 详情页的「文件位置」按钮
详情页右下角的 **SHOW IN FOLDER / 文件位置** 按钮(原先是 EXPORT 下载 TXT)会直接在资源管理器中定位当前档案在 `E:\归档` 中的位置,用的是该条精选档案在 `content/archives.json` 里的真实 `path`,通过本地归档服务的 `POST /reveal` 完成。
- 服务未运行时按钮会提示"需要本地归档服务:请运行 `npm run dev:archive`",不会静默失败。
- 详情页脚注显示的是归档内的相对路径文本。浏览器不允许网页跳转 `file:` 链接,所以它不再是可点击链接。
- `public/archives/*.txt` 仍会为每条档案生成,但详情页不再提供下载入口。
## 面板能做什么
**检索**:输入任意片段,匹配相对路径(含文件名与扩展名)。命中数实时显示,单次最多渲染 200 行,匹配片段高亮。索引在第一次打开面板时载入一次,之后在内存中过滤,不再走网络。
**每行的三个动作**:
| 按钮 | 行为 | 是否需要服务 |
| --- | --- | --- |
| 打开 | 用系统默认程序打开文件;目录则用资源管理器打开 | 是 |
| 定位 | 在资源管理器中选中该条目 | 是 |
| 归档… | 选中该条目作为源,在右侧进入归档操作 | 是 |
**归档操作(四种,均为安全写)**:
| 操作 | 说明 |
| --- | --- |
| 移动到 | 归档内移动,同盘重命名。**跨盘拒绝**,请改用复制 |
| 复制到 | 递归复制 |
| 解压到 | 调用 `C:\Program Files\7-Zip\7z.exe` 解压到目标目录 |
| 新建分类目录 | 在归档内新建目录 |
一律**先点「预览影响」**:显示源、目标、体积、文件数、是否跨盘,并给出能不能执行的结论。`预览`不通过时执行按钮保持禁用。执行结果用界面右下角的提示条反馈,并追加到操作日志。
**不提供删除与重命名**:这两项不可逆,需要时请在资源管理器中手动完成。
## 安全设计
- **只监听回环**:服务绑定 `127.0.0.1`,不对外网开放。
- **每次启动的访问令牌**:服务启动时生成随机令牌写入项目根目录的 `.archive-token`(已加入 `.gitignore`)。浏览器**不持有**令牌——Vite 在 `/archive-api` 代理层注入它。因此即使别的网页知道端口号,也无法调用本服务。
- **路径围栏**:客户端只传相对路径,服务解析为绝对路径后必须仍落在归档根目录内;越界、绝对路径与 `..` 一律 `403`。符号链接不算越界,但不会被跟随。
- **操作日志**:每次写操作追加一行 JSON 到 `E:\归档\00_索引\操作日志.jsonl`,含时间、操作、源、目标。
- **写操作需要显式确认**:`/apply` 必须带 `confirm: true`,否则 `400`。服务端会**重新计算**一次影响预览,不信任客户端传来的结论。
## 配置
[`archive.config.json`](../archive.config.json):
```json
{
"root": "E:\\归档",
"port": 43117,
"exclude": [],
"indexFile": "public/archive-index.json",
"logFile": "00_索引\\操作日志.jsonl"
}
```
`exclude` 里的目录会被索引跳过(其本身仍作为目录条目保留)。改 `port` 时不需要同步改前端:Vite 代理会在配置加载时读取同一个文件。
## 接口
所有接口都需要 `x-archive-token` 头,经 Vite 代理访问时自动注入。在浏览器或 curl 里直接调用时前缀为 `/archive-api`,直连服务时无前缀。
| 方法与路径 | 用途 |
| --- | --- |
| `GET /status` | 根目录、端口、监视状态、最近一次快照时间、总量 |
| `GET /index` | 全量索引(支持 gzip,约 0.7 MB) |
| `GET /search?q=&limit=` | 服务端检索 |
| `POST /plan` | 影响预览,不修改任何文件 |
| `POST /apply` | 执行写操作,需要 `confirm: true` |
| `POST /open` / `POST /reveal` | 打开文件 / 在资源管理器中定位 |
| `POST /refresh` | 立即重新扫描归档 |
| `GET /events` | 快照更新事件流(SSE) |
## 快照文件
| 文件 | 体积 | 说明 |
| --- | ---: | --- |
| `content/archives.json` | 约 45 KB | 四十条精选档案,页面与 TXT 下载共用 |
| `public/archive-index.json` | 约 7.4 MB | 全量索引,紧凑数组 `[路径, 类型, 字节, mtime]` |
| `public/archives/*.txt` | 40 个 | 每条档案的可下载摘要 |
`archive-index.json` **不进入 PWA 离线预缓存**(`scripts/build-pwa.mjs` 的白名单不含根目录文件),因此离线包体积不受影响;代价是离线状态下打开检索面板只有空态。服务在线时索引走 gzip(约 0.7 MB),比静态快照快得多。
## 构建与部署
生产构建不包含归档服务,也不带 `/archive-api` 代理,线上站点打开面板会显示"只读检索模式",检索走静态 `archive-index.json`,写操作不可用——这是刻意的:本地归档服务不应暴露在公网。
`npm run preview` 同样配置了代理,因此本地预览可以完整体验。
## 故障排查
| 现象 | 处理 |
| --- | --- |
| 面板显示"服务未运行" | 先 `npm run archive:serve`;确认端口 43117 未被占用 |
| 打开/定位提示需要服务 | 同上;这是刻意的降级,检索仍可用 |
| 令牌无效(401) | 服务重启会换新令牌;重启 Vite 让代理读到新值,或直接用 `npm run dev:archive` |
| 「7-Zip 解压失败」 | 确认 `C:\Program Files\7-Zip\7z.exe` 存在;面板 `/status` 的 `sevenZip` 字段会说明 |
| 新增文件没有出现在检索里 | ① 等约 3 秒(防抖),或点「重新扫描 ↻」② 查 `/status` 的 `lastError` 与 `lastScan` ③ 手动 `npm run archive:snapshot`。索引与检索本身极少出错,**先查服务和快照时间,再怀疑代码**。 |
| 面板开了很久、刚加的文件搜不到 | 面板**每次打开都会重新取索引**(服务在线时),关闭面板不再退掉事件订阅;若仍不对,`Ctrl+F5` 整页刷新一次。 |
| 摘要里的数字和归档对不上 | 重新生成快照;`{size}`/`{files}`/`{date}` 只在生成时采样 |
+43
View File
@@ -0,0 +1,43 @@
# 主屏幕安装与离线使用
正式地址:[rhine.lubeiluchen.cc](https://rhine.lubeiluchen.cc/)。
## iPhone / iPad
1. 用 Safari 打开正式地址。
2. 轻点“分享”,选择“添加到主屏幕”;如果出现“作为网页 App 打开”,保持开启。
3. 从主屏幕的莱茵生命图标打开,即可使用没有 Safari 地址栏的独立窗口。系统状态栏和底部手势区域会保留安全间距。
首次保持联网,在终端设置的“主屏幕与离线”区域看到“离线资源已就绪”后,即可断网重新打开。离线资源约 34 MiB,包含模型、完整字体分包、音乐与 40 份档案。普通页面按需加载字体,完整离线资源在进入终端后于后台准备。Safari 标签页和主屏幕 App 的存储可能各自独立,请以主屏幕 App 内显示的状态为准。
如果浏览器清除了网站数据或系统回收了缓存,需要联网重新准备离线资源。启用声音时,资源就绪后轻触“点击进入”(或按 Enter),声音准备完成后统一开始开机动画;关闭全部声音的用户直接进入。声音加载失败可重试,也可选择“关闭声音并进入”,此选择会关闭并保存音效与音乐开关。开启减少动态效果时仍可点击进入并播放声音,但会跳过开机动画。
## 桌面与其他手机
支持安装的浏览器会在终端设置中提供“安装到设备”,也可使用浏览器菜单安装。不同浏览器的菜单名称可能不同;普通浏览器标签页同样支持在线使用。
阵列上左右滑动切列,上下滑动切档;也可轻点方向按钮。详情中的正文独立滚动。360° 查看器支持单指旋转、双指缩放和平移,以及拆解、重组和复位。横竖屏切换保留当前档案和查看器状态。
## 更新
新版本会在后台下载完整资源,准备好后在页面底部提供“更新并重启”,也可从右上角“设置”中更新。更新不会清除收藏与偏好。下载失败时继续使用上一个完整离线版本,联网后重试即可。
如果旧版只有提示、找不到更新入口,请打开[更新终端](https://rhine.lubeiluchen.cc/update.html),点击“更新并返回”。这个入口从网络获取,不经过旧版本的页面缓存;应用完整新版后返回终端。普通“清除缓存”不一定清除 Service Worker 的离线副本,无需清空网站数据或收藏。
## 开机动画与选档动效
首次进入时,本站遵循系统的减少动画偏好。Win11 的“设置 → 辅助功能 → 视觉效果 → 动画效果”关闭时,Chrome / Edge 可能请求减少动画,本站会跳过开机动画并简化选档等动效。终端之后会保存本地偏好,资源更新不会重置它。
需要完整动效时,打开右上角圆形图标下标有“设置”的按钮,选择“启用完整动效并重播”。这只调整本站,无需修改系统设置。减少动态效果开关也可随时重新开启。
## 开发与 Vercel
`npm run build` 生成静态站点和带内容版本号的 Service Worker,输出在 `dist`。现有 Vercel 项目沿用 GitHub 自动部署,配置见 `vercel.json`。Service Worker、manifest 与构建清单使用重新验证缓存头。离线功能只在正式构建的 HTTPS 或 localhost 环境注册,`npm run dev` 不注册。
本地验证:运行 `npm run build`,再运行 `npm run preview`。浏览器测试见 `scripts/check-pwa.mjs`,需要本机可用的 Playwright 与 Chrome;可通过 `PLAYWRIGHT_MODULE` 指定已有 Playwright 模块路径。
`scripts/check-startup-motion.mjs` 验证系统偏好与本站覆盖、重播和正文解密;`scripts/check-pwa-recovery.mjs` 验证旧版迁移,需要以 `PWA_PREVIOUS_DIST` 指定保留的旧生产构建。两个脚本可设 `REVIEW_CHANNEL=msedge` 验证 Edge。更新恢复页保持网络获取,未加入离线资源清单。
图标源自项目共享莱茵生命 SVG 路径,生成脚本为 `scripts/build-icons.mjs`,通过 `SHARP_MODULE` 可指定本地 Sharp 模块。修改资源后重新构建即可生成新的离线版本,无需手动修改缓存编号。
平台说明参考:[WebKit 主屏幕 Web App](https://webkit.org/blog/13878/web-push-for-web-apps-on-ios-and-ipados/)、[Safari 26 主屏幕安装行为](https://webkit.org/blog/17333/webkit-features-in-safari-26-0/)、[Service Worker 生命周期](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers)。
+261
View File
@@ -0,0 +1,261 @@
# Wallpaper Engine 本地实验
分支:`codex/wallpaper-engine`。2026-09-10 已在本机 Wallpaper Engine 的独立窗口中运行,尚未发布创意工坊、尚未应用到桌面,不合并主分支。
## 本机入口
Wallpaper Engine 本地库名称:**Rhine Lab · 莱茵生命档案终端(本地测试)**。
安装目录:`D:\Game\Steam\steamapps\common\wallpaper_engine\projects\myprojects\rhine-lab-local`。
当前预览窗口:**Rhine Lab - Wallpaper Test**。重新打开独立预览:
```powershell
& 'D:\Game\Steam\steamapps\common\wallpaper_engine\wallpaper64.exe' -control openWallpaper -file 'D:\Game\Steam\steamapps\common\wallpaper_engine\projects\myprojects\rhine-lab-local\project.json' -playInWindow 'Rhine Lab - Wallpaper Test' -width 1600 -height 900
```
项目目录中的 `project.json` 带有本地标题、预览图片和可调属性。只有构建产物目录应导入编辑器,不能导入整个源码仓库。重新发布未来已有的工坊项目时,应保留该项目的工坊 ID 与元数据。
## 构建与行为
```sh
npm run build:wallpaper
node scripts/check-wallpaper.mjs
```
构建输出 `release/wallpaper`,约 34.1 MiB,823 个文件,包括完整字体分包、模型、音频、档案 TXT 和许可。字体和模型均本地读取,无需开发服务器或在线站点。源码、Blender 工程、参考视频、诊断服务不进入壁纸包。
- Vite 的 `wallpaper` 模式使用相对资源路径,HTML 中提前注册宿主回调,以免丢失模块载入前的初始属性。
- 自动启动;宿主可以关闭开场,直接进入阵列。减少动态效果继续遵循显式设置。
- 声音自动尝试解锁,等待最多 3 秒后继续画面;声音未能解锁时仍可通过后续点击触发。正常网页的点击启动流程保留。
- 壁纸版关闭 PWA 初始化、安装和更新界面。更新通过替换本地构建或未来的工坊更新完成。
- 宿主提供开场、音效、音乐、独立音量、减少动态效果和四档画质。宿主只推送变化的属性,页面保留其余设置。
- 页面设置也可使用;重载时宿主下发的值具有优先权,页面内更改不会反向写回 Wallpaper Engine 的属性面板。
- 三维渲染跟随宿主 FPS 上限(未收到时为 30),不会补渲染漏掉的帧。宿主暂停通知停止更新与音频;开场恢复时扣除暂停时间。
- 壁纸版不提供浏览器全屏按钮。画质参数以点击循环选项的按钮呈现,保留原有参数值和高级设置。
## 本机验证记录
环境:Windows、本机 Wallpaper Engine 窗口显示版本 2.8.36,独立窗口 1600×900,真实 CEF / WebGL 渲染。管理界面另提示 2.8.42 已下载、待重启,本次没有执行更新。
已验证:
- 自动开场、白底 Logo 与文字、中文字体、三维阵列本地加载。
- 鼠标点击切档(X-001 → X-006)、打开档案、磨砂揭示和正文解密。
- 360° 模型本地加载、分层拆解与鼠标拖动旋转。
- 初始宿主属性 `boot=false` 直接进入阵列,`musicvolume=15` 在页面显示 15%。
- 运行中经官方 `applyProperties` 指令将音乐音量改为 23%,收到 `{musicvolume:{value:23}}` 回调,已打开的页面控件同步至 23%。
- 画质按钮从“原始”切换为“高”,实际渲染从 1600×900 变为 2000×1125,并启用 SMAA。
- 实际音频状态为 `running`,三条音乐轨道已载入并播放,错误字段为空。声音主观听感仍由用户试听。
- 限帧、暂停恢复及部分属性回调通过脚本验证;新增回归检查确保壁纸不再生成原生 `<select>`。
- `npm run build:wallpaper` 与正常网页 `npm run build` 均通过,网页 PWA 构建成功。
运行数据有一次阵列采样为 22 FPS(宿主上限 30),不能把上限写成稳定实际帧率。本次未做长时间功耗测试、4K / 多屏压力测试或真实桌面图标遮挡下的完整输入验证。
![Wallpaper Engine 实际设置页,音量同步与画质切换](../reference/wallpaper-engine/settings.png)
### 本机 CEF 的下拉框崩溃
打开原设置页会稳定出现 `STATUS_ILLEGAL_INSTRUCTION`。诊断确认页面逻辑完成后、首次绘制前崩溃;最小弹窗和声音控件正常,单独画质区域可复现,去掉其中 `<select>` 后正常。最终只在壁纸模式将画质下拉框换为循环按钮,恢复原背景模糊、焦点处理和原生音量滑块后,全设置页正常。
此记录描述本机的复现与兼容处理,不断言所有 CEF 版本都存在此问题。没有修改 Wallpaper Engine 全局画质、硬件加速或安全设置。
### 当前交付边界
本地壁纸库和独立预览可用;自动审批拒绝了替换主显示器壁纸,需用户明确批准后才应用到桌面。本次未上传创意工坊。上传前还应完成桌面输入、长时间性能和发布素材的最终检查。
## 官方接口参考
- [创建与导入网页壁纸](https://docs.wallpaperengine.io/en/web/first/gettingstarted.html)
- [用户属性与暂停通知](https://docs.wallpaperengine.io/en/web/api/propertylistener.html)
- [FPS 限制](https://docs.wallpaperengine.io/en/web/performance/fps.html)
- [命令行预览与属性设置](https://help.wallpaperengine.io/en/functionality/cli.html)
## 桌面试用反馈与设置说明(2026-09-10)
用户已自行应用到桌面。设置顶部明确说明:每次启动读取 Wallpaper Engine 属性,页面内修改只对当前运行生效;长期设置须在宿主属性面板修改。画质区不再提示自动保存。
用户反馈桌面方向键与滚轮无效。代码检查确认两类监听仍保留,没有壁纸模式禁用分支;尚未通过桌面事件跟踪确认滚轮未传入的具体原因。设置操作说明改为拖动阵列、点击界面按钮,并注明桌面可能无法传入方向键和滚轮。Wallpaper Engine 开发者说明键盘输入存在宿主限制:https://steamcommunity.com/app/431960/discussions/2/1644304412654510366/ 。
本次 `npm run build:wallpaper` 与 `node scripts/check-wallpaper.mjs` 通过。
## 工作台首版
Wallpaper Engine 属性新增显示模式(桌面工作台/档案展示)、三条事项、重要日程名称和本地目标日期、专注与休息分钟数。页面设置可临时切换模式。空事项不会伪造数据。
工作台左侧始终显示本机时间、日期、事项。右侧五个功能入口与阵列五列联动。事项点击勾选或撤销;按本地日期自动重置。完成状态与计时存于独立 rhine-workbench-v1 项,宿主属性不覆盖它们。内容改动清除对应旧完成状态;存储不可用显示提示。该存储不承诺跨设备、换目录或卸载后保留。
专注与休息可开始、暂停、继续、重置、切换。截止时间采用 Date.now(),壁纸暂停、遮挡或重载后校正,不补响后台提醒,也不自动开始下一段。改变时长只影响下一次开始。媒体监听在经典启动脚本中提前注册,支持标题、歌手、封面、状态与可选进度;未启用、无曲目或无进度均有空状态。媒体来源取决于 Windows 媒体会话支持,模拟回调验证不代表所有播放器实测成功。
验证页:reference/workbench-review.html(开发 wallpaper 模式),包含仅用于测试的宿主属性与媒体回调。运行 node scripts/check-workbench.mjs 检查日期边界、暂停/重载计时和媒体切换残留。当前仍为本地实验,不合并正式网站。
2026-09-10 本次验证:壁纸与普通网页构建均通过;check-wallpaper 与 check-workbench 通过。在 Edge 实际页面验证设置切换、专注启动、事项勾选后重载保留、模拟媒体标题与进度、有效目标日期和无效日期提示,并检查桌面尺寸布局。媒体使用测试回调,未声称真实播放器联动已验证。本地安装目录已更新;本版尚待 Wallpaper Engine 桌面实际试听与存储复核。
2026-09-10 视觉修订:按用户要求撤回绿色主题,改用主页现有颜色,取消信息面板底块和导航色块,复用竖线刻度与黑白按钮状态。壁纸构建通过,并在 Edge 实际运行页面检查布局;已更新本地壁纸包。
## 工作台可配置显示(2026-09-10)
纯净效果是工作台的配置结果,不增加独立模式。在 WE 中选择“工作模式 → 桌面工作台”,按需切换“工作台:显示…”七个开关。全部关闭时仅保留三维阵列;设置按钮也可关闭,再从 WE 属性恢复。开关在启动时由宿主恢复,局部属性更新不会重置其他选项。壁纸内没有另一套临时显示开关。
工作台显示配置不影响档案展示。隐藏专注内容不停止正在运行的计时,也不清除事项完成状态。开场结束位置现在由下文的入场选项控制。
该阶段壁纸构建、check-wallpaper、check-workbench 通过。Edge 实际页面用宿主回调验证全部隐藏、只留时钟与外部恢复所有元素(包括设置入口),并检查纯净阵列截图。
## 音乐律动、波纹接力与入场(2026-09-10)
WE 属性使用六个原生可折叠 group:入场与画面、工作台界面显示、事项与日程、声音、音乐律动、波纹接力。工作模式始终在最上方。工作台分组仅在工作台模式显示;关闭声音、律动或游戏入口后隐藏对应音量、强度或节奏参数,保留已有值。使用本机 WE UI 实现中确认的 group 和 condition 字段,不伪造多层导航。
“入场时展示档案详情”提供随工作模式、展示详情、跳过详情三个选择。默认工作台在原片约 30.90 秒(内部时间 25.90)结束,阵列已进入并出现选择波浪,尚未进入完整抽取和特写;档案展示默认保留完整开场。工作台内容以 460ms 淡入和 9px 上移错峰显示。减少动态效果时直接显示。带 time 参数的逐帧对照仍保留完整原时间轴。
音乐律动只作用于工作台阵列;低、中、高频分别驱动宽波、小波与稀疏轻抬,保留原材质。默认开启、强度 100%,可设 0–200%。宿主没有信号或停止回调后缓慢回落。选中高度可设保持原样、仅音乐律动时归齐(默认)、始终归齐;归齐去掉选中隆起,不改变卡片朝向。减少动态效果时不播放频谱运动。默认在律动开启期间暂停壁纸自带配乐,避免内部配乐持续驱动频谱;此行为有独立开关,原配乐偏好不被改写。
波纹接力由左下角按钮开始,可在 WE 隐藏入口。点击抬起卡片或其编号得分,错误或超时结束,可重试或退出。三档节奏随得分渐快。游戏使用可见、射线可命中的真实卡片;暂时归齐阵列、淡出频谱、隐藏工作台文字并隔离浏览手势。退出恢复界面与律动。倒计时按实际经过时间运行,宿主暂停、后台或设置弹窗暂停计时,不因低帧率延长一轮。隐藏入口不会移除进行中游戏的退出按钮。
验证:check-playground 检查立体声频段、异常值、信号丢失回落、计分、重复点击、重试、超时、暂停、入场策略与六组属性条件;check-wallpaper、check-workbench 与两种构建继续运行。reference/playground-review.html 为不随安装包分发的宿主模拟面板,含三次接力后退出的集成验证。Edge 已观察真实模型抬起、三次得分后恢复、模拟音乐后归齐。系统实际音源与 WE 属性面板的最终显示仍需本机宿主复核,模拟频谱不代表真实音频已验证。
接口依据:[音频可视化](https://docs.wallpaperengine.io/en/web/audio/visualizer.html)、[分组](https://docs.wallpaperengine.io/en/scene/userproperties/overview.html)、[条件显示](https://docs.wallpaperengine.io/en/web/customization/displaycondition.html)。
## 登录入场适配与字幕移除
正常入场使用 openingLayout 铺满实际视口,中央二维动画保持原始局部坐标,背景和三维画布延展到屏幕边缘。窄屏缩小圆环的整体占用,竖屏提高验证文字字号;品牌文字保持边角锚定,小屏的进入按钮与页脚品牌分置左右。三维入场按实际宽高比修正镜头视野与目标投影,不移动档案来补构图。底部中文字幕节点和更新逻辑已移除。
显式 time / review 对照仍为 1920×1080 等比舞台,正常入场不再有固定比例留边。验证页 reference/opening-layout-review.html 提供 16:9、超宽屏、4:3、竖屏以及登录、圆环、欢迎、阵列节点。check-viewport 检查实际画布覆盖、中央布局边界、既有交互镜头和固定对照。浏览器尺寸模拟不代表手机实机性能数据。
最终检查:普通与壁纸构建通过,check-playground、check-wallpaper、check-workbench、check-viewport 通过。Edge 实际页面检查 960×540、1050×450、360×640 登录布局,以及 800×600 短入场结束后工作台可见、字幕节点不存在;小游戏入口隐藏后仍保留工作台。包已复制到本地 rhine-lab-local,安装入口哈希与构建一致,需宿主重新加载。保留为本地实验,不合并或上传。
## 明暗配色
在「入场与画面 → 界面配色」选择亮色或暗色;默认亮色。壁纸内部设置也可以即时试切,长期保存仍使用 WE 属性。配色覆盖工作台、档案详情、360° 查看器和开场。正常切换时卡片依次变色,减少动态效果时直接切换。重新载入壁纸后可见新增属性。
## 音乐无律动修复 · 2026-09-10
修正音频能力声明的位置:`supportsaudioprocessing` 必须放在 `general` 中,旧版误放在根层级。本机官方 Audiophile 示例和官方音频文档作为核对依据。构建脚本现在检查该路径,阻止错误配置发布;检查脚本同步修订,原有模拟回调测试不能验证宿主识别能力。
配置与壁纸构建通过,更新本机安装目录后需重新载入壁纸。真实系统音乐输入的恢复效果尚待宿主试用确认。律动目前作用于桌面工作台;需启用音乐律动并关闭减少动态效果。
参考:https://docs.wallpaperengine.io/en/web/audio/visualizer.html
## 呼吸开关与律动整理方案 · 2026-09-10
新增 WE「工作台 · 界面显示」中的「静止时呼吸」,默认开启。呼吸位移独立于选中档案归齐系数,因此「始终归齐」也可呼吸。关闭后平滑收回;开启后沿原来的 8 秒/13 秒缓慢周期恢复。音乐活动时淡出,安静后恢复,小游戏及减少动态效果下停止。
浏览器验证页增加独立开关与呼吸增益读数,方便组合检查。
当前音乐方案仍是低中高三组不同速度正弦波叠加,时间相位自行推进,音乐主要控制振幅,尚未进行节拍触发;持续人声和高频也会造成局部起伏。这是杂乱感的主要实现原因。
建议下一版采用「鼓点主导的宽波」:低频能量相对短时平均的上升沿触发,每次沿同一方向推进;设置约 180–240ms 防重复间隔、限制同时存在的波数,快速上升后缓慢回落。中频仅轻微调节整组振幅,高频不独立驱动位移。使用缓慢增益适配,限制峰值,安静时平滑退回呼吸。另一种更安静的方向是整组同步轻抬,几乎不做传播。此处记录方案,未替换现有音乐算法;合成输入检查不能代替真实歌曲试听。
## 三种律动并列试用 · 2026-09-10
用户比较后保留原版多层起伏为默认,并要求重做 A/B。当前 WE 属性提供原版、方案 A「左低中中右高频谱」、方案 B「连续层叠流波」,沿用原有存储值 legacy / wave / lift。切换连续混合,强度和独立呼吸开关共用。
A 按当前相机投影后的屏幕横向位置混合低/中/高频,避免斜视阵列的物理列号与屏幕左右不一致。相邻频段平滑衔接,持续音也会驱动起伏。B 使用低、中、高频驱动三层不同速度的连续流波,替代旧的整组节拍轻抬。原版保留原参数。两项新方案不再使用鼓点触发门槛;真实音乐观感待用户试用。
检查覆盖左右频段分布、持续中高频响应、频段边界、静音归零及快速切换。浏览器对照页 reference/workbench-revision.html 提供原版与 A/B、独立持续频段和混合输入。
## 阵列覆盖与性能
「入场与画面 → 阵列覆盖余量」提供「自动 · 标准余量」(默认)和「自动 · 额外余量」。两档都按当前镜头和屏幕范围计算数量,额外档多保留屏幕外余量,渲染开销较高。正常使用无需填写档案数量;切换屏幕比例和进入详情时自动重新计算。
屏幕外不再整池提交。仍保留可能进入视口或影响附近阴影的卡片;这不是对所有互相遮挡的表面做深度遮挡裁剪。相同比例、相同构图从 1080p 改到 4K,不会仅因像素增加而生成更多档案。更宽的视野会需要更多档案,不能把旧版缺失边角时的较低数量当作同等覆盖下的性能基准。
暗色远景灰雾与边缘淡出一起加强。验证与当前限制见 verification/ARRAY-COVERAGE.md。
## 工作台细节与开场衔接修订
移除「播放器未提供进度」和时区说明;有有效进度时继续显示时间线。暗色选中刻度使用暖白,REINITIALIZE 悬停使用琥珀色。接力退出按钮位于计时线下方,与设置入口分开。
工作台开场隐藏选档标题与编号;Powered 在开场末段 350ms 淡出。工作台与档案展示互切时,旧界面约 220ms 退场,输入立即隔离,完成后隐藏;快速返回衔接当前透明度。减少动态效果时直接显示或隐藏。
普通开场也按实际镜头视锥动态生成档案,覆盖超宽及竖屏;仅显式原片逐帧对照保留 160 个位置。详见 verification/WORKBENCH-REVISION.md。
本地媒体封面修复:文字、封面、进度按独立事件保留,不再因文字更新误清除封面。回归步骤与官方接口依据见 verification/WORKBENCH-REVISION.md。
游戏进出过渡:游戏信息 300ms 淡入并轻移,220ms 淡出;工作台与品牌、页脚反向渐变。入口与目标标记分别淡入淡出,退出完成后恢复操作与焦点。隐藏游戏入口和减少动态效果均继续生效。
## 可选 HUD 与画面质感
WE 属性中的「HUD 与画面质感」提供 UI 曲面视差、全局屏幕效果与界面磨砂底,默认全部关闭。
- 「曲面纵深」决定四周 UI 的展开程度。「鼠标追踪」独立控制跟随;关闭后仍保留静态曲面。三维背景不跟随被动鼠标移动。
- 「全局屏幕效果」覆盖三维背景、文字、按钮、开场与弹窗。颗粒、颗粒尺寸、色散、暗角分别调节;可先单项从 0 调高来比较效果。
- 磨砂底使用主题颜色并随文字和按钮投影。减少动态效果时停止鼠标跟随、冻结颗粒,静态形状仍保留。
实现、参考结构与验证见 verification/VISUAL-EFFECTS.md。
## 四边距与任务栏
WE「界面边距 · 正值内收 / 负值外扩」提供上、下、左、右四个独立滑杆,范围 −300~300px,默认 0。数值是在原布局上的额外偏移;正值留出更多空白,负值向屏幕边缘外扩。任务栏遮住底部时,可先把「下边距」调到 60,再按实际遮挡微调。四项设回 0 恢复原布局。
边距不依赖视差开关。工作台、档案 UI、固定游戏信息、弹窗与查看器控制区适配这些偏移,字体大小和三维画布不因边距缩放,开场保持原构图。详见 verification/UI-INSETS.md。
2026-09-10 修订:曲面纵深、细颗粒、颗粒尺寸、边缘色散、暗角的默认数值统一为 20。下边距不再缩短桌面工作台的中部定位容器;底部导航和页脚先上移,实际接近中部内容时才推动对应内容,上方品牌限制继续上移,空间不足时内容独立滚动。手机窄屏继续采用原有纵向滚动布局。
WE 新增「工作台 · 可用功能」,时间日期、今日事项、重要日程、正在播放、专注计时各自可开关,默认全开。关闭功能同时移除其右侧内容入口和底部按钮;当前项关闭时选择首个仍开启功能,全关时隐藏右侧内容和导航。左侧时钟与事项仍由原显示开关控制,任务和计时状态保留。用户明确要求自行验证,本轮仅完成实现和构建打包,未进行运行时与视觉验收。
2026-09-10 后续修正(覆盖上述中部避让方案):用户明确下边距只移动底部两排,排间距固定,中部组件不压缩、不滚动。已删除 workbench-insets 自动避让;工作台高度不再随下边距变化。底部导航、游戏入口与页脚在曲面投影之后使用相同 translate 偏移。另修复 :is 内 ID 提高优先级导致原规则覆盖,以及减少动态效果的隐式 all 过渡污染曲面测量的问题。Edge 实际页面完成 1920×1080、2560×1440、1600×900,曲面 0/20/80,下边距 60/192/300/−80/0,共 45 组检查:中部坐标及尺寸固定,无新增 overflow,底部各行位移一致。画面对照与数据见 verification/ui-insets/。
WE「入场与画面」新增暗色专用开关「暗色模式仅选中档案标签使用强调色」,默认关闭保留现有选择。开启后阵列与归位档案的顶边标签使用暗色,当前选中档案保留琥珀强调;浅色不受影响。通过既有材质 uniform 实现,无新增网格与绘制通道,暗色开/关及浅色截图已检查。
## 超级性能模式与自定义画质
用户于 2026-09-10 要求低配壁纸模式与减少动态效果独立,并恢复 WE 原生自定义画质。新增「超级性能模式(保留动态效果)」开关,默认关闭;开启时以独立的有效画质覆盖已保存画质,不改减少动态效果、宿主帧率或音乐律动设置,关闭恢复当前预设/自定义配置。
超级模式:三维比例 60%、DPR 上限 1、总像素不超过 921600;关闭阵列阴影、AO、景深和 SMAA,直接输出主场景;背景阵列使用无折射、无清漆材质并隐藏小螺丝,选中/详情模型保留完整结构和低分辨率折射。全局屏幕滤镜暂时停用,文字磨砂改为无模糊底色,HUD 曲面与追踪继续运行。DOM 文字不降低分辨率。
WE 画质下拉增加「自定义」,仅此选择且超级模式关闭时显示九项控制:渲染比例、像素密度、抗锯齿、阴影、AO 采样、AO 分辨率、景深、透明材质分辨率、纹理过滤。连续参数用滑杆,离散参数用原生下拉。部分宿主回调保留其他参数;超级模式开启期间保留自定义更新,关闭恢复最新配置。完整证据见 verification/SUPER-PERFORMANCE.md。
## 暂停三维渲染与自定义图片
点击左下 SESSION 右侧「3D 开启」:档案依次下落,完成后释放主场景及查看器资源,保留 2D 工作台。点击「3D 关闭」重新加载,档案从下方升起;退场途中再次点击会恢复。游戏入口在退场、关闭、载入期间隐藏,成功开启后按原偏好恢复。
在 WE「入场与画面」启用「关闭 3D 后显示自定义壁纸」,再选择图片,可在释放完成后淡入该图;重新加载成功后图片淡出。默认不开启,未选图则继续使用原背景。图片不会成为默认资产或写入项目。验证与限制见 verification/THREE-RELEASE.md。
本轮保留原版、连续频谱和层叠流波三种音乐律动;同时修复无音乐拖动后的错误归齐、全归齐时标签强调与暗色选中强调过渡,见 verification/SELECTION-STATE.md。
## 创意工坊发布准备
- 用户于 2026-09-10 曾授权发布,随后明确改为自行操作发布,代理负责 GIF 和操作说明;当前尚未上传。
- 正式名称为 Rhine Lab · 莱茵生命交互桌面,去掉“本地测试”。独立正式工程放在 Wallpaper Engine 的 myprojects/rhine-lab-workshop,保留之前本地试用工程。
- 预览参照用户指定的 3088099655 预览的全景/局部剪辑方法,素材全部来自本工程工作台实际运行画面。最终 GIF 256×256、13.2 秒,含时钟事项、专注与明暗切换;没有将参考壁纸的图片放入发行包。
- 发布操作和后续更新须保留 workshopid,见 docs/WORKSHOP-PUBLISH.md;预览来源与验证见 verification/WORKSHOP-PREVIEW.md。
## 仅加载 2D 启动与图片路径修复
WE「入场与画面」新增「启动时加载 3D(下次加载生效)」,默认开启。关闭后不创建 WebGL 场景或下载模型,2D 开场到原片 26.9 秒处直接进入组件页面;左下 3D 开关可手动加载。改变属性不会卸载当前场景。自定义图片在开场结束后出现。
自定义图片路径修复了宿主将盘符编码为 E%3A 后再次编码导致的读取失败;支持原始路径、编码路径与 file URL。同一路径读取失败后重新选择可重试。真实 WE 宿主验证提取的 wallpaper-2.jpg 为 3200×2000 并成功解码。
验证:scripts/check-startup-2d.mjs 检查初始无 canvas/GLB 请求、2D 开场结束、手动载入、属性仅下次启动生效、默认开启与无页面异常;scripts/check-wallpaper-image.mjs 验证路径与同路径重试;scripts/check-wallpaper-image-host.mjs 验证真实宿主回调。结果位于 verification/startup-2d 和 verification/wallpaper-image。
### 宿主属性到达时序修复
启动必须等待 WE 首次 applyUserProperties 回调后再判断是否创建三维场景,不能将尚未收到的属性当作默认开启。真实 file 壁纸没有超时后强行加载的回退;普通 HTTP 预览无宿主时继续正常启动。此前测试只覆盖提前注入属性,现补充 1800ms 延迟回调;真实 WE 独立窗口验证关闭属性后进入 archive,canvas 与 GLB 请求均为 0(scripts/check-startup-2d-host.mjs,verification/startup-2d/host-results.json)。
## 自定义图片遮罩范围
WE 自定义壁纸图片下方新增「上下遮罩范围(0 为关闭)」:0–100,默认 100 保留原渐变范围;降低数值缩小上下覆盖,0 完全隐藏图片上的 atmosphere。仅图片实际显示时生效。亮暗配色 100/50/0 的样式断言及截图见 scripts/check-wallpaper-mask.mjs 与 verification/wallpaper-mask;构建通过。
## 时钟与媒体滚动、图片背景按钮可读性
工作台时钟、页脚秒钟、媒体已播放/总时长、切歌标题与艺人、专注计时复用现有 createRollingText,460ms、direct、同时起动与轻微模糊;格式化时间按字符滚动,冒号保持。首次显示直接初始化,相同值不重复播放,减少动态效果立即完成。媒体面板原位更新,保留滚动节点及未变化封面,避免宿主高频进度回调打断。
自定义图片显示时,页脚、底部导航、待办事项与提示、媒体及其他按钮改用主题前景色,关闭 3D 状态不降低文字透明度。用户否决额外白底,已撤回该底色与外扩阴影,仅保留原有玻璃模糊。无遮罩图片背景实看与时钟、切歌、进度、专注、减少动态效果检查见 scripts/check-workbench-rolling.mjs 和 verification/workbench-rolling。
- 页脚 HH:mm:ss 进一步改为三组 createRollingNumber,冒号固定、两位补零、460ms 向上滚动。验证捕获实际运行中的动画,并检查 12:59:59→13:00:00 进位;减少动态效果时直接到位。此前此处采用整段 createRollingText,现已替换。
### 曲面下 8、9 与歌曲文字滚动中断
复现:启用 HUD 曲面后,秒数 7→8、8→9 的动画开始约 120ms 时已被清空,其他数字仍在运动。Rolling Number 0.4.1 用透视后的边界反推字形尺寸,与 ResizeObserver 的本地尺寸产生误差,触发 refresh 并直接结束动画。
scripts/patch-rolling-number.mjs 将字形宽高改为本地 computed style 尺寸,保留原滚动算法;安装、开发及构建自动应用,依赖升级后匹配失败会明确报错。验证开启曲面后的全部 0–9、9→10、小时进位以及五组不同字宽/长度歌曲名,120ms 时均有运行中的动画。证据见 verification/workbench-rolling/results.json。
- 播放器长标题与艺人名单行显示,按可用宽度截断为省略号后交给滚动库;悬停与辅助标签保留完整文字,视口变化重新计算。验证包含超长标题省略号与完整提示。
### 开场 HUD
开启「HUD 与画面质感」中的曲面效果后,前段开场也应用相同曲面纵深与鼠标追踪。关闭追踪保留静态曲面,关闭 HUD 恢复原开场;减少动态效果时停止追踪。无需新增开关。原始开场位移、缩放与笔画时间轴继续运行,进入工作台时延续 HUD 状态。
+46
View File
@@ -0,0 +1,46 @@
【更新日志|最新在前】
2026.09.11
• 修正开场 Logo 下方 RHINE·LAB 小字的重复重绘问题,改善开启 HUD 时的文字稳定性。
• HUD 曲面与鼠标追踪扩展到开场:Logo、验证文字、圆环与欢迎画面沿用同一效果,并与工作台连续衔接。
• 修复部分数字(如 8、9)和切歌文字的滚动动画中断;长歌名、歌手名自动省略,悬停可查看完整内容。
• 页脚时钟改为时、分、秒独立滚动,支持连续进位。
• 工作台时钟、专注倒计时、播放器时间及切歌文字加入滚动过渡;减少动态效果时直接显示。
• 改善自定义图片背景下底部按钮、导航、待办和提示文字的对比度,保留原有玻璃背景。
2026.09.10
• 自定义图片新增上下遮罩范围调节,设为 0 可完全关闭遮罩。
• 新增「启动时加载 3D」开关:关闭后只播放前段 2D 入场,之后可手动加载模型;修复首次读取设置时仍加载 3D 的问题。
• 修复本地图片路径识别与载入重试;支持关闭 3D 后显示自定义壁纸。
• 左下角新增 3D 开关:档案依次退场后释放三维资源,再次开启重新载入并升起。
• 新增超级性能模式,保留动态效果;补全自定义画质控制,关闭性能模式后恢复之前的画质。
• 新增四边独立界面边距,支持向内或向外调整;修正下边距,让底部两排一起移动,中部组件保持位置。
• 暗色模式新增「仅选中档案标签使用强调色」选项,并修正归齐状态下的标签表现。
• 新增 HUD 曲面、独立鼠标追踪、局部界面磨砂,以及覆盖整个画面的颗粒、色散与暗角;各项可独立调整。
• 阵列根据镜头和屏幕范围自动补位,裁剪屏幕外档案,改善宽屏边角露出阵列尽头的问题;加强暗色边缘雾气。
• 新增亮色/暗色配色及逐张变色过渡,覆盖工作台、档案详情与独立查看器。
• 提供原版、连续频谱、层叠流波三种音乐律动;静止呼吸可独立开关。修复壁纸自身音效触发音乐归齐的问题。
• 新增波纹接力小游戏,完善游戏与工作台的进出过渡。
• 新增桌面工作台:时间日期、今日事项、重要日程倒计时、系统媒体信息和专注计时;支持按需隐藏内容与关闭功能入口。
• 修复切歌时封面、歌曲文字和进度相互覆盖的问题,完善工作台入场、退场与操作衔接。
• 开场适配不同屏幕比例,移除底部字幕,并提供完整/简短入场选择。
• 完成 Wallpaper Engine 适配:本地资源打包、原生属性分组、音频响应、媒体信息、宿主帧率与暂停通知。
────────────────────
【Rhine Lab · 莱茵生命交互桌面】
以莱茵生命档案终端为灵感的非官方同人交互壁纸。
【桌面工作台】
时间与日期、今日事项、重要日程倒计时、系统媒体信息、专注计时,可按需显示或隐藏。
【三维档案】
可拖动的循环玻璃档案阵列、惯性滑动、档案详情与 360° 模型拆解查看。
【画面与交互】
亮色/暗色配色、三种音乐律动、呼吸效果、HUD 曲面与鼠标追踪、波纹接力小游戏。支持自定义画质与超级性能模式;可关闭 3D 并显示自己的图片背景。
【使用】
在 Wallpaper Engine 属性中切换模式、填写事项与日程、调整画面。拖动阵列浏览,点击档案读取详情;音乐律动需要启用音频响应。媒体信息由系统与播放器提供。
预览主要展示工作台模式,事项为演示内容;实际事项由你填写。资源本地运行。角色、名称与相关世界观归原权利方所有,本作品与官方无关联。
+54
View File
@@ -0,0 +1,54 @@
# 手动发布到 Wallpaper Engine 创意工坊
正式名称:**Rhine Lab · 莱茵生命交互桌面**。
正式本地工程已关联创意工坊条目 `3799142774`,后续使用「发布更新」。
工程目录:
```text
D:\Game\Steam\steamapps\common\wallpaper_engine\projects\myprojects\rhine-lab-workshop
```
## 第一次发布
1. 确保 Steam 在线,打开 Wallpaper Engine。如果已经打开过,重新打开壁纸选择界面,让它刷新本地工程。
2. 在「已安装」里搜索 `Rhine Lab`,选择 **Rhine Lab · 莱茵生命交互桌面**。另一个带「本地测试」的条目是之前的试用工程,本次使用新名称的条目。
3. 点击右侧详情里的 **在编辑器中打开**。
4. 在编辑器顶部打开 **创意工坊** 菜单,选择分享/发布壁纸的选项,进入 **发布到创意工坊** 表单。不同版本的菜单可能称为「准备发布」或「在创意工坊上分享壁纸」。这是发布完整壁纸,不是发布组件或属性预设。[官方网页壁纸发布流程](https://docs.wallpaperengine.io/en/web/first/gettingstarted.html)
5. 核对标题为 **Rhine Lab · 莱茵生命交互桌面**。描述已写入工程;如果界面未带出,可从本文末尾复制。
6. 设置 **可见性:公开**、**年龄分级:大众级(Everyone)**;样式可选 **科技(Technology)**。
7. 在 **预览图片 → 导入文件** 中选择下面的 GIF。即使已经出现封面,也可以重新导入这一版。
```text
D:\Game\Steam\steamapps\common\wallpaper_engine\projects\myprojects\rhine-lab-workshop\preview.gif
```
8. 第一次上传选择 **创建新项目**,点击 **发布**,等待提示上传成功。
9. 点击 **在创意工坊中显示壁纸**,检查正式名称、动画封面和可见性。如果 Steam 要求接受创意工坊协议,由你在 Steam 页面完成。若页面提示审核中,等待审核即可,不要重复创建条目。
10. 保存工坊页面链接,并备份整个 `rhine-lab-workshop` 工程目录,尤其是发布后更新的 `project.json`。
## GIF 说明
工坊封面为 256×256、13.2 秒、约 940 KB,包含工作台全景、时钟与事项特写、专注计时特写、暗色全景与暗色特写,再回到亮色全景。它从真实浏览器画面剪辑并裁切放大,使用演示事项及演示频谱;演示事项没有写入壁纸的默认值。
GIF 是无声的。预览封面不能完整表现所有细节,订阅后的壁纸按实际屏幕尺寸渲染。官方规定 GIF 预览不超过 256×256、文件不超过 1 MB;当前文件符合该限制。[官方预览说明](https://docs.wallpaperengine.io/en/scene/first/publishing.html#animated-preview-images)
## 以后如何更新
可以持续更新同一个工坊条目,原订阅者会收到更新,无需重新订阅。[官方更新说明](https://docs.wallpaperengine.io/en/scene/first/publishing.html#publishing-updates)
1. 更新这个原工程的壁纸资源,保留 `project.json` 中的 **workshopid**,以及原发布关联。
2. 从同一条目选择 **在编辑器中打开**,再次进入发布窗口。
3. 「上传为」应为 **更新现有项目**,按钮应显示 **发布更新**;填写本次更新说明并发布。
4. 如果变成「创建新项目」,先检查是否打开了其他工程或丢失工坊 ID,不要直接发布一个重复条目。
源码仓库的 `npm run build:wallpaper` 只生成构建包,不会自动读取 Steam 刚生成的工坊 ID。首次发布后,不要用尚未包含该 ID 的构建版 `project.json` 直接覆盖已发布工程的同名文件。后续交给代理更新时,提供这个工程目录或工坊链接,让代理先保留发布关联再同步资源。
工坊上传不等于源码备份。保留源码仓库和发布工程,两者都有用途。
## 可复制的发布描述
完整简介保存在 [WORKSHOP-DESCRIPTION.txt](WORKSHOP-DESCRIPTION.txt),并同步到正式工程的 description。更新日志放在最前面,按日期从新到旧,同一天按更新顺序从新到旧排列,后接功能介绍。日期依据开发记录整理,不代表当天每一项都单独发布过工坊版本。以后完成更新时,在简介顶部追加面向用户的变化。
若发布窗口未自动带出新简介,将该文本文件的完整内容粘贴到描述栏,再发布更新。
+61
View File
@@ -0,0 +1,61 @@
# README 演示素材
2026-09-09 从当前应用重新采集,运行版本为 `e0cb75ffcc1bf7d1fb5e2458b3c35fa0f6f336da`。使用独立的 Chrome 浏览器上下文、GPU 硬件加速与默认「原始」画质,不读取日常浏览器的收藏和偏好。素材仅用于文档展示,不参与应用运行。
## 静态截图
全部截图为 1600 × 900 JPEG,质量参数 93。保留真实界面与模型,没有叠加宣传文字或替换背景。
| 文件 | 展示内容 |
| --- | --- |
| `archive.jpg` | 新版循环阵列与档案导航 |
| `detail.jpg` | 解密完成后的双环内构与档案概述 |
| `research.jpg` | 研究记录页签 |
| `viewer-clear.jpg` | 独立查看器,清晰玻璃 |
| `viewer-frosted.jpg` | 相同视角下的磨砂玻璃 |
| `assembly.jpg` | 六组结构拆解 |
| `search.jpg` | 搜索「莱茵」后的档案索引 |
| `settings.jpg` | 音效、音乐、减少动态效果与画质设置 |
| `boot.jpg` | 白底开场中的 Logo 与身份接入 |
## 动图
通过 Chrome DevTools Protocol 录制运行页面,按捕获时间戳保留真实节奏,再用 FFmpeg 缩放、降帧和量化。GIF 使用 96 色调色板与 Bayer 抖动,无声音,不代表应用实时帧率。浏览器仅在合成帧变化时输出录制帧,静止画面依照原时间保持。
| 文件 | 内容 | 大约时长 | 尺寸 / 帧率 |
| --- | --- | --- | --- |
| `decryption.gif` | 抽取、对角解密线、玻璃与正文同步揭示 | 7.9 秒 | 960 × 540 / 12 fps |
| `glass-motion.gif` | 清晰 → 磨砂 → 清晰 | 4.2 秒 | 800 × 450 / 12 fps |
| `assembly-motion.gif` | 拆解、旋转、视角复位与重组 | 8.0 秒 | 800 × 450 / 12 fps |
| `browse.gif` | 连续选档、切列和文字滚动 | 6.8 秒 | 640 × 360 / 8 fps |
| `boot-motion.gif` | 白底输入、Logo、权限扫描与欢迎转场 | 20.4 秒 | 800 × 450 / 12 fps |
README 直接展示解密动图,其余动图放在可展开区域。采集时间、源码版本与原始帧间隔记录见 [`capture.json`](capture.json);GIF 编码的帧时长取整可能使成片时长略有差异。
## 重新采集
采集脚本为 [`scripts/capture-readme.mjs`](../../scripts/capture-readme.mjs)。需要 Chrome、Playwright 与 FFmpeg;它们是文档制作工具,普通应用运行不需要安装。脚本会覆盖本目录同名素材,并将中间 JPEG 帧保存在被 Git 忽略的 `.tools/readme-capture/`。
先启动应用:
```sh
npm ci
npm run dev -- --port 5186
```
再从仓库根目录执行脚本。已能通过 Node 导入 Playwright、且 FFmpeg 在 PATH 中时:
```sh
node scripts/capture-readme.mjs
```
也可以指定现有工具的位置,例如 PowerShell:
```powershell
$env:PLAYWRIGHT_MODULE = 'C:/tools/node_modules/playwright/index.mjs'
$env:FFMPEG = 'C:/tools/ffmpeg.exe'
$env:CAPTURE_URL = 'http://127.0.0.1:5186'
node scripts/capture-readme.mjs
```
其中工具路径需要替换为本机的实际位置。Windows 录制显式使用 D3D11;其他平台使用 Chrome 可用的 GPU 后端。录制后应查看截图、GIF 的起止帧及中间过渡,确认资源加载完整、没有遮挡或异常,检查 README 图片链接,并更新此处的版本与时长。
Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 MiB

+65
View File
@@ -0,0 +1,65 @@
{
"commit": "e0cb75ffcc1bf7d1fb5e2458b3c35fa0f6f336da",
"capturedAt": "2026-09-09T04:21:30.572Z",
"viewport": "1600x900",
"quality": "original",
"gifs": [
{
"name": "browse",
"frames": 126,
"duration": 6.623064994812012,
"width": 640,
"fps": 8,
"averageCaptureFps": 19.02442450718791,
"maximumFrameGap": 0.3434779644012451
},
{
"name": "decryption",
"frames": 200,
"duration": 7.776905059814453,
"width": 960,
"fps": 12,
"averageCaptureFps": 25.71717135052331,
"maximumFrameGap": 0.14150595664978027
},
{
"name": "glass-motion",
"frames": 114,
"duration": 4.078908920288086,
"width": 800,
"fps": 12,
"averageCaptureFps": 27.948650540583383,
"maximumFrameGap": 0.06445097923278809
},
{
"name": "assembly-motion",
"frames": 211,
"duration": 7.880533933639526,
"width": 800,
"fps": 12,
"averageCaptureFps": 26.77483553484964,
"maximumFrameGap": 0.09002685546875
},
{
"name": "boot-motion",
"frames": 158,
"duration": 20.333863019943237,
"width": 800,
"fps": 12,
"averageCaptureFps": 7.7702893859880575,
"maximumFrameGap": 1.0142180919647217
}
],
"screenshots": [
"archive",
"detail",
"research",
"viewer-clear",
"viewer-frosted",
"assembly",
"search",
"settings",
"boot"
],
"errors": []
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB