ThreeJs场景、相机、渲染器、添加obj模型和删除模型

相机

效果图

 1.安装threeJs

npm install three

 2.安装加载obj和mtl文件的插件

npm i --save three-obj-mtl-loader

3.安装轨道控件插件

npm install three-orbit-controls

4.引入

// threeJs
import * as THREE from "three";
// 轨道控件插件
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
//obj
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader";
//mtl
import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader";

5.变量

      // 场景
      scene: "",
      // 控制器
      controls: '',
      // 相机
      camera: "",
      // 渲染
      renderer: "",

6.加载模型

 /**加载模型 */
    loadPlant() {
      let that = this;

      let objLoader = new OBJLoader();
      let mtlLoader = new MTLLoader();
      mtlLoader.load('static/model/0112/red.mtl', function (materials) {
        materials.preload();
        objLoader.setMaterials(materials);
        objLoader.load('static/model/0112/red.obj', function (obj) {
          // console.log(obj.children[0]);
          obj.scale.set(1, 1, 1);
          // obj.children[0].receiveShadow = true;//允许接收阴影
          // obj.children[0].geometry.center(); //网格模型的几何体居中
          that.scene.add(obj);
          that.object = obj;
          // console.log(that.scene, "that.scene");
        },
          function (xhr) {
            console.log((xhr.loaded / xhr.total) * 100 + "% loaded");
          },
          function (error) {
            console.log(error, "An error happened");
          }
        );
      }
      );

    },

7.场景

 initScene() {
      this.scene = new THREE.Scene();
      // const ambientLight = new THREE.AmbientLight(0xcccccc, 0.4);
      // this.scene.add(ambientLight);
      var axesHelper = new THREE.AxesHelper(15);
      this.scene.add(axesHelper);
    },

8.相机+灯光

initCamera() {
      const aspect = window.innerWidth / innerHeight; //宽高可根据实际项目要求更改 如果是窗口高度改为innerHeight
      // this.camera = new THREE.PerspectiveCamera(45, aspect, 1, 2000);
      this.camera = new THREE.PerspectiveCamera(45, aspect, 1, 2000);
      // this.camera.position.set(100, 100, 100);
      this.camera.position.set(100, 100, 200);
      this.camera.name = "相机";
      this.camera.lookAt(this.scene.position); //设置相机方向(指向的场景对象)

      var directionalLight = new THREE.DirectionalLight(0xffffff, 1.5) //方向光
      directionalLight.position.set(1000, 1000, 1000)
      directionalLight.castShadow = true;
      directionalLight.shadow.camera.near = 0.5;
      directionalLight.shadow.camera.far = 300;
      directionalLight.shadow.camera.left = -50;
      directionalLight.shadow.camera.right = 50;
      directionalLight.shadow.camera.top = 200;
      directionalLight.shadow.camera.bottom = -100;
      this.scene.add(directionalLight)

     
    },

9.控制器

initOrbitControls() {
      let controls = new OrbitControls(this.camera, this.renderer.domElement);
      this.controls = controls;
    },

10.渲染器

 initRenderer() {
      this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
      // 渲染器Renderer开启阴影计算
      this.renderer.setPixelRatio(window.devicePixelRatio);
      this.renderer.setSize(window.innerWidth, innerHeight);
      this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
      this.container = document.getElementById("container");
      this.container.appendChild(this.renderer.domElement);
     
    },

11动画

 animate() {
      //执行渲染操作
      this.renderer.render(this.scene, this.camera);
      this.requestId = requestAnimationFrame(this.animate);
    },

12.初始化

 init() {
      this.initScene();
      this.initCamera();
      this.initRenderer();
      this.initOrbitControls();
    },

13.mounted调用

 mounted() {
    this.loadPlant();
    this.init();
    this.animate();

  },

如果模型加载不出来看看是否是以下原因

1.引用的路径有没有问题

2.是不是没有把模型放在静态目录下 我这里放在public目录下static下面

3.是不是模型太大了或者太小了 调整一下模型大小

4.mtl文件中的Tr值置为0或者将此行删除,Tr值是透明度的意思

14.删除模型

 // 删除
    del() {
      // this.scene.children[2]是模型
      this.deleteObject(this.scene.children[2])
      this.animate()
    },
    deleteObject(group) {
      if (group) {
        group.traverse(function (item) {
          if (item instanceof THREE.Mesh) {
            if (Array.isArray(item.material)) {
              item.material.forEach(a => {
                a.dispose()
              })
            } else {
              item.material.dispose() // 删除材质
            }
            item.geometry.dispose() // 删除几何体
          }
          item = null
        })
        // 删除场景对象scene的子对象group
        this.scene.remove(group);
      }

    },

