基于Three.js的全景展示框架-TPano

简介: 在一些全景展示类应用中,经常需要对采集到全景照片进行展示,一般情况下,可以通过制作人员使用pano2vr进行数据处理(教程可参见:实战!使用pano2vr生成html5全景页面),将处理好的数据发布至静态服务器,再关联相应位置即可完成全景展示(详情见基于Leaflet的全景综合展示实战)

     在一些全景展示类应用中,经常需要对采集到全景照片进行展示,一般情况下,可以通过制作人员使用pano2vr进行数据处理(教程可参见:实战!使用pano2vr生成html5全景页面),将处理好的数据发布至静态服务器,再关联相应位置即可完成全景展示(详情见基于Leaflet的全景综合展示实战)。

      以上这种方式可用于素材不多,发布后不会轻易变化,而且对制作时间没有精确时间要求的场景。而且应用多依赖于人工操作,如果想直接对采集的全景照片进行直接展示的,可以采用什么方案呢?本文将介绍一种不依赖于人工的全景素材直接展示的解决方案。

      Three.js是一个可以运行在浏览器端的3D引擎,可以创建多种三维场景,是webGL的一种丰富展示,通过控制相机、场景、材质、光照等信息来完成3D展示(Three.js的专业知识可以具体参考官网或者搜索引擎,本文不赘述)。

       TPano基于Three.js可以直接对全景照片进行展示,无需任何人工处理,所见即所得,非常方便。下面将如何在TPano中集成全景进行简单阐述。

第一步、引入Three.js 和TPano.js 等信息

!--引入three.js--><scriptsrc="./three.js"></script><scriptsrc="../dist/tpano.js"></script><!--设备朝向控制器,不引入无法使用体感控制--><scriptsrc="./DeviceOrientationControls.js"></script><!--jquery框架,这里引入用来做一些其它的操作,TPano不依赖它,故你不需要可以不引入--><scriptsrc="./jquery-2.1.4.js"></script>

第二步、定义全景照片对象

letpanoPhoto= [
//全景照片数组,每项为一张照片        {
url: 'pano/DSCN0007.JPG',
name: '足球场入口',
        },
        {
url: 'pano/DSCN0009.JPG',
name: '足球场'        }, {
url: 'pano/DSCN0013.JPG',
name: '足球场坡道'        }, {
url: 'pano/DSCN0016.JPG',
name: '湖边'        }, {
url: 'pano/DSCN0017.JPG',
name: '图书馆旁'        }, {
url: 'pano/DSCN0018.JPG',
name: '小公园'        }, {
url: 'pano/DSCN0019.JPG',
name: '篮球场旁'        },
        {
url: 'pano/DSCN0035_1.avi',
type: 'VIDEO',
name: '视频'        },
    ];

第三步、定义网页dom渲染节点

<bodyid="pano"><divid="load"><divid="load-bar-k"><divid="load-bar-x"></div></div></div><divid="controller-y"><divid="photo"onclick="switchPhoto()"class="item item-f"><imgsrc="./img/bar/photo.png"alt="照片"><divclass="point"></div></div><divid="gyro"onclick="switchGyro()"class="item item-f"><imgsrc="./img/bar/gyro.png"alt="体感"><divclass="point"></div></div><divclass="item item-s"onclick="hidefunction()"><imgsrc="./img/bar/function.png"alt="功能"></div></div><divid="photo-box"><div><divhiddenclass="photo-box-div"id="example"><imgclass="photo-box-img"src=""alt=""><pclass="photo-box-p">示例</p></div></div></div></body>

第四步、开启TPano加载

vartpano=newTPano({
el: 'pano',//照片查看器根节点dom的idphoto: panoPhoto,
photoLoad: function (e) {
console.log(e);
closeLoadAnimate();
if (gi==0) {
//第一张照片加载完毕//解锁控制器controllerLock=true;
//6秒后隐藏功能键setTimeout(() => {
hidefunction();
                }, 6000);
            }
gi++;
if (gi==panoPhoto.length) {
//全部加载完毕//这个时间点开始加载相册,此功能未经后端优化的情况下加载的是原始照片,故非常的占用带宽,我们希望晚一些加载它cratePhoneBox();
photoBoxLock=true;
            }
        },
