底图 Preset
五套古卷皮肤、真实地形、可选卫星与水系、区域拆出。调参台里调好,导出 v3 preset JSON。
{
"version": 3,
"skin": "parchment",
"terrain": { "exaggeration": 1.0 },
"camera": { "center": [104, 35.5], "zoom": 4.2 }
}三层结构
底图只管「长什么样」,叙事只管「讲什么」,舞台只管「第几秒画什么」。三层各自一份规范,可以单独调,也可以单独换。
五套古卷皮肤、真实地形、可选卫星与水系、区域拆出。调参台里调好,导出 v3 preset JSON。
{
"version": 3,
"skin": "parchment",
"terrain": { "exaggeration": 1.0 },
"camera": { "center": [104, 35.5], "zoom": 4.2 }
}地点、路线、阵营、地名状态、镜头、字卡。长征十四期里反复手写的东西,收成一份声明式规范。
{
"routes": [{ "id": "march", "side": "red",
"via": ["武威", "张掖", "酒泉", "敦煌"],
"draw": [2, 14] }],
"shots": [{ "t": 0, "fit": ["武威", "敦煌"] }]
}给宿主一个 seek(t):HyperFrames、Remotion、Playwright 截帧都按同一个时间契约逐帧取画面。
const stage = await MapStage.mount(el, { preset, story });
await stage.seek(12.5); // 地图 idle 后才 resolve
一句话出片
安装后用 /mapstage 调起。skill 会按规范生成数据、起本地预览、出低清样片,等你确认再出终版。
「做一个河西走廊从武威到敦煌的路线移动」
查坐标、定阵营色、按口播反算机位,写出 story.json。
960×540@10 先看节奏与构图,合规检查自动跑。
确认后 1080p 逐帧截取,断点续拍,局部重拍。
安装 MapStage skill:https://github.com/hopechen067/MapStage 然后用 /mapstage 做一段河西走廊从武威到敦煌的路线移动,完成后启动本地预览。
内置规则
这些规则来自长征系列与四渡赤水的制作记录和审核整改。默认开启,想关要显式声明。
不画省界和国界,不加雾化和暗角;出全图时台湾、海南、海岸线完整显示。
来源:长征 ep03 / ep14 审核整改一句口播最多一次有目的的镜头移动,到位后停稳,只做 6–7% 缓推和 3° 俯仰。
来源:长征 ep02 r8(机位 59 → 38)给一组地点,按安全区反算最小视距;全线总览单独放宽上限,路线不再出画。
来源:cz_render camfit · ep12地名与城池一旦出现就留在画面上,只在普通、激活、变暗三态之间切换。
来源:四渡赤水 AGENTS红军红、敌方灰蓝,箭头与牌子同色;同屏最多 1 条主线、2 个部队名牌。
来源:长征 ep06 · 四渡赤水分级表录制路径只用 jumpTo + 等 idle,不用 easeTo / flyTo;同一时间点永远同一画面。
宿主
地图页面暴露 window.__mapstageSeek(t),宿主按帧调用、等 idle 后截图。调参台只负责调参,从不做终版渲染。
页面声明 data-composition-id 与时长,HyperFrames 逐帧驱动。
await window.__mapstageSeek(frame / fps);
共享一个地图组件,delayRender 等 seek 完成再放行。
const h = delayRender(); stage.seek(frame / fps).then(() => continueRender(h));
分层截图、断点续拍、局部重拍;GPU 光栅化关掉防旧瓦片。
await page.evaluate(t => window.__mapstageSeek(t), t);
await page.screenshot({ path });作品
长征系列第 14 期《西路军》的地图段:古卷底图 + 真实地形 + 路线箭头 + 分级城池,预缓存后 jumpTo 逐帧录制。画面里没有省界、国界,这是现在的默认规则。