Threejs制作虚拟房间效果

简介: 这篇文章详细说明了如何使用Three.js创建一个虚拟房间的3D模型,通过将六个方向的照片作为立方体的纹理,从而实现一个类似于天空盒的室内场景,让用户能够探索房间的不同角落。

我们经常在装修的网站可以看到虚拟房间的效果,通过网站展示3D房间的细节,并且点击可以进入到每个房间查看,今天就用threejs来实现类似的效果,其实就是类似天空盒子的功能,将房间的上下左右前后各拍一张图片,并且保证每个图片的交界处是衔接上的,最后组成一个正方体的盒子,将相机设置在盒子的中间,禁止拖动,就可以实现在房间里查看房间周围家具的效果。

首先第一步创建3D场景

 function initScene() {
        scene = new THREE.Scene();
      }

      // 初始化相机
      function initCamera() {
        camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 10000);
        camera.position.set(0, 0, 10);
      }

      // 初始化灯光
      function initLight() {
        var directionalLight = new THREE.DirectionalLight(0xffffff, 0.3); //模拟远处类似太阳的光源
        directionalLight.color.setHSL(0.1, 1, 0.95);
        directionalLight.position.set(0, 200, 0).normalize();
        scene.add(directionalLight);

        var ambient = new THREE.AmbientLight(0xffffff, 1); //AmbientLight,影响整个场景的光源
        ambient.position.set(0, 0, 0);
        scene.add(ambient);
      }
 // 初始化渲染器
      function initRenderer() {
        renderer = new THREE.WebGLRenderer({
          antialias: true
        });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setClearColor(0x4682B4, 1.0);
        document.body.appendChild(renderer.domElement);
      }

      // 初始化轨迹球控件
      function initControls() {
        controls = new THREE.OrbitControls(camera, renderer.domElement);
      }

      function animate() {
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
      }

然后找六张房间的图片,图片资源

然后将图片添加到场景中,并作为贴图贴在正方体的6个面上

function initHouse(){
        const geometry = new THREE.BoxGeometry( 40, 40, 40)
        // 立方体纹理加载
        let arr = ['home_left','home_right','home_top','home_bottom','home_front','home_back'];
        let boxMaterials = []
        arr.forEach(item=>{
          const texttrue = new THREE.TextureLoader().load('./images/'+item+'.jpg' ) // 纹理贴纸
          boxMaterials.push(
              new THREE.MeshBasicMaterial({
                color:'#ffffff',
                map:texttrue
              })
          )
        })
        const mesh = new THREE.Mesh(geometry,boxMaterials)
        mesh.geometry.scale(1,1,-1) // 进入内部
        scene.add(mesh)
      }

然后就可以实现了,效果如下:
WechatIMG115.jpg
Threejs查看VR房间

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

下面是完整代码

<!DOCTYPE html>
<html>
<head includeDefault="true">
  <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <title>位置移动</title>
  <script src="./ThreeJs/js/three.js"></script>
  <script src="./ThreeJs/js/OrbitControls.js"></script>
</head>

