Newer
Older
about-Leaflet / VirtualShop.html
<!DOCTYPE html>
    <html lang="ja">
    <head>
      <meta charset="UTF-8" />
      <meta http-equiv="X-UA-Compatible" content="IE=edge" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Document</title>
      <style>
        body {
          margin: 0;
          overflow: hidden;
        }
      </style>
    </head>
    <body>
      <div id="WebGL-output"></div>
     
      <script type="module">
        import * as THREE from "https://unpkg.com/three@0.126.1/build/three.module.js";
        import { PointerLockControls } from "https://unpkg.com/three@0.126.1/examples/jsm/controls/PointerLockControls.js";
        import { GLTFLoader } from "https://unpkg.com/three@0.126.1/examples/jsm/loaders/GLTFLoader.js";
     
        let camera;
        let scene;
        let renderer;
        let controls;
        let moveForward = false;
        let moveBackward = false;
        let moveLeft = false;
        let moveRight = false;
     
        function init() {
          // シーンの作成
          scene = new THREE.Scene();
          scene.background = new THREE.Color(0xffffff); // 背景色
     
          // カメラの作成
          camera = new THREE.PerspectiveCamera(
            45,
            window.innerWidth / window.innerHeight,
            0.1,
            1000
          );
          // カメラセット
          camera.position.set(1, 5, 5);
          camera.lookAt(new THREE.Vector3(0, 0, 0));
     
          // ライトの作成
          const light = new THREE.SpotLight(0xffffff, 1.0);
          light.position.set(100, 500, 500);
          scene.add(light);
          light.castShadow = true;
     
          // モデルの読み込み
          const loader = new GLTFLoader();
          loader.load(
            'https://www.yatex.org/gitbucket/j2311/about-Leaflet/raw/main/VirtualShop_final.glb',
            function (gltf) {
              scene.add(gltf.scene);
            	console.log(gltf.scene);
            },
            function (xhr) {
              console.log((xhr.loaded / xhr.total * 100) + '% loaded');
            },
            function (error) {
              console.error('An error happened', error);
            }
          );
     
           loader.load(
            'https://www.yatex.org/gitbucket/j2311/about-Leaflet/raw/main/final_world_stick.glb',
            function (gltf) {
              scene.add(gltf.scene);
            },
            function (xhr) {
              console.log((xhr.loaded / xhr.total * 100) + '% loaded');
            },
            function (error) {
              console.error('An error happened', error);
            }
          );
     
     
          // カメラコントロールの作成
          controls = new PointerLockControls(camera, document.body);
          document.addEventListener("click", function () {
          controls.lock();
          });
     
          // キーボードのキー操作
          document.addEventListener("keydown", function (event) {
            switch (event.key) {
              case "w":
              case "ArrowUp":
                moveForward = true;
                break;
              case "s":
              case "ArrowDown":
                moveBackward = true;
                break;
              case "a":
              case "ArrowLeft":
                moveLeft = true;
                break;
              case "d":
              case "ArrowRight":
                moveRight = true;
                break;
            }
          });
     
          document.addEventListener("keyup", function (event) {
            switch (event.key) {
              case "w":
              case "ArrowUp":
                moveForward = false;
                break;
              case "s":
              case "ArrowDown":
                moveBackward = false;
                break;
              case "a":
              case "ArrowLeft":
                moveLeft = false;
                break;
              case "d":
              case "ArrowRight":
                moveRight = false;
                break;
            }
          });
     
          // レンダラーの作成
          renderer = new THREE.WebGLRenderer({
            alpha: true,
            antialias: true,
          });
          renderer.setSize(window.innerWidth, window.innerHeight);
          renderer.physicallyCorrectLight = true;
          document.getElementById("WebGL-output").appendChild(renderer.domElement);
        }
     
        // カメラの移動設定
        function updateCameraPosition() {
          const speed = 10;
          const direction = new THREE.Vector3();
          const { x, y, z } = controls.getObject().position;
          direction.x = Number(moveRight) - Number(moveLeft);
          direction.z = Number(moveBackward) - Number(moveForward);
          direction.normalize();
          const delta = speed * 0.1;
          controls.getObject().translateX(direction.x * delta);
          controls.getObject().translateZ(direction.z * delta);
        }
     
        function animate() {
          requestAnimationFrame(animate);
          updateCameraPosition();
          renderer.render(scene, camera);
        }
     
        //クリック時の処理
          document.addEventListener("dblclick", function (event) {
          event.preventDefault();
         const raycaster = new THREE.Raycaster();
          const mouse = new THREE.Vector2();
          mouse.x = 0;
          mouse.y = 0;
          raycaster.setFromCamera(mouse, camera);
         const intersects = raycaster.intersectObjects(scene.children, true);
          if (intersects.length > 0) {
            if (intersects[0].object.name == "ICO球") {
              window.open("https://www.yatex.org/gitbucket/j2311/about-Leaflet/pages/buy.html");
            }
            console.log(intersects[0]);
          }
         });
     
        // 初期化とアニメーションの開始
        init();
        animate();
      </script>
    </body>
    </html>