修正时间轴末帧,导出补阶跃与循环段边界关键帧
- 时间轴:末帧按时长实际覆盖的整数帧计算,修掉 Spine 时长小数舍入多出的一帧,B 端与回放自动停在最后一帧 - 导出:粒子死亡、骨骼池复用、拖尾假死复活处统一写 curve: stepped 硬切,避免死区插值出滑动轨迹 - 导出:循环持续在开始/循环/结束段边界(如 30f/110f)对所有动画通道补关键帧,便于在 Spine 中直接拆分 - 精简器支持阶跃段,阶跃区间内不再补出过渡关键帧 - 补充 test:spine-json 回归用例:骨骼池复用阶跃边界、循环段边界
This commit is contained in:
1 parent
f249c019bc
commit
d6232c9d66
9 files changed
+290
-82
No files matched your search
@@ -5,7 +5,7 @@ import { releaseSpineAsset, retainSpineAsset } from '../spine/spineAssetRegistry
|
||||
import { cloneEditorValue } from '../editor/editorClone'
|
||||
import { defaultSpineExportSettings, type SpineExportSettings } from '../export/spineExportSettings'
|
||||
import { loopSegmentTiming } from '../core/loopSegmentTiming'
|
||||
import { normalizePlaybackRange, resizePlaybackRange } from '../timeline/playbackRange'
|
||||
import { lastFrameOfDuration, normalizePlaybackRange, resizePlaybackRange } from '../timeline/playbackRange'
|
||||
|
||||
export interface ParticleSystem {
|
||||
id: number
|
||||
@@ -519,8 +519,11 @@ export const useParticleStore = defineStore('particle', {
|
||||
if (end > maxSec) maxSec = end
|
||||
}
|
||||
// totalFrames 表示快照数量;0 秒和末端点都可选,因此比末端帧编号多 1。
|
||||
// 末帧编号按“时长覆盖到的最后一个整数帧”计算,不能直接用 ceil:
|
||||
// Spine 的小数舍入会让 80 帧的时长变成 80.01 帧,从而凭空多出第 81 帧,
|
||||
// 回放时表现为末帧之后多停一帧。
|
||||
const previousFrames = this.timeline.totalFrames
|
||||
const frames = Math.max(2, Math.ceil(maxSec * fps) + 1)
|
||||
const frames = Math.max(2, lastFrameOfDuration(maxSec, fps) + 1)
|
||||
this.timeline.totalFrames = frames
|
||||
const range = resizePlaybackRange(
|
||||
{ start: this.timeline.playbackStart, end: this.timeline.playbackEnd },
|
||||
|
||||
Reference in new issue
Block a user