<body>
    <div class="container" ref="container"></div>
  <script>
        var camera, scene, renderer, controls;
      function initScene() {
        scene = new THREE.Scene();
      }

      // 初始化相机
      function initCamera() {
        camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 10000);
        camera.position.set(0, 0, 10);
      }

      // 初始化灯光
      function initLight() {
        var directionalLight = new THREE.DirectionalLight(0xffffff, 0.3); //模拟远处类似太阳的光源
        directionalLight.color.setHSL(0.1, 1, 0.95);
        directionalLight.position.set(0, 200, 0).normalize();
        scene.add(directionalLight);

        var ambient = new THREE.AmbientLight(0xffffff, 1); //AmbientLight,影响整个场景的光源
        ambient.position.set(0, 0, 0);
        scene.add(ambient);
      }
      function initHouse(){
        const geometry = new THREE.BoxGeometry( 40, 40, 40)
        // 立方体纹理加载
        let arr = ['home_left','home_right','home_top','home_bottom','home_front','home_back'];
        let boxMaterials = []
        arr.forEach(item=>{
          const texttrue = new THREE.TextureLoader().load('./images/'+item+'.jpg' ) // 纹理贴纸
            boxMaterials.push(
              new THREE.MeshBasicMaterial({
                color:'#ffffff',
                map:texttrue
              })
            )
          // }
        })
        const mesh = new THREE.Mesh(geometry,boxMaterials)
        mesh.geometry.scale(1,1,-1) // 进入内部
        scene.add(mesh)
      }

      // 初始化渲染器
      function initRenderer() {
        renderer = new THREE.WebGLRenderer({
          antialias: true
        });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setClearColor(0x4682B4, 1.0);
        document.body.appendChild(renderer.domElement);
      }

      // 初始控制
      function initControls() {
        controls = new THREE.OrbitControls(camera, renderer.domElement);
      }

      function animate() {
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
      }

      function init() {
        initScene();
        initCamera();
        initLight();
        initHouse();
        initRenderer();
        initControls();
        animate();
    }
    init();

  </script>
</body>

</html>
相关文章
|
2月前
|
JavaScript 定位技术 API
|
3月前
|
API
【threejs教程】场景视角切换的神器:轨道控制器
【8月更文挑战第5天】threejs教程:场景视角切换的神器,轨道控制器
186 1
【threejs教程】场景视角切换的神器:轨道控制器
|
4月前
|
JavaScript
vue实战——404页面模板001——男女手电筒动画
vue实战——404页面模板001——男女手电筒动画
114 1
|
6月前
|
定位技术
vue3制作地图,可接口,图标可调
vue3制作地图,可接口,图标可调
64 0
|
存储 前端开发 定位技术
brython | 笨办法写个连连看-3.地图制作
brython | 笨办法写个连连看-3.地图制作
139 4
|
数据安全/隐私保护
又一款有虚拟形象的录屏软件来了,制作教学类视频的神器!(文末送福利)
Wondershare PDFelement:一款强大的pdf处理软件,一键去除水印、编辑图片、批量处理PDF等等,拥有很多强大的功能!
210 0
|
移动开发 前端开发
【H5 音乐播放实例】第五节 音轨制作
【H5 音乐播放实例】第五节 音轨制作
127 0
|
数据可视化
【Axure教程】用中继器制作动态切换的柱状图
【Axure教程】用中继器制作动态切换的柱状图
【Axure教程】用中继器制作动态切换的柱状图
|
缓存 运维 前端开发
从零开始实现放置游戏(十四)——实现战斗挂机(5)地图移动和聊天
上一节添加了websocket组件,实现了前后端通信。后面我们只需要根据游戏的业务逻辑,逐步实现各种功能即可。   另外,在实现具体业务逻辑时,发现上一章设计的消息对象有些不合理,由于粒度过粗,导致可以复用的部分很少,且这里的通信模型并不是一个请求对应一个响应的模式。比如:玩家a从地图A移动到地图B。此时,a发送移动请求。服务器返回B地图的信息和在线列表给A。同时还要发送最新的在线列表给地图B的其他玩家b,c,d....这里其他玩家并没有发送请求,但收到了响应消息。因此,将消息类型重构成由客户端发出的消息和由服务端发出的消息两类,分别以"3000"和"6000"开头。
从零开始实现放置游戏(十四)——实现战斗挂机(5)地图移动和聊天
|
自然语言处理 数据可视化 JavaScript
基于WebGL的虚拟太阳系漫游技术实现 ThingJS 科幻片
3D可视化技术逐渐应用到现代多媒体的课堂教学中。虚拟太阳系是一款天文类的3D可视化应用,它借助3D在线浏览。
基于WebGL的虚拟太阳系漫游技术实现 ThingJS 科幻片