Newer
Older
2024-Tsubasa / system / test / texture_clickPageChange_test.html
@Tsubasa Tsubasa on 10 Dec 2023 7 KB addd
<!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>texture_clickPageChange</title>
</head>

<body>
    <div id="WebGL-output">
        <div class="point"></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";

        let camera;
        let scene;
        let renderer;
        let controls;
        let counter = 0;

        let moveForward = false;
        let moveBackward = false;
        let moveLeft = false;
        let moveRight = false;
        let moveUp = false;
        let moveDown = false;

        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(10, 50, 50); // カメラの位置
            camera.lookAt(new THREE.Vector3(0, 5, 0));

            //ライトの作成
            const light = new THREE.SpotLight(0xffffff, 1.0);
            light.position.set(100, 50, 50);
            scene.add(light);
            light.castShadow = true;
            console.log(light);

            // 補助
            const axesHelper = new THREE.AxesHelper(500); //x:red y:green z:blue
            scene.add(axesHelper);
            const gridHelper = new THREE.GridHelper(1, 1);
            scene.add(gridHelper);
            const lightHelper = new THREE.DirectionalLightHelper(light, 10);
            scene.add(lightHelper);

            // カメラコントロールの作成
            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 "j":
                        moveUp = true;
                        break;
                    case "k":
                        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 "j":
                        moveUp = false;
                        break;
                    case "k":
                        moveDown = false;
                        break;
                }
            });

            // レンダラーの作成
            renderer = new THREE.WebGLRenderer({
                alpha: true,
                antialias: true,
            });
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.physicallyCorrectLight = true;

            // cubeTextureLoader
            let resumePath = [
                '../texture_photo/image-1.png',
                '../texture_photo/image-2.png',
                '../texture_photo/image-3.png',
                '../texture_photo/image-4.png'
            ];
            console.log(resumePath.length);
            let count = page(counter, resumePath.length);
            console.log(counter);
            const geometry = new THREE.BoxGeometry(25, 25 * Math.sqrt(2), 0);
            const loadPhoto = new THREE.TextureLoader().load('../texture_photo/image-1.png');
            let material = new THREE.MeshBasicMaterial({
                map: loadPhoto
            });
            const mesh = new THREE.Mesh(geometry, material);
            mesh.name = "resume";
            scene.add(mesh);

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

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

        function updateCameraPosition() {
            const speed = 10; // 移動速度
            const direction = new THREE.Vector3();
            const { x, y, z } = controls.getObject().position;
            direction.x = Number(moveRight) - Number(moveLeft);
            direction.y = Number(moveUp) - Number(moveDown);
            direction.z = Number(moveForward) - Number(moveBackward);
            direction.normalize();
            const delta = speed * 0.1; // 移動距離
            controls.moveRight(direction.x * delta);
            controls.getObject().position.y += direction.y * delta;
            controls.moveForward(direction.z * delta);
            // console.log(controls.getObject());
        }   

        //作成関数はクリックしたらカウントされて、ページ数だけ割る。
        //例えば4pなら、配列.length % 4 にする。 結果が0のときは1pが表示される。
        function page(countclick, pageNum) {
            let locPage = countclick % pageNum;
        }

        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 == "resume") {
                    counter += 1;
                    // console.log(counter);
                }
                // console.log(intersects[0]);
            }
        }

        // 関数の実行
        init();
        animate();
    </script>
</body>

</html>