three.js同时使用相同建模时通过clone来克隆建模

文章介绍了如何在Three.js中使用LoadingManager、MTLLoader和OBJLoader异步加载3D模型,并演示了关键的模型克隆代码,以便减少加载次数并管理3D对象的命名和属性。
摘要由CSDN通过智能技术生成
        let loadObjmore = new THREE.Object3D();
        let loadingManager = new THREE.LoadingManager();
        let mtlLoaderMiddleTen = new MTLLoader();
        let loaderMiddleTen = new OBJLoader(loadingManager);
mtlLoaderMiddleTen.load('/static/服务器(3).mtl', (materials) => {
              materials.preload();
              loaderMiddleTen.setMaterials(materials);
              // 加载 OBJ 模型
              loaderMiddleTen.load('/static/服务器(3).obj', (object) => {
                  for (let z = 0; z < 5; z++) {
                    const clonedObject = object.clone(); //最重要的一个复制相同的建模,这样子就刻意少加载
                    // 加载成功后,你可以在这里对模型进行操作
                    clonedObject.position.set(-0.2, (z + 1) * 2, -1); // 将模型放置在(10, , )的位置
                    clonedObject.traverse((child) => {
                      console.log('123123', child)
                      if (child instanceof THREE.Mesh) {
                        child.name = '机柜' +z //命名需要不重复唯一,这样子就不会出现拆分的时候拆不了的问题
                        child.userData = {
                          names: '服务器',
                          value: z,
                          params: 222,
                          totalRobte: 112,
                          x:-0.2,
                          y:(z + 1) * 2,
                          z:-1
                          // colors: child.material.clone(object) //用来恢复高亮恢复原来材质
                        };

                      }
                      //写入模型
                      if (child.isMesh && child.material) {
                        modelMaterialList.push(child)
                        that.glowMaterialList = modelMaterialList.map(v=>v.name)
                      }
                    });
                    // scene.add(object);
                    loadObjmore.add(clonedObject); // 将模型添加到容器中
                  }

                },
                // (xhr) => {
                //   console.log(`${modelInfo.name} 已加载: ${Math.floor((xhr.loaded / xhr.total) * 100)}%`);
                // },
                // (error) => {
                //   console.error(`加载 ${modelInfo.name} 时发生错误:${error}`);
                // }
              );
            },
            // (xhr) => {
            //   console.log(`加载 ${modelInfo.name} 的材质: ${Math.floor((xhr.loaded / xhr.total) * 100)}%`);
            // },
            // (error) => {
            //   console.error(`加载 ${modelInfo.name} 的材质时发生错误:${error}`);
            // }
          );

克隆最关键的一个代码。

在Vue中使用Three.js将鱼眼图变为全景图,需要经过以下步骤: 1.导入Three.js库和相关组件。 ``` import * as THREE from 'three' import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' import { FishEyeShader } from 'three/examples/jsm/shaders/FishEyeShader' ``` 2.创建一个Three.js场景和相机。 ``` let scene = new THREE.Scene() let camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) camera.position.set(0, 0, 0) scene.add(camera) ``` 3.创建一个立方体纹理,并将其放入一个立方体几何模型中。 ``` let image = new THREE.TextureLoader().load('path/to/fisheye-image.jpg') let materialArray = [ new THREE.MeshBasicMaterial({map: image}), new THREE.MeshBasicMaterial({map: image}), new THREE.MeshBasicMaterial({map: image}), new THREE.MeshBasicMaterial({map: image}), new THREE.MeshBasicMaterial({map: image}), new THREE.MeshBasicMaterial({map: image}) ] let skyGeometry = new THREE.BoxGeometry(1000, 1000, 1000) let sky = new THREE.Mesh(skyGeometry, materialArray) sky.material.side = THREE.BackSide scene.add(sky) ``` 4.创建一个渲染器,并将其添加到Vue组件中。 ``` let renderer = new THREE.WebGLRenderer() renderer.setSize(window.innerWidth, window.innerHeight) let container = document.getElementById('container') container.appendChild(renderer.domElement) ``` 5.创建一个FishEye着色器,并将其应用于场景中的立方体模型。 ``` let fishEyeShader = FishEyeShader let fishEyeUniforms = THREE.UniformsUtils.clone(fishEyeShader.uniforms) fishEyeUniforms['strength'].value = 0.5 let fishEyeMaterial = new THREE.ShaderMaterial({ uniforms: fishEyeUniforms, vertexShader: fishEyeShader.vertexShader, fragmentShader: fishEyeShader.fragmentShader }) sky.material = fishEyeMaterial ``` 6.使用OrbitControls控件来控制相机的旋转。 ``` let controls = new OrbitControls(camera, renderer.domElement) controls.enableDamping = true controls.dampingFactor = 0.05 controls.rotateSpeed = 0.5 controls.update() ``` 7.在Vue组件的mounted生命周期钩子函数中,调用渲染器的render()方法来渲染场景。 ``` mounted() { this.animate() }, methods: { animate() { requestAnimationFrame(this.animate) this.renderer.render(this.scene, this.camera) } } ``` 完成以上步骤后,你就可以在Vue中使用Three.js将鱼眼图变为全景图了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值