Newer
Older
2024-Tsubasa / system / system.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>
  <link rel="stylesheet" href="css/dot.css" type="text/css">
</head>

<body>
  <div id="WebGL-output">
    <div class="point"></div>
  </div>
  <!-- <div class="cross">
      <div class="line horizontal-line"></div>
      <div class="line vertical-line"></div>
    </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";
    import { FBXLoader } from "https://unpkg.com/three@0.126.1/examples/jsm/loaders/FBXLoader.js";

    let camera;
    let scene;
    let renderer;
    let model;
    let mixer;
    let clock;
    let moveForward = false;
    let moveBackward = false;
    let moveLeft = false;
    let moveRight = false;
    let moveUp = false;
    let moveDown = false;
    let controls;
    let video;
    let positionalAudio;

    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(0, 1.5, 0); // カメラの位置
      camera.lookAt(new THREE.Vector3(0, 0, -10));

      //ライトの作成
      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);
      scene.add(axesHelper);
      const gridHelper = new THREE.GridHelper(1, 1);
      scene.add(gridHelper);

      // カメラコントロールの作成
      controls = new PointerLockControls(camera, document.body);
      document.addEventListener("click", function () {
        controls.lock();
        // fAudio();
      });
      // 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;
          case "e":
            moveUp = true;
            break;
          case "q":
            moveDown = 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;
          case "e":
            moveUp = false;
            break;
          case "q":
            moveDown = false;
            break;
        }
      });

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

      // csv読み込み
      fetch("csv/tenjikaijo.csv")
        .then((response) => {
          return response.text();
        })
        .then((data) => {
          let result = data.split(/\r?\n|\r/).map((e) => {
            return e.split(",");
          });
          // console.log(result);
          for (let i = 1; i < result.length; i++) {
            let arr = result[i];
            // console.log(arr[0], arr[1], arr[2], arr[3])
            glbLoader(arr[0], arr[1], arr[2], arr[3])
          }
        })
        .catch((error) => {
          console.log(error);
        });

      // glTFの読み込み関数
      function glbLoader(filePath, x, y, z) {
        const gloader = new GLTFLoader();
        gloader.load(filePath, function (gltf) {
          model = gltf.scene;
          model.position.set(x, y, z);
          scene.add(model);
        });
      }

      // videotexture
      video = document.createElement("video");
      video.src = "video/sea.mp4";
      video.autoplay = true;
      video.loop = true;
      video.muted = true;
      video.load();
      video.pause();
      const texture = new THREE.VideoTexture(video);
      // // 動画の表示されているオブジェクトをなめらかにする。
      // texture.minFilter = THREE.LinearFilter;
      // texture.magFilter = THREE.LinearFilter;
      // texture.wrapS = THREE.ClampToEdgeWrapping;
      // texture.wrapT = THREE.ClampToEdgeWrapping;
      // // ------------------------------------------------
      const material = new THREE.MeshBasicMaterial({ map: texture });
      const geometry = new THREE.PlaneGeometry(12, 8);
      const mesh = new THREE.Mesh(geometry, material);
      mesh.name = "video1";
      mesh.position.set(0, 5, 0);
      // scene.add(mesh);

      // audio
      const listener = new THREE.AudioListener(); //位置音響を作成するのに必要
      camera.add(listener);
      const audioLoader = new THREE.AudioLoader(); //mp3ファイルのロードインスタンス
      positionalAudio = new THREE.PositionalAudio(listener); //位置音響オブジェクトが作成、AudioListenerと連携
      audioLoader.load("mp3/sea.mp3", function (buffer) {
        positionalAudio.setBuffer(buffer); //読み込まれたオーディオバッファを位置音響オブジェクトに設定
        positionalAudio.setRefDistance(100);
        positionalAudio.pause();
        // positionalAudio.setLoop(true);
      });
      mesh.add(positionalAudio);
      
      // 画面の大きさが変更されたときに動的に修正
      function onWindowResize() {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        }
      window.addEventListener('resize', onWindowResize);

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

    function animate() {
      requestAnimationFrame(animate);
      updateCameraPosition();
      if (mixer) mixer.update(clock.getDelta());
      renderer.render(scene, camera);
    }

    
    

    function updateCameraPosition() {
      const speed = 0.1; // 移動速度
      //.moveForward(Number) で前、.moveRightで右に
      if (moveForward) controls.moveForward(speed);
      if (moveBackward) controls.moveForward(-speed);
      if (moveRight) controls.moveRight(speed);
      if (moveLeft) controls.moveRight(-speed);
      //getObject()で直接カメラの操作
      //controls.getObject()の時点でカメラのプロパティに切り替わる
      if (moveUp) controls.getObject().position.y += speed;
      if (moveDown) controls.getObject().position.y -= speed;
    }

    // 再生の切り替え
    let flag = false;
    function clickStartStop() {
      if (flag == false) {
        video.pause();
        positionalAudio.pause();
        flag = true;
      } else {
        video.play();
        positionalAudio.play();
        flag = false;
      }
    }

    document.addEventListener("click", OnClick);

    const mouse = new THREE.Vector2();

    // クリックしたら呼ばれる
    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 == "video1") {
          clickStartStop();
        }
        console.log(intersects[0]);
      }
    }

    // 関数の実行
    init();
    animate();
  </script>
</body>

</html>