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