图像与设计
需要制作 2.5D 等距动画、信息图或爆炸图时:用…
用 CSS 3D、SVG 或 Three.js OrthographicCamera 制作真正的等距/2:1 等距 2.5D 动画,无需构建步骤,以单 HTML 交付并用 ?t=N 冻结截图验证。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要制作 2.5D 等距动画、信息图或爆通用
解决思路
- 先选投影约定且绝不混用:真等距三轴互成 120°,屏幕地面 X/Y 轴与水平线成 ±30°,数学正确,适合 CSS/Three.js;2:1 dimetric(像素风等距)瓦片宽:高=2:1,轴约 26.57°(atan(0.5)),像素更干净,适合 tile/sprite 场景。
- DOM/SVG 最快真等距平面:在 perspective:none(或正交感)容器上用 CSS 3D transform;.scene { transform-style: preserve-3d; } .iso-plane { transform: rotateX(60deg) rotateZ(45deg); }。
- rotateX(60deg) rotateZ(45deg) 将平面后仰 60° 再旋转 45°,使地面轴落屏幕 ±30°;任何平面 SVG/DOM(平面图、UI mock、网格)放到 .iso-plane 即成等距表面,子元素用 translateZ() 朝相机抬升。
- 按代码放瓦片时用 2:1 投影数学:const screenX = (col - row) * (TILE / 2); const screenY = (col + row) * (TILE / 4);。
- 保持 perspective 关闭或非常大:等距是平行投影,远处物体不能缩小;小 perspective 会像倾斜 3D 卡片而不是 iso。
- 堆叠 Z 层:每层是同一平面形状放在 iso 平面上,沿 Z 分隔;后面的层抬得更高,按 bottom-up 错峰揭示;.layer { transform: translateZ(calc(var(--z) * 1px)); }。
- 拉伸块体:实体块=顶面+两个可见侧面;按面着色读体积:顶面最亮、左面中、右面最暗,固定光方向;CSS .top background:#3a9bff; .left background:#2c78c8; transform: rotateY(-90deg); transform-origin:left; .right background:#1f5896; transform: rotateX(90deg); transform-origin:bottom;。
- 同样着色规则用于 SVG:画三个多边形(顶面菱形、左右平行四边形),分别填亮/中/暗;很多小方块时 SVG 常比 3D-CSS 简单。
- 等距网格:地板网格就是 .iso-plane 上两组平行线(平面绘制,旋转后成 iso);在 SVG 中平铺绘制,放到平面,用 stroke-dashoffset 动画画线。
- 爆炸图:同堆叠层,但静止态是沿 Z 拉开;组装=动画每层 translateZ 到落座值,爆炸=反向;用一个共享 --gap 变量让整摞一起开合。
- 层揭示(build):每层 opacity + translateZ 从下方进入,错峰;easing back.out(1.4),stagger 0.12s。
- 爆炸/组装:补间共享 --gap(或每个 translateZ);easing power3.inOut,0.7–1s。
- 塔/堆叠构建:层从下到上落入;easing back.out(1.5),stagger 0.15s。
- 相机漂移:在 .scene 上缓慢 rotateZ / translate,循环 yoyo;easing sine.inOut,6–12s。
- 视差:层根据深度在 pointer/scroll 时偏移(--z ∝ shift);easing power2.out。
- 悬停抬升:单个块 translateZ(+12px) + 柔和阴影;easing power2.out,0.25s。
- 保持 iso 读感的规则:用 Z 抬升,绝不用 scale 伪造高度,缩放会破坏平行投影。
- 相机漂移必须很小很慢(几度/几像素);大幅移动会暴露它是平面。
- 构建错峰按物理位置(最底层先)而非 DOM 顺序,让结构按逻辑组装。
- 整个场景光方向固定,每个块同样着色。
- 当块体必须正确遮挡、投真实阴影或做 3D 旋转时,用真实几何体 + OrthographicCamera(平行投影才是真 iso;PerspectiveCamera 不是 iso)。
- Three.js 设置:const aspect = innerWidth / innerHeight, d = 8; const cam = new THREE.OrthographicCamera(-d*aspect, d*aspect, d, -d, 0.1, 100); cam.position.set(10, 10, 10); cam.lookAt(0, 0, 0);。
- 相机 position 各分量相等给出经典 30° iso 视角;OrthographicCamera 保持远处物体同样大小;光从一个方向来,开启阴影,构建时错峰 mesh.position.y / scale-in。
- 选择构建工具:CSS 3D transforms 最适合少量块/层且面上有清晰 DOM/文字;一个 HTML。
- 选择内联 SVG(iso 多边形)最适合大量小方块、网格、信息图;最易用 GSAP/CSS 动画,没有 3D transform z-fighting。
- 选择 Three.js + OrthographicCamera 当需要真实遮挡、阴影或 3D 旋转;仍可通过 CDN 作为单 HTML 交付。
- 选择像素/瓦片(2:1)用于游戏美术或地图场景;用 (col-row, col+row) 投影。
- 输出检查:轴落在正确角度(真 iso ±30°,2:1 约 26.57°);不要有意外透视缩小。
- 输出检查:每个块按固定光着色为顶亮/侧中/侧暗。
- 输出检查:层以可信深度堆叠——无 z-fighting、无两个面闪烁、无重叠错误。
- 输出检查:构建按物理位置 bottom-up 错峰,每个节拍一个想法。
- 输出检查:相机漂移小且慢;爆炸/组装每层精确落座。
- 输出检查:prefers-reduced-motion 显示最终组装场景,无循环漂移。
- 打包辅助脚本:scripts/seek-shot.sh anim.html 0 1.5 3 冻结 ?t=N harness 并截图各时刻;scripts/contact-sheet.sh sheet.png frame-*.png 拼成一张便于审查;见 scripts/README.md。
- 自包含 iso 场景(堆叠构建、爆炸图、漂移信息图)交付物是一个可直接在浏览器打开的 HTML 文件——无构建步骤、无框架、无渲染管线。
- 单文件适合网页动效层级;只有当单文件确实承载不了时才上 bundler。
- 如果场景是渲染视频的一部分,改用 Remotion composition 并用 remotion still 验证。
- 输出契约:一个 .html 文件,CSS 3D transforms 或内联 SVG(或 CDN Three.js)、markup、所有动效在一个内联 <script> 中,并放在一个主时间线 const tl = gsap.timeline(),单一播放头可 seek。
- 包含 seek harness,使任意时刻可冻结截图。
- seek harness:?t=N 将主时间线 seek 到 N 秒并暂停,让截图落在确定性静帧。
- seek harness 代码:const t = new URLSearchParams(location.search).get("t"); if (t !== null) { tl.pause(); tl.seek(parseFloat(t)); } window.__ready = true; console.log("duration", tl.duration());。
- 无 ?t 时正常播放;window.__ready = true 作为无头等待就绪信号;console.log duration 输出时长。
- Three.js 无 GSAP 时,用单一 clock/progress 值驱动构建,并从 ?t=N 设置它,然后渲染一帧,得到同样的确定性静帧。
- 验证循环:在开始、中间、结束三个时刻打开文件:…/iso.html?t=0、?t=<dur/2>、?t=<dur>(从 console 读 tl.duration())。
- 对每个冻结帧做无头截图:npx playwright screenshot --wait-for-timeout=500 "file://$PWD/iso.html?t=1.2" frame-mid.png。
- 检查投影,而不只是“动了吗”:轴——地面线在预期角度(真 iso ±30° / 2:1 约 26.57°);垂直线保持垂直;没有透视式前缩。
- 检查深度——层按正确 Z 顺序堆叠,块正确遮挡,逐面着色读出体积;无 z-fighting(闪烁重合面)且无重叠错误(后方块穿透前方块)。
- 检查构建——中间帧按物理顺序部分组装;结束帧每层精确落座(爆炸完全闭合),无补间中途漂移。
- 检查伪影——面上文字被裁切/倾斜、块出画布、字体前 FOUC、网格接缝锯齿。
- 迭代:修复角度/着色/Z 顺序,重新冻结相同 ?t 值,重新截图直到读起来像坚实的 iso。
- 完成前检查:在浏览器独立打开,无 console 错误,无缺失 CDN。
- 完成前检查:一个主时间线(或一个 Three.js progress 值);?t=N 冻结在确定性静帧。
- 完成前检查:在开始/中间/结束截图;轴正确、深度/Z 顺序正确、无 z-fighting、构建精确落座。
- 完成前检查:逐面着色从同一固定光一致;无意外透视缩小。
- 完成前检查:prefers-reduced-motion 显示最终组装场景,无循环漂移。
- 参考文件 references/isometric-recipes.md 包含更完整的可运行代码:投影数学(真 iso vs 2:1 dimetric、transform vs matrix)、平面 SVG/DOM → iso-plane 转换、带逐面着色的拉伸块面(CSS 和 SVG)、堆叠层与爆炸图构建、等距网格、相机漂移/视差/悬停,以及完整 Three.js OrthographicCamera iso 场景,含 easing 说明和 reduced-motion 处理。
适用边界 · 注意事项
- 需要真实透视、远小近大、焦距变化或电影级透视效果时不要用等距/正交投影;应改用 PerspectiveCamera 或真三维流程。
- 不要把真等距和 2:1 dimetric 两种轴约定混在同一场景。
- 如果必须采用完整前端构建管线、多文件框架或渲染视频,不要强行单 HTML 交付;视频用 Remotion composition 并 remotion still 验证。