Newer
Older
about-Leaflet / index.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 model;
          let moveForward = false;
          let moveBackward = false;
          let moveLeft = false;
          let moveRight = false;
          let controls;
     
          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;
            console.log(light);
     
            // 補助線
            //const axesHelper = new THREE.AxesHelper(500); //red is x, green is y, blue is z
            //scene.add(axesHelper);
            // const gridHelper = new THREE.GridHelper(1, 1);
            // scene.add(gridHelper);
            
            const loader = new GLTFLoader();
            loader.load(
       // ファイルのURL
    'https://www.yatex.org/gitbucket/j2311/about-Leaflet/raw/main/classroom_nothing_tv.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);
    }
);
        
           loader.load(
       // ファイルのURL
    'https://www.yatex.org/gitbucket/j2311/about-Leaflet/raw/main/classroom_nothing_room.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();
            });
            // controls.addEventListener("lock", function () { });
            // controls.addEventListener("unlock", function () { });
     
            // キーボードのキーを押したの際の処理
            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;
              }
            });
            
            const geometry = new THREE.SphereGeometry();
            const material = new THREE.MeshBasicMaterial({color: 0xffff00});
            // const material = new THREE.MeshBasicMaterial();
            // material.color = 0xffff00;
            const mesh = new THREE.Mesh( geometry,material);
            scene.add(mesh);
            console.log(mesh);
            
            // レンダラーの作成
            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("dbclick", OnClick);
     
          // クリックしたら呼ばれる
             function OnClick(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);
               // 交わるオブジェクトが1個以上の場合
               if (intersects.length > 0) {
                 if (intersects[0].object.name == "classroom_nothing_room_2") {
                    window.open("https://www.yatex.org/gitbucket/j2311/about-Leaflet/pages/hello-template.html");
                    }
                 console.log(intersects[0]);
               }
             }
     
          // 関数の実行
          init();
          animate();
        </script>
      </body>
    </html>