Newer
Older
2024-Tsubasa / system / test / clickEvent_test.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>
    <link rel="stylesheet" href="../css/mouse.css" />
    <script src="../js/mouse.js"></script>
  </head>

  <body>
    <div id="WebGL-output"></div>
    <div class="mouse"></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;

      init();
      animate();

      function init() {
        //シーンの作成
        scene = new THREE.Scene();
        scene.background = new THREE.Color(0x111111); // 背景色

        //カメラの作成
        camera = new THREE.PerspectiveCamera(
          45,
          window.innerWidth / window.innerHeight,
          0.1,
          1000
        );
        //カメラセット
        camera.position.set(8, 8, 50); // カメラの位置
        camera.lookAt(new THREE.Vector3(0, 5, 0));

        // // 補助線
        // const axesHelper = new THREE.AxesHelper(100);
        // scene.add(axesHelper);
        // const gridHelper = new THREE.GridHelper(50, 50);
        // scene.add(gridHelper);

        // カメラコントローラー
        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 dirLight = new THREE.SpotLight(0xffffff,1.2);//color,強度
        // dirLight.position.set(10, 10, 20); // 光源の位置
        // scene.add(dirLight);

        //レンダラー
        renderer = new THREE.WebGLRenderer({
          alpha: true,
          antialias: true,
        });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.physicallyCorrectLight = true;

        //glbファイルの読み込み
        const loader = new GLTFLoader();

        loader.load("../model/tohokukoeki_univ.glb", function (gltf) {
          model = gltf.scene;
          model.traverse((object) => {
            //モデルの構成要素
            if (object.isMesh) {
              //その構成要素がメッシュだったら
              object.material.trasparent = true; //透明許可
              object.material.opacity = 0.8; //透過
            }
          });
          scene.add(model);
        });
        loader.load("../model/ball.glb", function (gltf) {
          model = gltf.scene;
          scene.add(model);
          model.position.set(0, -10, 0);
        });

        document
          .getElementById("WebGL-output")
          .appendChild(renderer.domElement);

          // ウィンドウのリサイズ時の処理
        window.addEventListener("resize", onWindowResize);
      }

      const mouse = new THREE.Vector2();

      function animate() {
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
        updateCameraPosition();
      }

      function updateCameraPosition() {
        const speed = 1; // 移動速度
        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 onWindowResize() {
        // 画面サイズの更新
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
      }

      // クリックイベント
      document.addEventListener("click", OnClick, false);

      // クリックしたら呼ばれる
      function OnClick(event) {
        const raycaster = new THREE.Raycaster();
        const mouse = new THREE.Vector2();

        // マウスポインタの位置情報の取得
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
      
        // 光線を発射
        raycaster.setFromCamera(mouse, camera);
        // 光線と交わるオブジェクトを収集
        const intersects = raycaster.intersectObjects(scene.children, true);

        // 交わるオブジェクトが1個以上の場合
        if (intersects.length > 0) {
          if (intersects[0].object.name == "球") {
            location.href = "https://www.yatex.org/gitbucket/";
          }
          console.log(intersects[0]);
        }
      }
    </script>
  </body>
</html>