<!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> <link rel="stylesheet" href="css/dot.css" type="text/css"> </head> <body> <div id="WebGL-output"> <div class="point"></div> </div> <!-- <div class="cross"> <div class="line horizontal-line"></div> <div class="line vertical-line"></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"; 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 moveUp = false; let moveDown = false; let controls; let video; let positionalAudio; 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(0, 1.5, 0); // カメラの位置 camera.lookAt(new THREE.Vector3(0, 0, -10)); //ライトの作成 const light = new THREE.SpotLight(0xffffff, 1.0); light.position.set(100, 500, 500); scene.add(light); light.castShadow = true; console.log(light); // 補助線 const axesHelper = new THREE.AxesHelper(500); 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(); // 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.physicallyCorrectLight = true; // csv読み込み fetch("csv/tenjikaijo.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); }); } // videotexture video = document.createElement("video"); video.src = "video/sea.mp4"; video.autoplay = true; video.loop = true; video.muted = true; video.load(); video.pause(); const texture = new THREE.VideoTexture(video); // // 動画の表示されているオブジェクトをなめらかにする。 // texture.minFilter = THREE.LinearFilter; // texture.magFilter = THREE.LinearFilter; // texture.wrapS = THREE.ClampToEdgeWrapping; // texture.wrapT = THREE.ClampToEdgeWrapping; // // ------------------------------------------------ const material = new THREE.MeshBasicMaterial({ map: texture }); const geometry = new THREE.PlaneGeometry(12, 8); const mesh = new THREE.Mesh(geometry, material); mesh.name = "video1"; mesh.position.set(0, 5, 0); // scene.add(mesh); // audio const listener = new THREE.AudioListener(); //位置音響を作成するのに必要 camera.add(listener); const audioLoader = new THREE.AudioLoader(); //mp3ファイルのロードインスタンス positionalAudio = new THREE.PositionalAudio(listener); //位置音響オブジェクトが作成、AudioListenerと連携 audioLoader.load("mp3/sea.mp3", function (buffer) { positionalAudio.setBuffer(buffer); //読み込まれたオーディオバッファを位置音響オブジェクトに設定 positionalAudio.setRefDistance(100); positionalAudio.pause(); // positionalAudio.setLoop(true); }); mesh.add(positionalAudio); // 画面の大きさが変更されたときに動的に修正 function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); } window.addEventListener('resize', onWindowResize); document .getElementById("WebGL-output") .appendChild(renderer.domElement); } function animate() { requestAnimationFrame(animate); updateCameraPosition(); if (mixer) mixer.update(clock.getDelta()); renderer.render(scene, camera); } function updateCameraPosition() { const speed = 0.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; } // 再生の切り替え let flag = false; function clickStartStop() { if (flag == false) { video.pause(); positionalAudio.pause(); flag = true; } else { video.play(); positionalAudio.play(); flag = false; } } document.addEventListener("click", OnClick); const mouse = new THREE.Vector2(); // クリックしたら呼ばれる function OnClick(event) { event.preventDefault(); 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 == "video1") { clickStartStop(); } console.log(intersects[0]); } } // 関数の実行 init(); animate(); </script> </body> </html>