0
点赞
收藏
分享

微信扫一扫

Three.js导入OBJ文件实现3D模型转动改变颜色

Three.js导入OBJ文件实现3D模型转动改变颜色_关闭按钮


three.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>

举报

相关推荐

0 条评论