当前位置:   article > 正文

ThreeJs同一个场景多个相机的显示

ThreeJs同一个场景多个相机的显示

        在threeJs开发数字孪生中,我们正常是需要使用一个相机,画面显示的内容也就是这个相机拍摄到的内容,但是是否可以添加多个相机,可以同时从不同角度观察模型呢,实际上是可以的,不过多个相机的拍摄到的画面肯定需要在多个容器中显示,也就是需要创建多个渲染器,每个渲染器渲染对应的相机拍摄到的画面,下面是代码实现:

假设我们需要从前后左右四个角度查看,那么我们要先定义四个html标签,以便后期展示不同相机的画面:

  1. <div id="container1"></div>
  2. <div id="container2"></div>
  3. <div id="container3"></div>
  4. <div id="container4"></div>

其次需要定义四个相机,并设置在不同的观察角度:

  1. initCamera(){
  2. this.camera1 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
  3. this.camera1.position.set(1000,1000,1000);
  4. this.camera1.lookAt(0,0,0)
  5. this.camera2 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
  6. this.camera2.position.set(-1000,1000,-1000);
  7. this.camera2.lookAt(0,0,0)
  8. this.camera3 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
  9. this.camera3.position.set(-1000,1000,1000);
  10. this.camera3.lookAt(0,0,0)
  11. this.camera4 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
  12. this.camera4.position.set(1000,1000,-1000);
  13. this.camera4.lookAt(0,0,0)
  14. },

此时需要在场景中添加一个用于观察的模型:

  1. initModel(){
  2. const loader = new GLTFLoader()
  3. loader.load("/static/model/agv.gltf", (gltf) => {
  4. this.model = gltf.scene;
  5. scene.add(this.model) // 加入场景
  6. })
  7. },

再定义四个渲染器,用于分别渲染四个相机中的内容

  1. initRenderer(){
  2. this.renderer1 = new THREE.WebGLRenderer({ antialias: true });
  3. this.container1 = document.getElementById("container1")
  4. this.renderer1.setSize(this.container1.clientWidth, this.container1.clientHeight);
  5. this.renderer1.setClearColor('#FFFFFF', 1.0);
  6. this.container1.appendChild(this.renderer1.domElement);
  7. this.renderer2 = new THREE.WebGLRenderer({ antialias: true });
  8. this.container2 = document.getElementById("container2")
  9. this.renderer2.setSize(this.container2.clientWidth, this.container2.clientHeight);
  10. this.renderer2.setClearColor('#FFFFFF', 1.0);
  11. this.container2.appendChild(this.renderer2.domElement);
  12. this.renderer3 = new THREE.WebGLRenderer({ antialias: true });
  13. this.container3 = document.getElementById("container3")
  14. this.renderer3.setSize(this.container3.clientWidth, this.container3.clientHeight);
  15. this.renderer3.setClearColor('#FFFFFF', 1.0);
  16. this.container3.appendChild(this.renderer3.domElement);
  17. this.renderer4 = new THREE.WebGLRenderer({ antialias: true });
  18. this.container4 = document.getElementById("container4")
  19. this.renderer4.setSize(this.container4.clientWidth, this.container4.clientHeight);
  20. this.renderer4.setClearColor('#FFFFFF', 1.0);
  21. this.container4.appendChild(this.renderer4.domElement);
  22. },

最后为了证实为同一个模型,我们可以将这个模型设置旋转,并不断更新渲染器

  1. initAnimate() {
  2. if(this.model){
  3. this.model.rotation.y += 0.03;
  4. }
  5. requestAnimationFrame(this.initAnimate);
  6. this.renderer1.render(scene, this.camera1);
  7. this.renderer2.render(scene, this.camera2);
  8. this.renderer3.render(scene, this.camera3);
  9. this.renderer4.render(scene, this.camera4);
  10. },

最终就可以实现了;效果如下

四个相机通过四个角度观察模型

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/196847
推荐阅读
相关标签
  

闽ICP备14008679号