switchLoad: function (e) {
console.log(e);
switch (e.status) {
case'loading':
loadAnimate();
break;
case'end':
closeLoadAnimate();
break;
default:
alert('加载出错');
break;
            }
        },
gyroSport: function (e) {
if (!e&&!msgStatus) {
msgStatus=true;
alert('设备可能不支持陀螺仪,或者您没有启用https。多数浏览器安全策略只对启用了https的网站提供陀螺仪服务。');
            }
        },
hotspot: [
//全景照片上的热点            {
source: '足球场入口',//此热点放置在哪张全景照片上position: {//热点所在的位置x: 496.89276177820193,
y: -45.470141450240746,
z: 15.7856948039098                },
imgUrl: './img/foot.png',
jumpTo: '足球场'//热点点击后跳往何方            },
            {
source: '足球场',
position: {
x: -336.2550875236564,
y: -14.322516705554547,
z: -369.0878923870561                },
imgUrl: './img/foot.png',
jumpTo: '足球场坡道'            },
            {
source: '足球场坡道',
position: {
x: 9.916517848911612,
y: -73.87696480294954,
z: -493.83818114696464                },
imgUrl: './img/foot.png',
jumpTo: '湖边'            },
            {
source: '湖边',
position: {
x: 54.089284409982234,
y: -25.567089425803836,
z: 495.95622841487307                },
imgUrl: './img/foot.png',
jumpTo: '图书馆旁'            },
            {
source: '足球场坡道',
position: {
x: -496.45652472791767,
y: -25.137666788574762,
z: -48.767873292494635                },
imgUrl: './img/foot.png',
jumpTo: '图书馆旁'            },
            {
source: '图书馆旁',
position: {
x: -22.146984058775047,
y: -53.75657318610189,
z: 495.5786184825647                },
imgUrl: './img/foot.png',
jumpTo: '小公园'            },
            {
source: '小公园',
position: {
x: 470.9682632032511,
y: -66.67077805764235,
z: 153.04203582643925                },
imgUrl: './img/foot.png',
jumpTo: '篮球场旁'            },
            {
source: '篮球场旁',
position: {
x: -452.2504972710258,
y: 7.828318511793819,
z: 211.56713992810768                },
imgUrl: './video.png',
jumpTo: '视频'            }
        ],
DeviceOrientationControls: false,//设备朝向体感控制,默认关闭rotateAnimateController: true,//镜头自转debug: true,//调试模式    });

第五步、展示效果如下

image.png

全景展示1

image.png

六、总结

      以上展示了如何使用TPano进行全景素材的展示。基于Three.js即可完成图片和视频的展示而不需要进行图片切片处理,从而提高了数据从采集到发布的效率。

      TPano框架展示地址:https://gitee.com/push_0x57df/TPano,这是gitee上分享的框架地址,感兴趣的朋友可以clone到本地进行调试。

     留一个思考的问题:全景照片一般都很大,如果直接展示不仅影响速度,而且会加大服务器的带宽压力,那么如何解决全景的快速可视化呢?欢迎交流。

目录
相关文章
|
8月前
|
JavaScript 前端开发 API
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端框架
【10月更文挑战第34天】在数字化时代,后端开发如同一座桥梁,连接着用户界面与数据处理的两端。本文将通过Node.js这一轻量级、高效的平台,带领读者领略后端框架的魅力。我们将从基础概念出发,逐步深入到实战应用,最后探讨如何通过代码示例来巩固学习成果,使读者能够在理论与实践之间架起自己的桥梁。
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
JavaScript 前端开发 API
|
12月前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
2873 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
JavaScript 前端开发 API
Vue.js:现代前端开发的强大框架
【10月更文挑战第11天】Vue.js:现代前端开发的强大框架
379 41
|
缓存 监控 JavaScript
Vue.js 框架下的性能优化策略与实践
Vue.js 框架下的性能优化策略与实践
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
304 2
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
281 4

热门文章

最新文章