panolensjs实现全景场景切换

<template>
    <div>
        <div id="container" ref="container" style="width: 1000px; height: 500px;"></div>
    </div>
  </template>
  
  <script>
  import * as THREE from 'three'
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
  import * as PANOLENS from 'panolens'
  export default {
    name: "Index",
    data() {
      return {
        // 版本号
        version: "3.8.5",
        scene:'',
        allScenes:[],
        camera:'',
        renderer:'',
        cube:'',
        container:'',
        urls: [
          'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
          'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
          'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
          'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
          'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
          'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
          'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg'
        ],
        container:'',
        panorama_main_image:'',
        light:'',
        camera:'',
        controls:'',
        renderer:'',
        object:[],
        objLoader:null,
        mtlLoader:null,
      };
    },
    mounted(){
         this.initContainer() //初始化全景容器
        this.createScence(require('@/views/vr.jpg')) //本地图片引入方式
        this.createScence(this.urls[6])
        // this.createScence(require('@/assets/images/s1.jpg'))
        // console.log('this.container.OrbitControls',this.container.OrbitControls)
        this.addTipMarker(this.allScenes[0],PANOLENS.DataImage.Info,[4870.22, 104.73, 1100.27])
        this.allScenes[0].link(this.allScenes[1], new THREE.Vector3(4401.39, 1027.04, 2117.59))
        this.allScenes[1].link(this.allScenes[0], new THREE.Vector3(4898.90, 128.76, 955.73))

    },
    methods: {
      generateDocument() {
        // 读取模板文件
        const templateContent = fs.readFileSync('./template.docx', 'binary');
        const template = new Docxtemplater(templateContent);
  
        // 准备要填充的数据
        const data = {
          t1: '这是要插入的数据1',
          t2: '这是要插入的数据2',
          t3: '这是要插入的数据3',
          // 更多数据...
        };
  
        // 将数据填充到模板中
        template.setData(data);
  
        // 进行模板渲染
        template.render();
  
        // 生成最终的 Word 文档内容
        const generatedDocument = template.getZip().generate({ type: 'nodebuffer' });
  
        // 保存文档为 Blob 对象,以便下载
        const blob = new Blob([generatedDocument], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
        const url = URL.createObjectURL(blob);
  
        // 创建一个链接用于下载文档
        const link = document.createElement('a');
        link.href = url;
        link.download = 'output.docx';
        link.click();
  
        // 释放 Blob 对象
        URL.revokeObjectURL(url);
      },
      //初始化DOM容器
      initContainer(){
        // 初始化场景
        this.container = new PANOLENS.Viewer({
        container: document.getElementById('container'), // 传入父容器dom
        output: 'console'  // 为了后面打印位置信息
        })
        // this.container.OrbitControls.noZoom = true
        this.container.OrbitControls.maxPolarAngle = (2/3) * Math.PI
        this.container.OrbitControls.minPolarAngle = (1/3) * Math.PI
     },
      /**
       * @name 创建场景
       * @param {url} sceneImageUrl 360度全景的图片地址
       */
      createScence(sceneImageUrl){
          // 传入官方案例的全景图片,初始化一个球形的全景
         const scene = new PANOLENS.ImagePanorama(sceneImageUrl)
         // 添加到场景中
         this.container.add(scene)
         this.allScenes.push(scene)
         // 2.开启方法,因为此方法本质是射线捕捉物体,所以要放到this.container.add()之后,不然会因为没物体而报错
         this.container.outputPosition()
       },
       /**
        * 场景中添加标识点
        * @param {ImagePanorama} scene 要的添加场景
        * @param {PANOLENS.DataImage} tipImage 图标采用自带的图标
        * @param {Array} position 提示图片添加位置,ctrl+鼠标点击图片位置获得,控制台查看
        * @param {String} hoverText 
        */
       addTipMarker(scene,tipImage,position,hoverText){
         // 初始化标识点, 因为本质是精灵模型,需要传入scale缩放来控制大小
         // 图标采用自带的图标PANOLENS.DataImage.Info
         const infospot = new PANOLENS.Infospot(350, tipImage)
         // 根据前面获取的位置来设置标识点的位置
         infospot.position.set(position[0],position[1],position[2])
         if(hoverText){
            // 给标识点添加文字
            infospot.addHoverText(hoverText)
         }
         infospot.addEventListener('click',()=>{
            this.allScenes[0].click()
         })
         // 标识点添加入场景
         scene.add(infospot)
      },
    }
  };
  </script>  
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: three.js是一种用于在Web浏览器上创建3D场景和交互式动画的JavaScript库。它提供了许多功能,包括创建全景场景切换场景的能力。 在three.js中,创建全景场景是相对简单的。首先,我们需要一个全景图片,这是一个以固定点为中心的360度全景图像。然后,我们可以使用three.js中的球体几何体来创建一个球形网格,将全景图片贴到球体上。 要实现场景切换,我们可以使用three.js中的场景(Scene)对象。我们可以定义多个场景对象来表示不同的场景,然后通过切换场景对象来实现场景切换。 为了切换场景,我们可以使用three.js中的摄像机(Camera)对象来改变观察视角。我们可以将摄像机对象的位置和朝向设置为不同场景的位置和朝向,从而切换到不同的场景。 除了摄像机的切换,我们还可以通过添加、移除或隐藏场景中的对象来切换场景。我们可以使用three.js中的场景对象的add、remove和traverse方法来管理场景中的对象。 最后,我们可以通过添加交互控件来实现用户对场景切换。three.js提供了一些交互控件,如OrbitControls和PointerLockControls,可以让用户通过鼠标或键盘操作来切换场景。 总结起来,使用three.js创建全景场景并进行场景切换的关键是使用球体几何体来创建全景,并使用场景对象和摄像机对象来管理和切换场景。通过添加交互控件,用户可以与场景进行交互并实现场景切换。 ### 回答2: three.js是一种用于创建三维场景的JavaScript库,它可以帮助开发者在网页上展示全景场景。而全景场景切换是指在三维场景中,将不同的全景场景切换展示给用户。 要实现全景场景切换,首先需要创建一个包含多个全景场景场景集合。每个全景场景可以包含不同的背景图片、模型、灯光等元素。通过使用three.js的相机和控制器,可以控制用户的视角来浏览不同的全景场景。 在切换全景场景时,可以使用按钮、菜单或者键盘事件等方式触发场景切换。当用户点击或者选择相应的切换方式时,可以通过修改场景中的元素来实现场景切换效果。例如,可以更改全景场景中的背景图片、重新加载模型或者调整灯光的属性。 切换全景场景时,可以通过显示或隐藏特定的模型或元素来提供更流畅的切换过程。在切换时,应该平滑地过渡从一个场景到另一个场景,以免用户感到突兀或者不自然。 为了实现全景场景切换的交互效果,可以使用three.js提供的动画库或者自定义动画函数。通过适当的延迟、缓冲和过渡效果,可以为用户提供良好的使用体验。 总之,three.js可以帮助开发者创建交互式的全景场景,并且提供了一些API和工具来实现全景场景切换效果。通过合理地使用这些功能,可以实现流畅、美观的全景场景切换效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值