three.js实现全景展厅漫游(项目实战)

    众所周知实现全景有很种不同的方法,今天主要介绍使用three.js来实现效果,Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。

1:初始化设置

所有的初始化操作都是在mounted中实现,这里为什么不用created?因为我们需要操作dom,

而created是获取不到dom的。

​
    // 创建场景
    const scene = new THREE.Scene() //初始化场景
    var ambient = new THREE.AmbientLight(0xfffffff, 2) //添加光源  颜色和光照强度
    scene.add(ambient) //向场景中添加光源

首先是对于场景的初始,光源是一般是必须要添加上的,不过也有些特殊材质能自身发光的情况下光源也不必添加,当然这是很少见的一种情况,没有光源会导致黑屏。

​
    // 创建相机
    var width = 800 //窗口宽度
    var height = 800 //窗口高度
    const camera = new THREE.PerspectiveCamera(90, width / height, 1, 1000) //使用透视相机
    camera.position.set(30, 0, 10) //设置相机位置
    camera.lookAt(new THREE.Vector3(30, 0, 0)) // 相机看向

​

这里我们使用的是透视相机,这是最接近自然的视图,符合近大远小的规律。

    // 创建渲染器
    width = window.innerWidth //窗口宽度 window.innerWidth 浏览器窗口可视区宽度(不包括浏览器控制台、菜单栏、工具栏)包含滚条
    height = window.innerHeight //窗口高度 window.innerHeight
    const renderer = new THREE.WebGLRenderer() //创建渲染器
    renderer.setSize(width, height) // 设定渲染器尺寸
    renderer.setPixelRatio(window.devicePixelRatio)
    this.$refs.container.appendChild(renderer.domElement) //通过 this.$ref

渲染器就相当于画布,所有的展示效果都需要在画布上来显示我们需要在html中添加一个ref为container的盒子,当然你也可以自己来命名。

    // 创建控制器
    const controls = new OrbitControls(camera, renderer.domElement)
    controls.enableDamping = true
    // 缩放限制
    controls.maxDistance = 12
    controls.target.set(30, 0, 0)

​

这里我们需要对控制器来进行一个对于缩放的限制,因为全景的原理是创建一个正方体或者一个球体,然后让视角在盒子里面,所以我们不能将外盒子暴露给用户。

2:添加模型

接下来是最关键的步骤了,我们需要创建一个球体或者正方体,不同的材质所需要的全景图是不一样的,球体只需要一张完整的全景照片即可实现全景,缺点是可能某些视角效果不是很好,而正方体需要六张不同方向的照片,这个对于初学者难度要求过高,往往不能做到无缝贴合,但是他避免球体的缺点,展现效果是非常不错的。

 

    // 添加一个球体
    const geometry = new THREE.SphereGeometry(130, 256, 256)
    var textureLoader = new THREE.TextureLoader() //创建纹理贴图
    var img = textureLoader.load(require('../../../public/image/vrTest3.jpg'))
    const material = new THREE.MeshLambertMaterial({
      map: img, //设置颜色贴图属性值
      side: THREE.DoubleSide //双面渲染
     })
    const cube = new THREE.Mesh(geometry, material)
    scene.add(cube)

最后是渲染场景

    // 渲染场景
    const animate = function () {
      requestAnimationFrame(animate)
      renderer.render(scene, camera)
    }
    animate()

这里你也可以加上动画,让场景自己移动。

完成上诉你应该完成了一个最基本的vr全景图了。

这里我添加一个3D模型在里面,你们也基于自己的业务进行拓展

3:场景漫游

场景漫游分为同场景漫游和不同场景漫游

一:不同场景漫游

由于是不同场景,一个场景是一个物体,在这里我们需要循环的创建多个球体,切记场景与场景之间不可重叠,原理主要是在切换时改变相机的位置和控制中心的位置,因为我们在开始的时候进行了缩放的限制所以用户是无法发现的,测试的时候可以把限制注释掉来进行调试。

<template>
  <div class="home">
    <div ref="container"></div>
    <!-- 场景切换点 -->
    <div class="switch">
      <span
        class="buttons"
        v-for="(room, index) in rooms"
        :key="index"
        @click="handleSwitchButtonClick(room.key)"
        v-show="room.key !== currentRoom"
      >
        <b class="text">{{ room.name }}</b>
        <i class="icon"></i>
      </span>
    </div>
  </div>
</template>

与画布并列,将切换盒子固定在全景图的右侧,需要将盒子的index大于画布

对于多个场景的创建添加可以参考上面的代码,去循环创建他就行了,这里我就不进行多余的阐述了。

    // 点击切换场景
    async handleSwitchButtonClick(key) {
      if (key == 'internet-hall') {
        this.cameras.position.set(280, 0, 10)
        this.cameras.lookAt(new THREE.Vector3(280, 0, 0))
        this.controles.target.set(280, 0, 0)
        this.currentRoom = 'internet-hall'
      } else if (key == 'insect-hall') {
        this.cameras.position.set(0, 0, 10)
        this.cameras.lookAt(new THREE.Vector3(0, 0, 0))
        this.controles.target.set(0, 0, 0)
        this.currentRoom = 'insect-hall'
      } else if (key == 'agriculture-hall') {
        this.cameras.position.set(580, 0, 10)
        this.cameras.lookAt(new THREE.Vector3(580, 0, 0))
        this.controles.target.set(580, 0, 0)
        this.currentRoom = 'agriculture-hall'
      }
}

切换场景在场景不多的时候可以用我这种方法,当然你也可以将数据放在data里面,使用循环来切换不同的场景。

二:同场景漫游

对于同场景的漫游,我使用了移动来实现

    window.addEventListener(
      'keydown',
      (e) => {
        var ev = e || window.event
        switch (ev.keyCode) {
          case 87:
            camera.position.x += 2
            controls.target.x += 2
            break
          case 83:
            camera.position.x -= 2
            controls.target.x -= 2
            break
          case 65:
            camera.position.z -= 2
            controls.target.z -= 2
            break
          case 68:
            camera.position.z += 2
            controls.target.z += 2
            break
          default:
            break
        }
      },
      false
    )

有什么问题可以在评论下留言哦。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Three.js实现3D展厅漫游。下面是一个简单的示例代码,演示了如何创建一个基本的3D展厅并在其中进行漫游: 首先,你需要引入Three.js库。可以通过以下方式在HTML文件中引入: ```html <script src="https://threejs.org/build/three.js"></script> ``` 接下来,创建一个场景、相机和渲染器: ```javascript var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); ``` 然后,创建展厅的几何体和材质,并将其添加到场景中: ```javascript var geometry = new THREE.BoxGeometry(1, 1, 1); var material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); var cube = new THREE.Mesh(geometry, material); scene.add(cube); ``` 接着,设置相机的位置,并添加事件监听器来响应用户的输入(例如鼠标移动、键盘按键等): ```javascript camera.position.z = 5; function animate() { requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render(scene, camera); } animate(); ``` 最后,使用渲染器将场景渲染到屏幕上: ```javascript renderer.render(scene, camera); ``` 通过修改几何体、材质和相机的位置,以及添加更多的3D对象,你可以构建一个更复杂的3D展厅。此外,你还可以使用Three.js的其他功能,如光照、纹理贴图、动画等来增强展厅的效果。 这只是一个简单的示例,你可以根据自己的需求进一步定制和扩展。希望能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值