总结下最近新学知识结果!

首先我们需要先下载 Three.js + OBJLoader.js + OrbitControls.js 这三个库才能正常编写代码!

话不多说,直接上代码

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>three.js示例</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>

<body>
    <script src="../pip/three.min.js"></script> <!-- 引入Three.js库 -->
    <script src="../pip/OBJLoader.js"></script> <!-- 引入OBJLoader.js -->
    <script src="../pip/OrbitControls.js"></script> <!-- 引入OrbitControls.js -->
    <script>
        var scene = new THREE.Scene(); // 创建场景对象
        var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); // 创建透视相机对象
        camera.position.set(0, 10, 10); // 设置相机位置
        camera.lookAt(0, 0, 0); // 设置相机视点
        camera.up.set(0, 1, 0); // 设置相机的上方向

        var renderer = new THREE.WebGLRenderer(); // 创建WebGL渲染器对象
        renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器大小
        document.body.appendChild(renderer.domElement); // 将渲染器添加到DOM元素中

        var ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 创建环境光对象
        scene.add(ambientLight); // 将环境光添加到场景中

        var pointLight = new THREE.PointLight(0xffffff, 0.5, 100); // 创建点光源对象
        pointLight.position.set(0, 10, 10); // 设置点光源位置
        scene.add(pointLight); // 将点光源添加到场景中

        var loader = new THREE.OBJLoader(); // 创建OBJLoader对象

        loader.load(
            "../pip/fangjian1.obj", // 模型文件相对于当前目录的路径

            function (object) {
                object.traverse(function (child) {
                    if (child instanceof THREE.Mesh) {
                        child.geometry.computeVertexNormals();
                    }
                });
                scene.add(object); // 将加载的OBJ模型添加到场景中
                object.position.z = -20; // 设置模型位置
            },

            function (xhr) {
                console.log((xhr.loaded / xhr.total) * 100 + "% 已加载"); // 输出加载进度
            },

            function (error) {
                console.log("发生错误"); // 输出错误信息
            }
        );

        var controls = new THREE.OrbitControls(camera, renderer.domElement); // 创建OrbitControls控制器对象
        controls.target.set(0, 0, 0); // 设置控制器的焦点位置
        controls.update(); // 更新控制器

        // 添加鼠标点击事件监听器
        renderer.domElement.addEventListener('click', onCanvasClick, false);

        var colorPicker; // 用于保存颜色选择器的元素

        // 鼠标点击事件处理函数
        function onCanvasClick(event) {
            // 获取点击位置的屏幕坐标
            var mouse = new THREE.Vector2();
            mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
            mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

            // 创建射线投射器
            var raycaster = new THREE.Raycaster();
            raycaster.setFromCamera(mouse, camera);

            // 计算射线与场景中的物体的相交情况
            var intersects = raycaster.intersectObjects(scene.children, true);

            // 如果有物体被点击到,则弹出颜色选择器
            if (intersects.length > 0) {
                var selectedObject = intersects[0].object;

                // 关闭之前打开的颜色选择器
                closeColorPicker();

                // 创建颜色选择器
                createColorPicker(event.clientX, event.clientY, selectedObject);
            } else {
                // 点击其他地方关闭颜色选择器
                closeColorPicker();
            }
        }

        // 创建颜色选择器函数
        function createColorPicker(x, y, object) {
            // 添加颜色选择器,并设置其位置为鼠标点击的位置
            colorPicker = document.createElement('input');
            colorPicker.type = 'color';
            colorPicker.id = 'color-picker';
            colorPicker.style.position = 'absolute';
            colorPicker.style.left = x + 'px';
            colorPicker.style.top = y + 'px';
            document.body.appendChild(colorPicker);

            // 添加关闭按钮,并设置其位置为颜色选择器旁边
            var closeButton = document.createElement('button');
            closeButton.innerText = '×';
            closeButton.id = 'close-button';
            closeButton.style.position = 'absolute';
            closeButton.style.left = x + colorPicker.offsetWidth + 'px';
            closeButton.style.top = y + 'px';
            document.body.appendChild(closeButton);

            // 添加颜色变化事件监听器,以实时更新选中的颜色
            colorPicker.addEventListener('input', function () {
                // 获取选择器选择的颜色
                var selectedColor = colorPicker.value;

                // 将颜色应用到选中的物体上
                object.material.color.set(selectedColor);
            }, false);

            // 添加点击关闭按钮的事件监听器
            closeButton.addEventListener('click', function () {
                // 关闭颜色选择器
                closeColorPicker();
            }, false);
        }

        // 关闭颜色选择器函数
        function closeColorPicker() {
            if (colorPicker) {
                // 移除颜色选择器和关闭按钮
                document.body.removeChild(colorPicker);
                document.body.removeChild(document.getElementById('close-button'));
                colorPicker = null;
            }
        }

        function animate() {
            requestAnimationFrame(animate);
            renderer.render(scene, camera); // 渲染场景
        }

        animate(); // 开始执行动画
    </script>
</body>

</html>

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