Newer
Older
about-Leaflet / school+avater.html
<!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, scene, renderer, controls;
        let moveForward = false, moveBackward = false, moveLeft = false, moveRight = false;
        let bChanLoaded = false;
        let classroomModel, blackboardModel, bchanModel;

        function init() {
            scene = new THREE.Scene();
            scene.background = new THREE.Color(0xffffff);

            camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.set(1, 5, 5);
            camera.lookAt(new THREE.Vector3(0, 0, 0));

            const light = new THREE.SpotLight(0xffffff, 1.0);
            light.position.set(100, 500, 500);
            scene.add(light);
            light.castShadow = true;

            const loader = new GLTFLoader();
            loader.load('https://www.yatex.org/gitbucket/j2311/about-Leaflet/raw/main/class_room_final.glb', (gltf) => {
                classroomModel = gltf.scene;
                scene.add(classroomModel);
            });

            loader.load('https://www.yatex.org/gitbucket/j2311/about-Leaflet/raw/main/black board.glb', (gltf) => {
                blackboardModel = gltf.scene;
                scene.add(blackboardModel);
            });

            loader.load('https://www.yatex.org/gitbucket/j2311/about-Leaflet/raw/main/B-chan.glb', (gltf) => {
                bchanModel = gltf.scene;
                scene.add(bchanModel);
                bChanLoaded = true;
            });

            controls = new PointerLockControls(camera, document.body);
            document.addEventListener("click", () => controls.lock());

            document.addEventListener("keydown", handleKeyDown);
            document.addEventListener("keyup", handleKeyUp);

            renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.getElementById("WebGL-output").appendChild(renderer.domElement);
        }

        function handleKeyDown(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;
            }
        }

        function handleBChanMovement(event) {
            switch (event.key) {
                case "g":
                    if (bChanLoaded) {
                        bchanModel.position.z -= 0.5;
                    }
                    break;
                case "b":
                    if (bChanLoaded) {
                        bchanModel.position.z += 0.5;
                    }
                    break;
                case "f":
                    if (bChanLoaded) {
                        bchanModel.position.x -= 0.5;
                    }
                    break;
                case "h":
                    if (bChanLoaded) {
                        bchanModel.position.x += 0.5;
                    }
                    break;
            }
        }

        function handleKeyUp(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;
            }
        }

        function updateCameraPosition() {
            const speed = 5;
            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 animate() {
            requestAnimationFrame(animate);
            updateCameraPosition();
            renderer.render(scene, camera);
        }

        document.addEventListener("dblclick", (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;
            raycaster.setFromCamera(mouse, camera);
            const intersects = raycaster.intersectObjects(scene.children, true);
            if (intersects.length > 0 && intersects[0].object.name === "blackboard_main") {
                window.open("https://www.yatex.org/gitbucket/j2311/about-Leaflet/pages/HELPLIST-web.html");
            }
        });

        init();
        animate();
    </script>
</body>
</html>