Threejs制作虚拟房间效果

我们经常在装修的网站可以看到虚拟房间的效果,通过网站展示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)
	  }

然后就可以实现了,效果如下:

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baker_zhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值