Newer
Older
2024-Tsubasa / system / test / texture_test.html
@Tsubasa Tsubasa on 11 Jan 2024 5 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 class="point"></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";

    let camera;
    let scene;
    let renderer;
    let moveForward = false;
    let moveBackward = false;
    let moveLeft = false;
    let moveRight = false;
    let moveUp = false;
    let moveDown = 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(10, 50, 50); // カメラの位置
      camera.lookAt(new THREE.Vector3(0, 5, 0));

      // // 補助線
      // const axesHelper = new THREE.AxesHelper(500);
      // scene.add(axesHelper);
      // const gridHelper = new THREE.GridHelper(1, 1);
      // scene.add(gridHelper);
      // const lightHelper = new THREE.SpotLightHelper(light);
      // scene.add(lightHelper);

      // カメラコントロールの作成
      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.shadowMap.enabled = true;
      renderer.shadowMap.type = THREE.PCFSoftShadowMap;

      // cubeTextureLoader
      const geometry = new THREE.BoxGeometry(25, 25 * Math.sqrt(2), 0.1);
      const loadPhoto = new THREE.TextureLoader().load(
        "../texture_photo/resumeP1.png"
        // "../../resume/figure/threeJsSystem_ja.pdf"
      );
      let material = new THREE.MeshBasicMaterial({
        map: loadPhoto,
      });
      const mesh = new THREE.Mesh(geometry, material);
      mesh.castShadow = true;
      scene.add(mesh);

      // オブジェクトの追加
      const geometry1 = new THREE.BoxGeometry(1000, 1, 1000);
      const material1 = new THREE.MeshStandardMaterial({ color: 0x734e30 });
      const mesh1 = new THREE.Mesh(geometry1, material1);
      mesh1.position.set(0, -25, 0);
      mesh1.receiveShadow = true;  // 影を受け付ける
      scene.add(mesh1);

      const SpotlLight = new THREE.SpotLight(0xffffff, 2);
      SpotlLight.position.set(100, 100, 100);
      SpotlLight.castShadow = true;  // 影を生成する
      scene.add(SpotlLight);

      SpotlLight.shadow.mapSize.width = 2048;
      SpotlLight.shadow.mapSize.height = 2048;

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

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

    function updateCameraPosition() {
      const speed = 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;
    }

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

</html>