全部代码

<template>
  <div id="app">
    <div class="center">
      <button @click="del">删除</button>
      <div id="container" ref="container"></div>
      <canvas id="canvas" style="display: none">你的浏览器不支持canvas</canvas>
    </div>
  </div>
</template>

<script>

import * as THREE from "three";
// 轨道控件插件
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader";
import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader";

export default {
  data() {
    return {
      // 场景
      scene: "",
      // 控制器
      controls: '',
      // 相机
      camera: "",
      // 渲染
      renderer: "",

    };
  },
  methods: {
    // 删除
    del() {
      // this.scene.children[2]是模型
      this.deleteObject(this.scene.children[2])
      this.animate()
    },
    deleteObject(group) {
      if (group) {
        group.traverse(function (item) {
          if (item instanceof THREE.Mesh) {
            if (Array.isArray(item.material)) {
              item.material.forEach(a => {
                a.dispose()
              })
            } else {
              item.material.dispose() // 删除材质
            }
            item.geometry.dispose() // 删除几何体
          }
          item = null
        })
        // 删除场景对象scene的子对象group
        this.scene.remove(group);
      }

    },
    /**初始化 */
    initScene() {
      this.scene = new THREE.Scene();
      // const ambientLight = new THREE.AmbientLight(0xcccccc, 0.4);
      // this.scene.add(ambientLight);
      var axesHelper = new THREE.AxesHelper(15);
      this.scene.add(axesHelper);
    },
    initCamera() {
      const aspect = window.innerWidth / innerHeight; //宽高可根据实际项目要求更改 如果是窗口高度改为innerHeight
      // this.camera = new THREE.PerspectiveCamera(45, aspect, 1, 2000);
      this.camera = new THREE.PerspectiveCamera(45, aspect, 1, 2000);
      // this.camera.position.set(100, 100, 100);
      this.camera.position.set(100, 100, 200);
      this.camera.name = "相机";
      this.camera.lookAt(this.scene.position); //设置相机方向(指向的场景对象)

      var directionalLight = new THREE.DirectionalLight(0xffffff, 1.5) //方向光
      directionalLight.position.set(1000, 1000, 1000)
      directionalLight.castShadow = true;
      directionalLight.shadow.camera.near = 0.5;
      directionalLight.shadow.camera.far = 300;
      directionalLight.shadow.camera.left = -50;
      directionalLight.shadow.camera.right = 50;
      directionalLight.shadow.camera.top = 200;
      directionalLight.shadow.camera.bottom = -100;
      this.scene.add(directionalLight)


    },
    initRenderer() {
      this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
      // 渲染器Renderer开启阴影计算
      this.renderer.setPixelRatio(window.devicePixelRatio);
      this.renderer.setSize(window.innerWidth, innerHeight);
      this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
      this.container = document.getElementById("container");
      this.container.appendChild(this.renderer.domElement);

    },
    // 初始化控制器
    initOrbitControls() {
      let controls = new OrbitControls(this.camera, this.renderer.domElement);
      this.controls = controls;
    },
    animate() {
      //执行渲染操作
      this.renderer.render(this.scene, this.camera);
      this.requestId = requestAnimationFrame(this.animate);
    },
    init() {
      this.initScene();
      this.initCamera();
      this.initRenderer();
      this.initOrbitControls();
    },
    /**加载模型 */
    loadPlant() {
      let that = this;

      let objLoader = new OBJLoader();
      let mtlLoader = new MTLLoader();
      mtlLoader.load('static/model/0112/red.mtl', function (materials) {
        materials.preload();
        objLoader.setMaterials(materials);
        objLoader.load('static/model/0112/red.obj', function (obj) {
          // console.log(obj.children[0]);
          obj.scale.set(1, 1, 1);
          // obj.children[0].receiveShadow = true;//允许接收阴影
          // obj.children[0].geometry.center(); //网格模型的几何体居中
          that.scene.add(obj);
          that.object = obj;
          // console.log(that.scene, "that.scene");
        },
          function (xhr) {
            // console.log((xhr.loaded / xhr.total) * 100 + "% loaded");
          },
          function (error) {
            console.log(error, "An error happened");
          }
        );
      }
      );

    },



  },

  mounted() {
    this.loadPlant();
    this.init();
    this.animate();

  },
};
</script>
<style lang="less">
</style>

效果如下

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值