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

简介: 这篇文章讲解了如何在Three.js中实现多相机功能,通过创建和布置多个相机及渲染器,从而能够在同一场景中从不同角度观察3D模型。

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

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

  <div id="container1"></div>
  <div id="container2"></div>
  <div id="container3"></div>
  <div id="container4"></div>

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

initCamera(){
      this.camera1 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
      this.camera1.position.set(1000,1000,1000);
      this.camera1.lookAt(0,0,0)

      this.camera2 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
      this.camera2.position.set(-1000,1000,-1000);
      this.camera2.lookAt(0,0,0)

      this.camera3 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
      this.camera3.position.set(-1000,1000,1000);
      this.camera3.lookAt(0,0,0)

      this.camera4 = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
      this.camera4.position.set(1000,1000,-1000);
      this.camera4.lookAt(0,0,0)
    },

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

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

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

initRenderer(){
      this.renderer1 = new THREE.WebGLRenderer({ antialias: true });
      this.container1 = document.getElementById("container1")
      this.renderer1.setSize(this.container1.clientWidth, this.container1.clientHeight);
      this.renderer1.setClearColor('#FFFFFF', 1.0);
      this.container1.appendChild(this.renderer1.domElement);

      this.renderer2 = new THREE.WebGLRenderer({ antialias: true });
      this.container2 = document.getElementById("container2")
      this.renderer2.setSize(this.container2.clientWidth, this.container2.clientHeight);
      this.renderer2.setClearColor('#FFFFFF', 1.0);
      this.container2.appendChild(this.renderer2.domElement);

      this.renderer3 = new THREE.WebGLRenderer({ antialias: true });
      this.container3 = document.getElementById("container3")
      this.renderer3.setSize(this.container3.clientWidth, this.container3.clientHeight);
      this.renderer3.setClearColor('#FFFFFF', 1.0);
      this.container3.appendChild(this.renderer3.domElement);

      this.renderer4 = new THREE.WebGLRenderer({ antialias: true });
      this.container4 = document.getElementById("container4")
      this.renderer4.setSize(this.container4.clientWidth, this.container4.clientHeight);
      this.renderer4.setClearColor('#FFFFFF', 1.0);
      this.container4.appendChild(this.renderer4.domElement);
    },

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

initAnimate() {
      if(this.model){
        this.model.rotation.y += 0.03;
      }
      requestAnimationFrame(this.initAnimate);
      this.renderer1.render(scene, this.camera1);
      this.renderer2.render(scene, this.camera2);
      this.renderer3.render(scene, this.camera3);
      this.renderer4.render(scene, this.camera4);
    },

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

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

这里不支持上传视频,我就只能上传个图片了,如果想看动态效果可以私我,我发给你视频,或者需要源码也可以给我私信

相关文章
|
定位技术
百度地图:监听地图缩放自动显示和隐藏的富文本标签
百度地图:监听地图缩放自动显示和隐藏的富文本标签
185 0
|
7天前
ThreeJs控制模型的隐藏与显示
这篇文章讲解了如何在Three.js中通过代码控制3D模型的显示与隐藏状态。
17 3
ThreeJs控制模型的隐藏与显示
|
7天前
ThreeJs动态复制物体
这篇文章介绍了如何在Three.js中实现3D物体的动态复制,并提供了通过鼠标操作来复制模型的具体实现方法。
19 1
|
前端开发 JavaScript
【Three.js入门】渲染第一个场景及物体(轨道控制器、坐标轴辅助器、移动缩放旋转)
【Three.js入门】渲染第一个场景及物体(轨道控制器、坐标轴辅助器、移动缩放旋转)
282 0
|
图形学
【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR
【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR
394 0
|
编译器 API 图形学
【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
146 0
|
定位技术
在地图上基于OpenLayers实现点/线/面静态的绘制显示
在地图上基于OpenLayers实现点/线/面静态的绘制显示
965 0
在地图上基于OpenLayers实现点/线/面静态的绘制显示
|
数据可视化 vr&ar C#
Unity学习3,如何显示与隐藏平面检测
首先搭建好基本环境,在AR Session Origin下添加一个AR Plane Manager对象,并添加一个预制体AR Default Plane到AR Plane Manager对象的Plane Prefab属性下(这一部分在Unity配置Android开发环境下有介绍不再记录)Unity配置Android开发环境与第一个Demo
284 0
Unity学习3,如何显示与隐藏平面检测
|
Android开发 异构计算
Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)
Android显示之图层合成 要点 1.图层合成指综合各个窗口的绘制内容,送往LCD显示的过程。从原理上可分为在线合成与离线合成两种方式。 2.在Android的SurfaceFlinger代码流程中,图层合成方式分3D合成(OpenGL)和硬件合成两大类。 3.图形系统采用垂直同步Vsync机制,由LCD上报vsync,触发图层合成。 图层合成的原理
5952 0
【ThreeJs】(1)四大组件:场景、相机、物体、渲染器 | 创建一个矩形 | THREE脑图
【ThreeJs】(1)四大组件:场景、相机、物体、渲染器 | 创建一个矩形 | THREE脑图
369 0
【ThreeJs】(1)四大组件:场景、相机、物体、渲染器 | 创建一个矩形 | THREE脑图