Communitygithub.com

dotslashsimran/perspective-illusion

制作一段循环播放的3D插画视频,玩弄视觉感知,类似日本错觉艺术家(如@garments__)的风格:长焦镜头下被压扁的景深场景,在深度透视中变形;原本并列的物体实则处于不同深度;当画面保持平面时,物体悄悄互换位置。也可用于复现参考错觉视频,或创作该风格的新场景(街道、超市、车站、房间)。

perspective-illusion 是什么?

这是一个用于创建“透视错觉”动画的AI Agent技能,专为Claude Code等命令行AI编程助手设计。其核心是生成一种循环的3D插画视频,模拟日本错觉艺术家的标志性视觉效果:场景在长焦镜头下被压扁成平面,随后通过“推拉变焦”(dolly zoom)手法平滑过渡到具有深度感的3D透视,物体在平面状态下悄悄移动位置,从而制造出令人惊叹的视觉幻觉。技能提供完整的可工作HTML模板(街道、市场),内置相机摇臂、时间线和插画渲染管线,用户只需几行命令即可安装依赖并渲染视频。该技能详细说明了实现技巧:沿单一长轴布局场景、保持相机不倾斜、通过参数曲线控制变形、以及在平面状态利用物体滑移实现“前后互换”的作弊方法。同时提供了复现参考视频的精确测量方法、避免常见渲染问题的建议,以及实现独特手绘风格的后期处理流程(墨水线条、阴影交叉线、平涂天空)。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/dotslashsimran/simcraft/tree/HEAD/skills/perspective-illusion

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

透视错觉

templates/ 目录中的模板是完整且可直接运行的场景,请从中选一个作为起点:

  • street.html 是一个日本街道场景,包含电线杆、锥桶、人行横道和红色天空。
  • market.html 是一个日本超市场景,包含一条过道、端架、红色购物篮和成排的照明灯。

两者共享相同的相机摇臂、时间线和插画渲染管线。仅场景部分不同。

设置(在每个项目文件夹中)

mkdir -p ~/Movies/edits/<date>-<name>/stills && cd $_
printf '{"type":"module"}' > package.json && npm i [email protected] [email protected]
cp ~/simcraft/skills/perspective-illusion/templates/{street.html,render.mjs} .
node render.mjs street.html x --stills=0.2,1,2,4,6     # 先检查帧(stills/st_<t>.png)
node render.mjs street.html out.mp4                     # 7秒循环,1920x1080,4子帧运动模糊(约2.5分钟)

诀窍,分四部分

  1. 将场景沿一个长轴布局(一条街道或过道沿 -z 方向延伸),物体前后排列:电线杆或柱子在相同的 x 坐标上,末端是一栋建筑或后墙。400 米外的 2° 长焦镜头将所有物体压缩成一幅平面图。排成一线的杆子叠成一个,长侧墙沿边缘消失。
  2. 切勿倾斜或旋转相机。 它始终沿轴线正前方,保持水平,因此垂直线条保持垂直。对于“俯视”或“仰视”,使用镜头移位(H,画面中的地平线位置),如同移轴镜头。每个镜头参数为 {x, y (相机高度), zf, W, fov, H, lay, cs}。
  3. 在推拉变焦之间进行变形。 当 fov 变化时,W 始终保持对焦点平面 zf 的取景。所有参数通过单一单调的三次曲线贯穿所有关键帧,因此速度不会突变。
  4. 在平面状态下进行作弊。 物体(锥桶、篮子)仅在平面保持期间朝向或远离相机滑动,此时运动是不可见的。这就是一排物体变成一条对角线(“前后互换”)的原因。它们也可以在平面视图(cs)中绘制得更大。

匹配参考视频(按此操作,不要仅凭目测)

  • 在每一个镜头处提取其帧。然后,对于每个镜头,测量:
    • 消失点和地平线的位置(由此得出 H),
    • 两个已知宽度物体的位置(由此得出 x 和 W),
    • 一个已知长度物体(例如人行横道)的近端和远端边缘(由此得出相机高度 y、距离和 fov)。 计算出的数值已写在模板注释中。
  • 将其帧聚类到一个调色板中(对 4 帧进行 k-means 聚类),并使用这些确切的颜色。
  • 在每次更改后,将您的帧与参考视频在同一时间戳下并排比较。

插画渲染流程(为何看起来像手绘而非渲染)

页面渲染三个通道:颜色(双色调卡通着色)、视图空间法线加深度、以及仅太阳光的阴影蒙版。一个最终着色器随后完成三项工作:

  • 墨水线条:在深度(二阶差分,因此平视的地面不会被勾线)或法线发生变化的地方绘制。线条粗细随噪声变化,且采样点轻微抖动,因此线条不是笔直的。深度阈值随距离增大而增大。
  • 交叉阴影线:仅出现在投射阴影区域:色调偏冷且带有精细的对角线笔触,在几乎边缘可见的表面上淡化。
  • 天空(或天花板):在没有几何体的区域平涂。

已遇到的问题,避免您重蹈覆辙

  • 在单行语句中添加的 // 注释会吞噬 scene.add(sun),导致阴影蒙版变黑,整个画面布满交叉线。请使用 /* */ 或换行。
  • 重叠的共面地板在远处会闪烁。请确保地板块之间边缘对齐。
  • 浅角度掠射墙壁的光线会产生斑驳的自阴影。请将主光源保持在正面约 45° 角,并阻止全高柱子和天花板灯具投射阴影。
  • 生成的图像或标志上切勿出现文字。标志仅为形状。
  • 在每次完整渲染前检查静帧,并运行运动检查(vox-explainer 的 motion_check.py)。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能