介绍
Pannellum是基于WEB的轻量级VR全景图阅读器
特性
有如下良好的特性支持不同的需要:
- 支持自动载入和手动载入全景图
- 支持全景图的自动旋转和手动旋转方式
- 支持预览图设定
- 支持标注作者和标题
- 支持罗盘指示
- 支持Cube map(定义多张图片,组成全景图)
- 支持初始视角的定义
- 支持部分全景展示
- 支持自定义的全景移动控制
- 支持自定义热点
- 支持多分辨率
- 支持tour模式(从一全景图切换到另一全景图)
- 支持全景视频
兼容性
Pannellum兼容性良好,基本能支持主流的浏览器,基本能够完全支持的浏览器如下:
- Firefox 10+
- Chrome 15+
- Safari 8+
- Internet Explorer 11+
- Edge
使用代码
初始化
1 | //多场景,需要scenes及firstScene指定默认场景 |
1 | //单个场景,主要设置panorama |
config
pannellum.viewer初始化参数。类型为Object,其属性配置项如下:
id: string 热点id,供removeHotSpot删除热点使用type:string 指定全景图类型,默认equirectangularequirectangular等矩形cubemap立方体 - 六个方向multires多分辨率 - 根据缩放的程度(改变Hfov)来显示不同清晰度的照片
title:string 左下角标题firstScene:string 指定首次展示的场景sceneIdcompass:boolean 显示指南针draggable:boolean 是否可拖动showControls:boolean 显示控制按钮autoLoad: boolean 自动加载,否则需要点击autoRotate: number 自动旋转,正数向右,负数向左,绝对值越大速度越快autoRotateInactivityDelay: number 停止操作多久(ms)继续旋转orientationOnByDefault: boolean 开启重力感应查看模式mouseZoom: boolean 鼠标滚轮缩放minPitch: number 俯仰角度最小值maxPitch: number 俯仰角度最大值hfov: number 视野(远近缩放)minHfov: number 视野最小值maxHfov: number 视野最大值hotSpots: object 设置热点,配置属性如下:pitch: number 俯仰角度 - 绕x轴旋转yaw: number 偏移角度 - 绕y轴旋转type: string 热点类型:"scene"场景链接"info"信息热点
text: string hover时显示的文本sceneId: string 目标场景id,热点type为"scene"时指定跳转的场景targetPitch:number 热点type为"scene"时指定跳转场景的初始俯仰角targetYaw:number 热点type为"scene"时指定跳转场景的初始偏移角targetHfov:number 热点type为"scene"时指定跳转场景的初始视野scale:boolean 是否缩放热点以匹配视野变化(近大远小),默认falseURL:string 设置后点击该热点会跳转到对应外部链接image:string 设置后热点tooltip会弹出对应图片,图片太大会超出屏幕video:string 设置后热点tooltip会弹出对应视频,视频太大会超出屏幕cssClass:number指定热点元素的css类,而不是默认的类clickHandlerArgs:anyclickHandlerFunc热点点击参数clickHandlerFunc(event, clickHandlerArgs):function 监听热点点击createTooltipArgs:anycreateTooltipFunc自定义热点工具参数createTooltipFunc(iconDom, createTooltipArgs):function 用于自定义热点工具提示dom, 配置后默认tooltip消失 (直接对参数 - 热点图标dom操作)
hotSpotDebug:boolean 开启场景热点调试模式,中间会出现准心,单击时会打印俯仰和偏移等点信息scenes:object 场景组,其属性名代表着场景的id(sceneId),属性值为viewer的配置参数(config),其参数会覆盖默认(上述中的default对象)设置的参数
在function类型的配置项中,
this可获取场景及热点、位置等信息clickHandlerFunc回调中的this对添加热点时自定义的属性也会保留
特定选项
type为不同值时特有选项: equirectangular, cubemap, 或 multires
equirectangular
panorama:string 全景图路径haov:number 全景水平视角,默认360。如果图像在水平方向未覆盖360度可设置此项vaov:number 全景垂直视角,默认180。如果图像在垂直方向上未完全覆盖180度可设置此项vOffset:number 图形中心相对于地平线的垂直偏移,默认0。vaov小于180且图像源未对称剪裁时使用ignoreGPanoXMP:boolean 为true忽略任何嵌入的Photo Sphere XMP 数据,否则会覆盖现有设置
cubemap
cubeMap:array 设置六个立方体面图像URL,顺序为前、右、后、左、上、下
针对拆分全景图片的投影方式,即将整个投影空间看作一个立方体,具有前后左右上下6个面,分别将各个拆分全景图片渲染在对应的各个面上,在感官上也能够达到柱面投影的效果
multires
multiRes:objectbasePath 设置一个公用路径,后面的path只需要写相对于basePath的相对路径即可,这里需要注意的是path的值,path的值是一个格式化的字符串,其中 %l 代表缩放等级,**%s** 代表立方体的面 ,**%x** 和 %y 代表了该瓦片在这一个面中的位置。 其文件结构如图:
)当缩放等级为1时,就会在“1”文件夹中将各个面对应的图片投影到对应的立方体面上(对应%s),然后根据每一个瓦片的坐标来确定瓦片在每一个面中的位置,这里由于坐标是(0,0),且每一面只有一个瓦片,所以是铺满整面,多个瓦片的效果可以看上面的实例。
fallbackPath 当某些浏览器不支持multires功能的时候能够回退到fallbackPath指定的文件夹下加载默认的全景图
extension指定瓦片的图片格式,不需要加前面的 “.” 符号
ileResolution指定瓦片的像素,单位为px。
maxLevel指定最多支持几个缩放等级。
cubeResolution指定立方体面的总像素,单位为px。
如此就能够根据不同的缩放等级来显示不同的清晰度的图像,这样的好处是如果要加载一张4k的全景图,不需要一次性就将整个全景图都加载进来,可以先加载一个缩放等级低的全景,然后当使用者进行缩放查看细节的时候再加载清晰度更高的图像,这样就可以明显提高加载速度,避免因为图片过大使得加载时间过长和不必要的流量浪费。不足之处就是需要为一张全景图额外准备不同清晰度的图片,增加了图片处理的工作量,也增加了图片存储的空间占用。
动态内容
当前仅支持 equirectangular
dynamic:boolean 将全景图视为动态源,默认false。比如全景源为视频的情况需要设置truedynamicUpdate:boolean 使查看器对动态内容自动更新。如果更新是通过setUpdate方法控制则设为false
事件
事件通过viewer.on(eventName, callback)监听,eventName:string如下:
load全景图加载完成scenechange新场景初始化完成fullscreenchange全屏状态切换zoomchange场景 hfov 视野变化scenechangefadedone若指定了场景淡入淡出间隔,则在淡入淡出完成后触发animatefinished任何动画/移动完成时触发,也就是渲染器停止渲染新帧。将最终pitch、yaw、hfov值传递给回调error发生错误errorcleared清除错误mousedown鼠标按下mouseup鼠标抬起touchstart触摸开始(移动端)touchend触摸结束(移动端)
全局api
通过viewer调用,这里只介绍常用api
方法
addHotSpot(hs, sceneId)添加热点- parameters:hs - 热点参数, sceneId - 添加目标场景id(默认是当前场景id)
- return: viewer
mouseEventToCoords(MouseEvent)根据鼠标事件参数获取在全景图中的位置- parameters:鼠标事件参数MouseEvent
return: 数组 - [pitch, yaw]
resize容器大小改变后需要调用此方法重新布局全景destroy销毁getContainer获取容器domgetConfig获取配置对象getPitch获取全景图中心点俯仰角setPitch(pitch, animated, callback, callbackArgs)设置全景图中心点俯仰角- parameters:
- pitch:number 俯仰角
- animated:(boolean|number) 移动动画时间(ms),默认1000,设为
false则没有动画 - callback(callbackArgs):function 移动动画完成
- callbackArgs:any 传给callback的参数
- return: viewer
- parameters:
getPitchBounds获取俯仰角范围,返回 - [minpitch, maxpitch]setPitchBounds获取俯仰角范围,参数 - [minpitch, maxpitch]getYaw获取全景图中心点偏移角setYaw(yaw, animated, callback, callbackArgs)设置全景图中心点偏移角- parameters:
- yaw:number 偏移角
- animated:(boolean|number) 移动动画时间(ms),默认1000,设为
false则没有动画 - callback(callbackArgs):function 移动动画完成
- callbackArgs:any 传给callback的参数
- return: viewer
- parameters:
getYawBounds获取偏移角范围,返回 - [minyaw, maxyaw]setYawBounds获取偏移角范围,参数 - [minyaw, maxyaw]getHfov获取全景图水平视野setHfov(hfov, animated, callback, callbackArgs)设置全景图水平视野- parameters:
- hfov:number 水平视野
- animated:(boolean|number) 移动动画时间(ms),默认1000,设为
false则没有动画 - callback(callbackArgs):function 移动动画完成
- callbackArgs:any 传给callback的参数
- return: viewer
- parameters:
getHfovBounds获取水平视野范围,返回 - [minhfov, maxhfov]setHfovBounds获取水平视野范围,参数 - [minhfov, maxhfov]lookAt(pitch, yaw, hfov, animated, callback, callbackArgs)将视图中心聚焦到指定位置
parameters:
pitch:number 目标
pitchyaw:number 目标
yawhfov:number 目标
hfovanimated:(boolean|number) 移动动画时间(ms),默认1000,设为
false则没有动画callback(callbackArgs):function 移动动画完成
callbackArgs:any 传给callback的参数
return: viewer
startAutoRotate(speed, pitch)开始自动旋转- parameters:
- speed:number 旋转速度/方向
- pitch:number 旋转俯仰角
- return: viewer
- parameters:
stopAutoRotate停止自动旋转stopMovement停止所有移动loadScene(sceneId, pitch, yaw, hfov)加载指定场景getScene获取当前场景sceneIdaddScene(sceneId, config)添加场景removeScene(sceneId)移除场景toggleFullscreen切换全屏isLoaded全景图是否加载完成on(eventName, callback)监听事件,详情见上文事件on(eventName, callback)移除事件
自定义热点图标
自定义热点图标可用以下两种方式:
createTooltipFunc直接对参数(图标dom)进行dom操作,是在默认图标的基础上调整cssClass通过添加自定义css类来完全自定义图标样式,高度定制化样式则推荐这种方式
动态添加热点
1 | viewer.on("mouseup", e => { |
1 | //上面直接监听mouseup在拖动位置时会意外触发,可封装点击事件解决: |
- 本文作者: MR-QXJ
- 本文链接: https://mr-qxj.github.io/2021/10/25/其他/Pannellum/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
