🧩 triggerFragmentation() で進捗を計算している部分
const rows = 12, cols = 12; // コメントは「4×4」だが実装は12×12
const pieceWidth = planeWidth / cols;
const pieceHeight = planeHeight / rows;
const distance = 100 + (Math.random() - 0.5) * 40; // 80〜120の範囲
const targetPos = originalPos.clone().add(direction.multiplyScalar(distance));
const targetRotation = new THREE.Euler(
(Math.random() - 0.5) * Math.PI * 2,
(Math.random() - 0.5) * Math.PI * 2,
(Math.random() - 0.5) * Math.PI * 2
);
const duration = 10000;
const startTime = performance.now();
function animateFragments() {
const elapsed = performance.now() - startTime;
const t = Math.min(elapsed / duration, 1);
if (t < 0.5) {
const progress = t / 0.08; // ★ ここで 0.5 / 0.08 = 6.25
mesh.position.lerpVectors(original, target, progress);
} else {
const progress = (t - 0.5) / 0.01; // ★ 0.51 / 0.01 ≒ 1 → 即戻る
mesh.position.lerpVectors(target, original, progress);
}
}
ポイント
- グリッドは 12×12 = 144 断片。コメントの「4×4」と矛盾していた。
- 距離は 80〜120。距離が大きいほど飛び散りが派手になる。
- 進捗係数を 0.08 と 0.01 で割っているため、10秒設定でも 0.5 秒で6倍の外挿、その後0.51 秒で復帰してしまう。
- 動きは派手だが戻りが速すぎて余韻が消える。修正必須だと感じた。