起因:文具店门口的那种闪卡
小时候在文具店门口,总有一排塑封的闪卡——倾斜一下,整张卡流光溢彩。某天我看到一个开源项目 prehistoric-animal-museum:一个人给他的女儿做了一座史前动物 3D 博物馆,每个展品有模型、有讲解、有来源声明。
我当时的第一个念头是:这套「博物馆式」的内容组织方式,为什么不搬进一代人的童年记忆?于是有了这座经典动漫人物博物馆——从 1980 年的哆啦A梦,到 2023 年的芙莉莲,数百位人物、上百部作品、五座年代展厅。
这座馆里有什么
- 五座年代展厅:80 年代馆(哆啦A梦 / 龙珠 / 圣斗士)、90 年代馆(灌篮高手 / 柯南 / 海贼王)、00 年代馆(火影 / 死亡笔记 / 鲁路修)、10 年代馆(进击的巨人 / 魔法少女小圆)、20 年代馆(咒术回战 / 间谍过家家 / 芙莉莲)
- 每件展品一个「内容包」:展柜照片 + 中 / 日 / 英三名 + 原作者 + 声优 + 观察引导("看看他额头的伤疤")+ 讲解词 + 名台词(「你已经死了」「真相只有一个」「因为我是天才」……)+ 来源链接
- 主题曲:大量人气作品内嵌了 OP 片段,点开档案自动播放——龙珠的《Makafushigi Adventure》、巨人的《红莲的弓矢》、咒术的《Kaikai Kitan》
- 全息闪卡:任意人物一键生成会流光的闪卡,拖拽翻面,下载 PNG 收藏
技术上怎么实现的
整个馆是纯静态站:一个 index.html + 几个 JS/CSS + 数百张展品图,GitHub Pages 托管,零构建零依赖。
数据:人物资料与图片来自 AniList 的公开 GraphQL API。策展脚本按「作品 → 人物」两步抓取,每个候选图都要过一道媒体归属校验(确认这张图真的属于这部作品),再 4 倍 Lanczos 放大 + 锐化入库。主题曲来自 AnimeThemes 开放档案,只引用直链、不托管文件。
闪卡:渲染核心改编自开源项目 holo-card-studio 的着色器——四层纹理(主体 / 背景 / 线稿 / 文字)做视差,叠加镭射光谱与 Voronoi 星光。原方案需要 AI 绘四层图 + Blender 卡模,我把它简化成浏览器运行时生成:背景用同图模糊暗化、主体加圆角羽化、线稿用 Sobel 边缘提取、文字层用 Canvas 排版。零 AI、零构建,数百张卡即开即得。
主题曲自动播放:浏览器不允许有声自动播放,所以先尝试出声、被拦截就静音续播并提示「点击解除静音」——细节不完美,但体验闭环。
踩过的坑(给后来者)
- AniList 的译名和常见罗马字不一样:Krillin 在它那里叫 Kuririn,Frieza 叫 Freeza,仙道叫 Sendou,胖虎叫 Takeshi Gouda。按「人物名搜索 + 作品归属校验」才可靠,按作品人物表的相关度前 50 匹配会漏人。
- 限流:AniList 限流有两种响应形态,触发了降级桶之后会连续拒绝大查询,只能拉长间隔慢慢磨。214 张图抓了一下午。
- GraphQL 返回键大小写敏感:
Media/Page是大写,一个小写错全批数据静默失败。 - ShapeGeometry 的 UV 是原始坐标不是 0~1:自己用 Three.js 生成卡片几何时必须手动归一化,否则贴图全是边缘杂色。
- 同一名字在不同作品会撞车:鲇川圆(橙路)和鹿目圆(魔圆)都起了
madoka的内部 id,结果图互相覆盖、条目重复——修完之后给数据管线加了重复断言。
关于版权
所有角色形象的权利归各原作者、出版社与动画制作委员会。博物馆只做非商业的展览与科普:图片来自公开数据库、只做低分辨率展示;主题曲只引用开放档案的直链;NOTICE 里写明「如有权利异议,开 issue 即刻下架」。