Newer
Older
2024-Tsubasa / system / test / clickEventCameraCenter_test.html
@Tsubasa Tsubasa on 31 Oct 2023 5 KB add:system 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>
    <link rel="stylesheet" href="css/mouse.css" />
    <!-- <script src="../js/mouse.js"></script> -->
  </head>

  <body>
    <div id="WebGL-output"></div>
    <div id="fixed-point"></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, 0, 0));

  // カメラコントローラー
  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;

  //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(3, 3, 18);
  });

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

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

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 = 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 == "球") {
      window.open("https://www.yatex.org/gitbucket/");
    }
    console.log(intersects[0]);
  }
}

    </script>
  </body>
</html>