スクロールに応じて3Dモデルを回転させる

Ads

Result


表題の通りで、3Dモデル(サンプルでは.glbファイル)を、スクロールに同期させて回転させる、というもの。

3Dモデルを動かすにあたり、ARでお馴染みのmodel-vieweを使用する以外はバニラなコードとなっています。

javascript

const trackAnimationProgress = (animation, cb, precision = 5) => {
	let progress = 0;
	const updateValue = () => {
		if (animation && animation.currentTime) {
			let newProgress = animation.effect.getComputedTiming().progress * 1;
			if (animation.playState === "finished") newProgress = 1;
			newProgress = Math.max(0.0, Math.min(1.0, newProgress)).toFixed(precision);

			if (newProgress != progress) {
				progress = newProgress;
				cb(progress);
			}
		}
		requestAnimationFrame(updateValue);
	};
	requestAnimationFrame(updateValue);
}

const model = document.querySelector("model-viewer");
trackAnimationProgress(model.getAnimations()[0], (progress) => {
	model.orientation = `0deg 0deg ${progress * -360}deg`;
});

回転については、固定したい軸を0degにすればいいので、動かしたい軸は${progress * -360}degを指定するなどしてください。

3Dモデルは以下のように呼び出します。

html

<script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/3.1.1/model-viewer.min.js"></script>
<model-viewer src="hogehoge.glb"></model-viewer>

下記で詳しく解説されています。

via

Synchronize videos, 3D-models, etc. to Scroll-Driven Animations