krpano动态加载设置热点

简介: 上一张中已经完成了比较简易的3D全景浏览,但是...这是写死在xml中的,对于我们实际的项目,这种情况是不可能适应的。所以,来了解下如何动态加载xml已经设置对应的热点。
上一章中已经完成了比较简易的3D全景浏览,但是...这是写死在 xml中的,对于我们实际的项目,这种情况是不可能适应的。所以,来了解下如何动态加载xml已经设置对应的热点。

我们的思路

  • 首先,场景是要提前设置好的,比如:我们支持三种场景,那么对应每一个场景中放多少张图片,并且每一张图片的位置是固定的。
  • 实际的图片不是固定的,所以我们可以通过后台管理,设定好每一个展厅是使用哪个场景,该场景中放哪些照片
  • 然后通过进入哪个展厅(ID)获得对应的场景XML 以及对应的图片地址信息即可
  • 然后通过krpano来加载xml 并设置对应的hotspot url即可。

实现

关于xml中的代码这里就不贴了,主要贴下动态加载的js代码。

/****
 * Krpano util ,通用函数类
 * @author lixun
 * @create 2018年9月11日 17:37:44
 ***/
 var krpano = null;
 var Common = {
     //获得场景信息
     getScene : function( id,cb ){
         //这里使用假数据
        var map = {
            '1' : {
                type : 'scenea.xml',//场景类型
                next : '2',//下一个场景ID
                prev : '3',//上一个场景ID
                imgs : [    //对应场景内的图片展示
                    '/img/1.jpg',
                    '/img/2.jpg',
                    '/img/3.jpg',
                    '/img/4.jpg',
                    '/img/5.jpg',
                    '/img/6.jpg',
                    '/img/7.jpg',
                    '/img/8.jpg',
                    '/img/9.jpg',
                    '/img/10.jpg',
                    '/img/11.jpg',
                    '/img/12.jpg',
                    '/img/13.jpg',
                    '/img/14.jpg',
                    '/img/15.jpg',
                    '/img/16.jpg',
                    '/img/17.jpg',
                    '/img/18.jpg',
                    '/img/19.jpg',
                    '/img/20.jpg',
                ]
            }//这里使用的是假数据,后续的就不贴了,占空间
        };
        if(cb){
            cb(map[id]);
        }
     },
     //加载场景
     loadPano : function(xml,imgs,next,prev){
        if(krpano){
            removepano('newId');
        }
        embedpano({
            swf : 'tour.swf',         // path to flash viewer (use null if no flash fallback will be requiered)
            id : "newId", 
            xml : xml, 
            target : 'pano', 
            consolelog : true,                    // trace krpano messages also to the browser console
            passQueryParameters : true,         // pass query parameters of the url to krpano
            onready : function(krpano_interface){
                krpano = krpano_interface;
                //继续操作
                console.log('delay...');
                Common.setHot(imgs,next,prev);
            }
        });
         
     },
     //设置热点图片路径
     setHot : function(imgs,next,prev){
         console.log('hot setting')
         if (krpano){
             setTimeout(function(){
                 imgs.forEach(function(imgPath,index){
                     krpano.set("hotspot[dyn_img"+(index+1)+"].url", imgPath);    
                 })
                 //设置场景跳转
                krpano.set('hotspot[spot1].onhover','showtext(去往第1展厅,hotspottextstyle)');
                krpano.set('hotspot[spot2].onhover','showtext(去往第2展厅,hotspottextstyle)');
                krpano.set('hotspot[spot1].onclick','js(showScene('+prev+'))');
                krpano.set('hotspot[spot2].onclick','js(showScene('+next+'))');
                //随机观察点
                krpano.call("lookto(" + (Math.random() * 360.0 - 180.0) + "," + (Math.random() * 180.0 - 90.0) + "," + (80.0 + Math.random() * 100.0) + ")");
             },200)
        }
     }
 };

代码中基本上注释都写清楚了,主要的思路就是先根据展厅ID获得对应的xml以及图片,然后在加载另外的场景的时候,先移除掉现在的场景,然后重新加载。

JS调用:

//加载场景
var imgs = [];
function showScene(id){
    console.log('加载场景'+id);
    Common.getScene(id,function(obj){
        imgs = obj.imgs;
        Common.loadPano(obj.type,obj.imgs,obj.next,obj.prev);
    })
}

byy.require('win',function(){
    
    //第一次加载需要先确定场景,然后初始化场景,然后加载图片
    //后续的需要获得场景信息,然后加载不同的pano,然后加载图片信息
    Common.getScene(1,function(obj){
        console.log(obj);
        Common.loadPano(obj.type,obj.imgs,obj.next,obj.prev);
    })
    
})

这样,我们就能够在加载的时候动态加载我们需要的场景了,不需要一次全部加载,相对耗时短一些,当然对于图片的处理还是需要的,不然每个图片都很大的话,加载还是很慢的,两边要一起优化。

以上代码暂时只能用于demo的实现,具体生产中还没有开始使用,仅供借鉴!

相关文章: 初识Krpano

相关文章
|
7月前
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
80 0
|
2月前
|
缓存 前端开发 网络协议
优化网站的加载速度
【10月更文挑战第8天】优化网站的加载速度
20 3
|
开发工具 Android开发
【uniapp】sigmob广告加载失败:-5005、500422没有imei的解决办法(原创可用)
【uniapp】sigmob广告加载失败:-5005、500422没有imei的解决办法(原创可用)
227 1
|
7月前
|
Web App开发 JSON 移动开发
mPaaS常见问题之加载不到uc 内核如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
124 0
|
前端开发 安全 芯片
【芯片前端】Filelist -f/-F的文件解析方式探究
【芯片前端】Filelist -f/-F的文件解析方式探究
204 0
|
小程序 PHP
[微擎]多系统共用accesstoken修复wifi小程序文本敏感词汇检测+图片检测原生php(可用)
[微擎]多系统共用accesstoken修复wifi小程序文本敏感词汇检测+图片检测原生php(可用)
|
缓存
ALSTOM V4550220-EN 复制CPU中的少量组件来支持MT
ALSTOM V4550220-EN 复制CPU中的少量组件来支持MT
101 0
ALSTOM V4550220-EN 复制CPU中的少量组件来支持MT
|
传感器 数据采集 语音技术
基于CC2530设计的自动晾衣杆
使用CC2530单片机的ADC接口采集雨滴传感器的模拟值,得到雨滴传感器的雨滴测量值之后,与预先设置的阀值进行对比,是否要打开或者收回晾衣杆,这个晾衣杆的伸缩采用步进电机进行模拟;并且还支持语音控制、手动控制晾衣杆的伸缩。
261 0
基于CC2530设计的自动晾衣杆
|
Web App开发 存储 缓存
浏览器的about:config清缓存及其他参数大全及其具体用途介绍
浏览器的about:config清缓存及其他参数大全及其具体用途介绍
|
开发者 图形学 容器
Unity3D模型AAA级别Serekh塞拉赫资源制作技术
此项目致力于创作AAA级作品所需的高端资源。我们希望激励创作者拓展自己的领域,观察,分析和学习行业资深人士的技术与创作方法。
Unity3D模型AAA级别Serekh塞拉赫资源制作技术