poster-to-glowline-web

Community@xinsong854/poster-to-glowline-web
Community skill — not reviewed. It was shared by 安诺涅 and has not been checked by Neta. Read SKILL.md below before letting an agent use it.
Use it in Cohub

Paste this into your agent's chat — it fetches the skill and follows it.

Use the skill: poster-to-glowline-web. Run `npx -y @neta-art/neta-search-cli@latest skills use @xinsong854/poster-to-glowline-web --via site` and follow what it prints. Read its complete output, redirecting it to a temporary file first if necessary, and resolve relative paths from the skill directory it prints.
Install from a terminal
npx -y @neta-art/neta-search-cli@latest skills use @xinsong854/poster-to-glowline-web
Summary

Turn a poster into a glowing-line 3D page you can spin and interact with.

  • Takes a poster, illustration, or screenshot and translates it into glowing lines on a dark background as an interactive web page.
  • You can rotate it, tap hidden spots to trigger animations, hold to reveal secrets, and watch an opening sequence unfold.
  • Works best with posters that have strong spatial structure, dramatic lighting, or visual contradictions worth exploring in 3D.
  • Delivers a published web page with screenshots showing key moments, interactions, and both landscape and portrait views.
  • The process includes reading your image, proposing a translation plan, building in Blender, choreographing motion, and verifying interactions.
SKILL.md
# 海报 → 线光互动网页

> **用户的叫法**:用户说"**线性页面**"(或"线光页面")时,指的就是本技能做的这种作品——海报转译成线光风格、可以转动和互动的网页。听到就直接走本流程,不用再确认是什么。

这份技能教的是**处理过程**,不是某张海报的做法。每张新海报的结构、视角、光、叙事都不同,
所有构图、构件、动效都要从**那张图本身**里读出来。`references/` 里的《洞穴里的囚徒》只是一次实践的记录,不是模板。

## 先读什么(按需,不要全读)

| 文件 | 什么时候读 |
|---|---|
| `references/reading-a-poster.md` | 每次都读:怎么读图、怎么找"精髓"、怎么写转译表 |
| `references/klein-line-art.md` | **仅当用户要求**把某张图转成克莱因蓝底白色线稿时(杂乱的图先线稿化、做概念图、或直接交付线稿) |
| `references/impossible-space.md` | 海报有空间矛盾 / 错位 / 不可能结构时 |
| `references/linear-page-design.md` | 要从一张图 / 一个角色**新设计**一个线性页面时(不是照原图建模):提炼"一个物体 + 一个比喻",主体由细线、光点和片面组合而成 |
| `references/design-for-motion.md` | 每次都读:设计(概念图 / 线稿 / 结构)时同步构思动效,产出「动效构思」,并为动效留好分组和空间 |
| `references/imagination.md` | 每次都读:这张图可以变成什么、讲什么事(想法从图里来,不从上一张图搬) |
| `references/capabilities.md` | 每次都读:已经做过的能力(全部默认关闭),以及怎么延伸出新的 |
| `references/motion-and-interaction.md` | 设计开场、循环动效和互动时(每次都要设计) |
| `references/linear-page-sanbu.md` | 把流程搬到别的对话 / 世界时:完整流程的独立快照 |
| `references/pipeline.md` | 动手建模和搭网页时:脚本结构、数据格式、运行时 API、验证、发布、已知的坑 |
| `/workspace/references/blender-atmosphere/README.md` | 线光的视觉基因、调色板、参数(§1–§3);工具箱 API 在 `lib/glowline.py` |

## 流程

### 命名流程:线性页面三步
用户丢来一个**角色的链接**(捏Ta 短链最常见),要做成线性页面时,走这三步,每步做完停下来等用户确认:
1. **取资料**:链接是 `t.nieta.art/…` 用 `nieta-character-resolver` 拿名字、设定、形象,立绘下载到 `uploads/<角色>/`;
   是海报 / 插画 / 截图则换成读图(reading-a-poster.md)。产出:一句话的角色核心(身份 + 一个矛盾或一句关键台词)。
2. **概念海报**:按 linear-page-design.md 做转换设计(一个物体 + 一个比喻 + 一句题目 + 动效构思),
   出**一张概念海报**给用户确认。底色不锁死克莱因蓝:按角色选深底(加色发光线)或浅底(`mode='ink'` 墨线),见 §调色。
3. **线性页面**:按下面的 2–6 步建(Blender 建模 → 编排 → 网页 → 验证 → 发布)。
   用户只说"三步"时不要问,直接从第一步开始。

### 0 · 接单:先确认"要做成什么"
- 用户指名的海报按世界规则视为**已确认的概念**,不必再出概念图;但要确认**目标风格**:
  是把海报转译成某种已有风格(如克莱因蓝线光),还是做海报原本的风格。用户说"做成那种效果"时,
  "那种"指的是什么要问清,或从上下文明确判断(曾经误判过一次:用户要的是转译成线光,我分析成了原海报的版画风格)。
- 问清是否为同人 / 二创(决定标题、标志能不能保留)。用户说明是自己的同人作品时按其意愿处理。
- 用户只说"先分析"时,交分析和方案就停,等用户点头再建。

### 1 · 读图 → 选转换方式 → 转译表 / 转换设计(见 reading-a-poster.md §0)
- 先选转换方式:原图是适合立体化的结构就**转译**;是角色 / 人物 / 杂乱画面,或者要我设计时,用**转换设计**(一个物体 + 一个比喻,linear-page-design.md)。
- 用户给的是角色 / 普通图片、要我**设计**线性页面时,先按 linear-page-design.md 做转换设计(一个物体 + 一个比喻 + 一句题目 + 动效构思),出概念图给用户确认;
  不要直接把原图线稿化当成线性页面的设计。
