Newer
Older
infomation / my-model-viewer / viewer.js
window.addEventListener('DOMContentLoaded', async function () {
    const urlParams = new URLSearchParams(window.location.search);
    const modelBlobUrl = urlParams.get("model");

    if (!modelBlobUrl) {
        alert("モデルが指定されていません。");
        return;
    }

    const canvas = document.getElementById("renderCanvas");
    const engine = new BABYLON.Engine(canvas, true);

    const createScene = async function () {
        const scene = new BABYLON.Scene(engine);

        // カメラとライトをセットアップ
        const camera = new BABYLON.ArcRotateCamera("Camera", Math.PI / 2, Math.PI / 2, 4, BABYLON.Vector3.Zero(), scene);
        camera.attachControl(canvas, true);

        const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0), scene);

        try {
            // blob URLからデータを取得
            const response = await fetch(modelBlobUrl);
            const arrayBuffer = await response.arrayBuffer();

            // GLB/GLTF データをロード
            const blob = new Blob([arrayBuffer], { type: "model/gltf-binary" });
            const file = new File([blob], "model.glb");

            await BABYLON.SceneLoader.Append("", file, scene);
            console.log("モデルが正常にロードされました。");
        } catch (error) {
            console.error("モデルのロードに失敗しました:", error);
            alert("モデルの読み込みに失敗しました。詳細はコンソールを確認してください。");
        }

        return scene;
    };

    const scene = await createScene();
    engine.runRenderLoop(() => {
        scene.render();
    });

    window.addEventListener("resize", function () {
        engine.resize();
    });
});