关于 flipbook
@drawcall/flipbook 是一个 Three.js 库,可通过 KTX2 精灵图集显示动画广告牌特效,适合在实时场景中制作美术指导风格特效的开发者,并提供播放、朝向和位置选项。
主要功能
- 01使用 Three.js KTX2Loader 加载翻页动画
- 02配置播放速度、时长和循环
- 03选择球形、柱形或关闭广告牌朝向
- 04设置精灵高度、不透明度和原点
- 05通过 URL 加载资源或直接提供字节数据
适用场景
- 01在场景中显示精灵图集爆炸或撞击效果
- 02放置循环播放的火焰或火花特效
- 03控制场景特效的广告牌朝向
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ drawcall-ai/ flipbook --skill flipbook安装后在 Claude Code 中输入/flipbook确认已加载。
附带文件agents/openai.yaml
详细介绍
@drawcall/flipbook
使用 @drawcall/flipbook 加载 KTX2 精灵图集,创建轻量级 Three.js 广告牌特效。从 @drawcall/market 获取可直接使用的翻页动画素材。
对于爆炸、火焰、魔法和撞击等艺术指导型特效,预渲染精灵图集是理想选择——它的视觉效果远胜于代码生成的粒子,而且运行时几乎不消耗资源。相反,对于程序化、参数化的爆发效果(例如沿表面法线飞溅的火花、物理碎片,或每次事件的数量和方向都不同的效果),请使用池化粒子。两者可以组合使用:翻页动画爆炸加上程序化碎片爆发,效果比单独使用任一方式更好。
安装
pnpm add @drawcall/flipbook three
three 是 peer dependency。
基本用法
import { Flipbook } from "@drawcall/flipbook";
import { KTX2Loader } from "three/addons/loaders/KTX2Loader.js";
const ktx2Loader = new KTX2Loader()
.setTranscoderPath("/basis/")
.detectSupport(renderer);
Flipbook.setKtx2Loader(ktx2Loader);
const flame = new Flipbook("/flame.ktx2", {
height: 0.6,
origin: "bottom-center",
billboard: "cylindrical"
});
scene.add(flame);
await flame.ready;
function animate(deltaSeconds: number) {
flame.update(deltaSeconds);
}
已知素材 URL 时,使用 new Flipbook(url, options)。如果加载由其他部分控制,则使用 new Flipbook(options).load(url) 或 .setData(bytes)。
KTX2Loader需要 Basis 转码器文件(basis_transcoder.js和.wasm),并且这些文件必须由你通过setTranscoderPath指定的路径提供。这些文件不会随包一起提供——请将它们从three/examples/jsm/libs/basis/复制到你提供的静态目录中(例如public/basis/)。如果缺少这些文件,Basis 压缩的.ktx2文件将无法解码,因而不会渲染任何内容——这是最常见的“翻页动画什么都没显示”原因。
获取素材
翻页动画素材优先使用 @drawcall/market:
npx @drawcall/market search --type flipbook "flame"
将下载的 .ktx2 文件用作 Flipbook 的 URL,例如 new Flipbook("/effects/flame.ktx2")。
KTX2 要求
KTX2 可以是由 Three.js KTX2Loader 加载的 Basis 压缩 KTX2,也可以是未压缩的 R8G8B8A8。
必需的元数据:
flipbook.columnsflipbook.rows
可选的元数据:
flipbook.aspectRatio,默认采用每帧纹理的宽高比flipbook.frames,默认值为columns * rowsflipbook.duration,默认值为frames / 24flipbook.playbackRate,默认值为1flipbook.billboard,支持spherical、cylindrical和none
选项
height:世界空间平面的高度;宽度根据aspectRatio确定origin:火焰、火把、撞击和锚定在地面的特效使用"bottom-center"billboard:自由朝向的精灵使用"spherical",保持 Y 轴竖直的精灵使用"cylindrical",手动定向的网格使用"none"playbackRate:调整素材播放速度的倍率loop:对于爆炸等只播放一次的特效,设置为falseautoPlay:手动触发时设置为falseopacity:材质不透明度倍率randomStart:多个循环播放的特效实例同时使用时,保持为true,以免它们同步
常见模式
一次性撞击效果:
const impact = new Flipbook("/impact.ktx2", {
autoPlay: false,
loop: false,
origin: "bottom-center"
});
impact.restart();
多个循环粒子:
const sparks = positions.map((position) => {
const spark = new Flipbook("/spark.ktx2", {
height: 0.25,
randomStart: true
});
spark.position.copy(position);
scene.add(spark);
return spark;
});
function animate(deltaSeconds: number) {
for (const spark of sparks) spark.update(deltaSeconds);
}
调试
- 如果什么都没有显示,请等待
flipbook.ready,并检查 URL 响应。 - 如果帧显示错误,请检查
flipbook.columns、flipbook.rows和flipbook.frames元数据。 - 如果精灵朝向不正常,请在
spherical、cylindrical和none之间切换。 - 如果特效漂浮或下沉,请先调整
origin,再调整网格位置。 - 如果一次性特效循环播放,请设置
loop: false。