Newer
Older
2024-Tsubasa / system / test / object_from_csv.html
@Tsubasa Tsubasa on 24 Dec 2023 6 KB add
<!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";
      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 controls;

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

        //ライトの作成
        const light = new THREE.PointLight(0xffffff, 1, 100);
        light.position.set(52, 10, -53);
        light.position.set(52, 44, -44)
        scene.add(light);
        light.castShadow = true;
        console.log(light);

        function update() {
          light.position.copy(camera.position);
        }

        // 補助線
        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);

        // カメラコントロールの作成
        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;
          }
        });

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

        // csv読み込み
        fetch("../csv/getCSV.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);
          });
        }

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

      // カメラの移動設定
      function updateCameraPosition() {
        const speed = 10; // 移動速度
        const direction = new THREE.Vector3();
        const { x, y, z } = controls.getObject().position;
        console.log(x, y, z);
        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();
        // update();
        if (mixer) mixer.update(clock.getDelta());
        renderer.render(scene, camera);
      }

      //   // クリックしたら呼ばれる
      //   function OnClick(event) {
      //     event.preventDefault();
      //     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 == "球") {
      //         window.open("https://openai.com/blog/chatgpt");
      //       }
      //       console.log(intersects[0]);
      //     }
      //   }

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