- 用户要求先把图转成克莱因蓝线稿时,按 klein-line-art.md 做(重画 / 描线 / 校色),再基于线稿读图;用户没要求就不做。
- 放大局部去看(`ffmpeg -vf crop=...,scale=...` 切几块),不要只看缩略图。
- 逐层拆:空间结构与视角、光源与焦点、材质、**空间上的矛盾**、叙事焦点、文字排版、装饰层。
- 找"精髓":这张图之所以是它自己的那一两样东西。用户点出的关键词(如"错位")要回到图上
  核对它在**结构**上指什么,不要按字面理解成别的操作。
- 产出一张转译表:原作元素 → 线光里的替代物。交给用户的分析里包含它。
- 同时产出一份「动效构思」(design-for-motion.md):设计和动效一起想、一起给用户确认,不要等建完模再想怎么动。

### 2 · Blender 建模(见 pipeline.md、impossible-space.md)
- 按「动效构思」里的拆分建模:会分别运动的部分各自成组、按动作命名;要变形的部件把目标形状一起建出来。
- 从 `templates/blender/scene.py` 复制一份到 `references/blender-atmosphere/studies/NN_<名字>.py`,
  **整段替换示例几何**,保留结构:画幅调色 → 真视角 → 结构线 + 遮挡体 → 不可能构件 → 动效素材 → 材质 → meta → bake/still。
- 真视角:相机放在海报视平线的高度、水平看,构图偏移用 `shift`,不俯仰相机。
- 每改一轮跑 `--still` 出检查图,**亲眼看**,再改。

### 3 · 想象、动效与互动(见 imagination.md、capabilities.md、motion-and-interaction.md)
- 先想这张图可以变成什么、讲什么事(形状的韵脚、同一种力、意义的反面、材质、观众的身体、时间)。
  可以先列几个想法给用户挑;用户给了自己的读法就用用户的。
- 把这件事里的动词一个个落到实现上:现成的直接用;没有的就延伸(director、自定义数据 + 着色器注入、扩展工具箱),
  不要因为工具没有就退回现成效果,也不要每张图都套同一组动效。
- 按这件事排开场时间线(状态要变化、复杂度递增、第一秒有大动作),再排循环里的事件。
- 互动默认不写任何操作说明(用户要求"高级感"时必须如此);互动要和叙事有关。
- 亮度预算:泛光 ≤ 约 0.2、主线 Emission 约 2、闪光只是短暂点缀。

### 4 · 网页
1. `node /mods/neta/neta work init web works/web/<slug> --title "<标题>"`(返回的 workDir 会是 `works/webs/<slug>`)
2. `bash scripts/new_web.sh works/webs/<slug> <DATA_NAME> "<标题>" "<副标题>" "<描述>"`
3. `blender -b --factory-startup -P <场景脚本> -- --bake --data /workspace/works/webs/<slug>/data --name <DATA_NAME>`
4. 只改 `director.js`:在 `use` 里打开这张图需要的能力,在 `update` 里写它自己的编排。运行时 `js/runtime.js` 不改;
   需要通用的新能力时改模板,并更新 capabilities.md。

### 5 · 验证(见 pipeline.md §验证)
- 本地起静态服务,用 `scripts/shot.js` 截图:开场的几个时刻(`?t=`)、真视角、转开(orbit)、长按(`?hold=`)、点击(tap)、面板、竖屏和横屏。
- 截图环境每秒只有 1–3 帧:只能证明状态对、没报错,**不能证明流畅**。交付时如实说明。

### 6 · 发布与交付
- `node /mods/neta/neta work publish web works/webs/<slug>`;首次若报 `world_slug_required`,按 create-web-work 技能设置世界 slug。
- 交付说明里讲清:原作元素各自变成了什么、动效时间线、有哪些隐藏互动、哪些没验证过。
- 把这次新学到的、用户纠正过的东西补进 `references/` 对应文件(写通用规律,不写这张图的具体数字);新延伸的能力补进 capabilities.md。

### 调色(不锁死克莱因蓝,用户要求的灵活变通)
- 深底(默认):加色发光线,`gl.setup('klein'|'ultramarine'|...)`;浅底:`gl.setup('porcelain')` + 线材 `gl.mat_glow(..., mode='ink')`
  (深色线、正常混合;运行时自动切换 UI 主题与面的提亮/压暗方向,调色板在 glowline.py `PALETTES`)。
- 底色跟角色 / 图的气质走,不套固定色;一张图内主色 + 线色 + 一个辅色即可。

## 硬性规则(都来自用户的纠正)
1. **不拉伸**:不要用随高度变化的斜切 / 折叠场去造双重视角,它会把竖直方向抻长。用真视角的视平线,加上局部构件的常数斜切。
2. **不刺眼**:遵守上面的亮度预算。
3. **不写互动说明**。
4. **动效要有大变化和叙事**,不能只有缓慢的环境循环;动效和互动从这张图想出来,不套固定组合,工具不够就延伸工具。
5. **"错位"之类的词按空间结构理解**,不要拆开或移动建筑来凑。
6. 截图验证之后才能说完成;没在真机上看过的就说没看过。
7. **用户自己的角色不能删人**:转换设计时"很少画人"只适用于别人的 IP / 普通图片;用户的原创角色要留在画面里,让人成为比喻的一部分(见 linear-page-design.md)。