Newer
Older
Three.js / test / pointer_test.html
@tsubasa tsubasa on 16 May 2023 5 KB add:file
<!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;

      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":
              moveForward = true;
              break;
            case "s":
              moveBackward = true;
              break;
            case "a":
              moveLeft = true;
              break;
            case "d":
              moveRight = true;
              break;
          }
        });

        document.addEventListener("keyup", function (event) {
          switch (event.key) {
            case "w":
              moveForward = false;
              break;
            case "s":
              moveBackward = false;
              break;
            case "a":
              moveLeft = false;
              break;
            case "d":
              moveRight = false;
              break;
          }
        });
        //レンダラー
        renderer = new THREE.WebGLRenderer({
          alpha: true,
          antialias: true,
        });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.physicallyCorrectLight = true;

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

        loader.load("../3Dmodel/tohokukoeki_univ.glb", function (gltf) {
          model = gltf.scene;
          scene.add(model);
        });
        loader.load("../3Dmodel/ball.glb", function (gltf) {
          model = gltf.scene;
          scene.add(model);
          model.position.set(0, -10, 0);
        });

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

      const mouse = new THREE.Vector2();

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

      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 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;

        console.log(mouse.x);
        // 光線を発射
        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]);
        }
      }
    </script>
  </body>
</html>


背景
その研究テーマに決めて理由やその研究を行う意義
目的
研究で解決したいこと、研究のゴール
研究手法
結果・考察
今後の展望
参考文献

使うもの
videotexture
soundlistener
cannon.js 

animation