xl-pano
v0.5.5
Published
一个基于 Typescript 的,同时支持立方体和球体场景的轻量开源库。
Downloads
19
Readme
XLPano 全景引擎
介绍
XLPano 是一个基于 Typescript 的轻量的全景开源库。使用 WebGL1.0 实现,同时支持立方体场景和球体场景。
示例地址
https://breeze-blowing.github.io/xlpano/index.html
安装
本库提供了直接使用 <scrpit>
标签引入方式和 npm
包两种方式
标签引入
<script src="xlpano.min.js"></script>
npm 安装
npm install xl-pano --save
或者 yarn add xl-pano
使用
本库提供了四个关键的类,完成全景的搭建。
- 引入 Pano, CubeScene(立方体场景,六面体贴图), SphereScene(球体场景,长宽2:1贴图), HotSpot
// 全局变量方式引入
const { Pano, CubeScene, SphereScene, HotSpot } = window.XLPano;
// ESM 方式引入
import { Pano, CubeScene, SphereScene, HotSpot } from 'xl-pano';
// CommonJS 方式引入
const { Pano, CubeScene, HotSpot } = require('xl-pano');
- 构建全景
// 创建 pano,containerId 是容器 dom 节点的 id
const pano = new Pano('containerId');
// 创建 CubeScene,立方体贴图按照[前, 右, 上, 左, 下, 后]的顺序添加
const cubeScene = new CubeScene([f, r, u, l, d, b]);
// 创建 hotSpot,传入热点元素,目标场景索引,俯仰角,偏航角
const hotSpot = new HotSpot(HtmlElement, 1, { pitch: -10, yaw: 55 });
// 创建 SphereScene,传入宽高2:1场景贴图
const sphereScene = new SphereScene(image);
// scene 添加 hotSpot
cubeScene.addHotSpots(hotSpot);
// pano 添加 scene
pano.addScene(cubeScene);
pano.addScene(sphereScene);
// 渲染整个 pano
pano.render();
完整示例查看 /example 目录
特别注意
- 本库使用 WebGL1.0 实现,场景贴图的宽高尺寸值必须是2的n次幂
- 本库没有做降级处理,对于不支持 WebGL1.0 的浏览器,无法使用本库
文档
Pano
一个全景能包含多个场景,Pano 作为整个全景的管理者,管理所有的场景,控制着场景的切换。
构造函数
const pano = new Pano('containerId');
| 参数名 | 说明 | 类型 | 必填 | 默认值 | 备注 | | --- | --- | --- | --- | --- | --- | | id | 容器 id | string | 是 | - | - | | debug | 是否开启 debug | boolean | 否 | false | WebGL相关方法发生的错误并不会直接抛出来,难以定位问题;开启 debug 会打印这些错误;生产环境请关闭 debug |
实例方法
- addScene
说明:添加场景,场景是承载画面的实例,被添加进 pano 的场景才能显示,具体内容看
Scene
文档接口:(scene: Scene) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 备注 | | --- | --- | --- | --- | --- | | scene | 场景实例 | Scene | 是 |
Scene
是接口,具体使用CubeScene
或者SphereScene
|返回值:无
- render
- 说明:渲染全景,执行该方法发后在页面显示全景。在执行 render 前请先添加好场景。
- 接口:() => void
- 参数:无
- 返回值:无
- setScene
说明:通过该方法,能任意设置当前场景,前提是被设置的场景已经通过
addScene
方法被添加到 pano 中了。接口:(scene: scene: Scene | number) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 备注 | | --- | --- | --- | --- | --- | | scene | 场景实例或者场景索引 | Scene 或 number | 是 | 索引是场景被添加到 pano 的顺序值 |
返回值:无
- getCurrentScene
- 说明:获取当前场景实例
- 接口:() => Scene
- 参数:无
- 返回值:当前场景实例
- addListener
说明:添加监听函数
接口:(type: ListenerType, callback: ListenerCallback) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 备注 | | --- | --- | --- | --- | --- | | type | 事件类型 | ListenerType | 是 |
sceneChange
| 目前只有场景变换一种事件类型 | | callback | 回调函数 | ListenerCallback | 是 |SceneChangeCallback
| 方法参数见下面文档 |SceneChangeCallback 方法
场景变化回调函数,
type === 'sceneChange'
被执行接口:(scene: Scene, index: number) => void
回调参数:
| 参数名 | 说明 | 类型 | 备注 | | --- | --- | --- | --- | | scene | 场景实例 | Scene | 变化后的场景实例 | | index | 场景索引 | number | 索引是场景被添加到 pano 的顺序值 |
- removeListener
说明:移除监听函数
接口:(type: ListenerType, callback: ListenerCallback) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 可选值 | 备注 | | --- | --- | --- | --- | --- | --- | | type | 事件类型 | ListenerType | 是 |
sceneChange
| 目前只有场景变换一种事件类型 | | callback | 回调函数引用 | ListenerCallback | 是 |SceneChangeCallback
|addListener
传入方法的引用 |
- removeAllListeners
- 说明:移除所有监听,一般在销毁的时候调用
- 接口:() => void
- 参数:无
- 返回值:无
Scene
Scene (场景)是真正渲染画面的载体;Scene
本身是一个接口,不能直接实例化使用。
本库提供了 CubeScene
(立方体场景) 和 SphereScene
(球体场景) 两种场景。
CubeScene 和 SphereScene 相同的实例方法
addHotSpots
说明:添加热点,热点是附着在场景上的 dom 节点,具体内容看
HotSpot
文档接口:(hotSpots: HotSpot | HotSpot[]) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 备注 | | --- | --- | --- | --- | --- | | hotSpots | 热点实例 | HotSpot 或 HotSpot[] | 是 | 可以添加单个热点或热点数组 |
返回值:无
addListener
说明:添加监听函数
接口:(type: SceneListenerType, callback: SceneListenerCallback) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 可选值 | 备注 | | --- | --- | --- | --- | --- | --- | | type | 事件类型 | SceneListenerType | 是 |
angleChange
| 目前只有角度变换一种事件类型 | | callback | 回调函数 | SceneListenerCallback | 是 |SceneAngleChangeCallback
| 方法参数见下面文档 |SceneAngleChangeCallback 方法
场景变化回调函数,
type === 'angleChange'
被执行接口:(angle: SceneAngle) => void
回调参数:
| 参数名 | 说明 | 类型 | 备注 | | --- | --- | --- | --- | | angle | 场景角度 | SceneAngle | 变化后的角度,具体看上面
SceneAngle
文档 |
removeListener
说明:移除监听函数
接口:type: SceneListenerType, callback: SceneListenerCallback) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 可选值 | 备注 | | --- | --- | --- | --- | --- | --- | | type | 事件类型 | SceneListenerType | 是 |
angleChange
| 目前只有角度变换一种事件类型 | | callback | 回调函数引用 | SceneListenerCallback | 是 |SceneAngleChangeCallback
|addListener
传入方法的引用 |
removeAllListeners
- 说明:移除所有监听,一般在销毁的时候调用
- 接口:() => void
- 参数:无
- 返回值:无
getAngle
- 说明:获取当前角度
- 接口:() => SceneAngle
- 参数:无
- 返回值:场景角度,类型参考下面
SceneAngle
文档
setAngle
说明:设置场景角度
接口:(angle: SceneAngle, options?: { animation?: boolean, duration?: number, callback?: VoidFunction}) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 默认值 | 备注 | | --- | --- | --- | --- | --- | --- | | angle | 场景角度 | SceneAngle | 是 | - | 类型参考下面
SceneAngle
文档 | | options | 可选参数 | 参考下面文档 | 否 | { animation: false, duration: 500, callback: () => {} } | - |options 可选参数:
| 参数名 | 说明 | 类型 | 必填 | 默认值 | 备注 | | --- | --- | --- | --- | --- | --- | | animation | 切换过程是否需要动画 | boolean | 否 | false | - | | duration | 动画执行时间 | number | 否 | 500 | 毫秒 | | callback | 切换完场景后的回调函数 | VoidFunction | 否 | - | - |
getFovy
- 说明:获取视角范围
- 接口:() => number
- 参数:无
- 返回值:视角范围
setFovy
说明:设置视角范围,增大会有离远的视觉效果,减小会有走近的视觉效果
接口:(fovy: number, options?: { animation?: boolean, duration?: number, callback?: VoidFunction}) => void
参数:
| 参数名 | 说明 | 类型 | 必填 | 默认值 | 备注 | | --- | --- | --- | --- | --- | --- | | fovy | 视角范围 | number | 是 | - | 小于 180 | | options | 可选参数 | 参考 setAngle 的 options 参数 | 否 | { animation: false, duration: 500, callback: () => {} } | - |
CubeScene 单独接口
立方体场景,也称天空盒,需要前后左右上下六张贴图构建场景。
构造函数
const cubeScene = new CubeScene([f, r, u, l, d, b], { yaw: 50, pitch: 20 });
| 参数名 | 说明 | 类型 | 必填 | 默认值 | 备注 |
| --- | --- | --- | --- | --- | --- |
| textures | 贴图数组 | TextureSource[] | 是 | - | 六个面的贴图,需按照 前-右-上-左-下-后 的顺序;类型详细说明见 TextureSource
文档 |
| defaultAngle | 初始角度 | SceneAngle | 否 | { yaw: 0, pitch: 0 } | 类型详细说明见 SceneAngle
文档 |
- TextureSource 贴图资源:可以是网络资源链接地址,也可以是
TexImageSource
对象。通过new Image()
可以实例化一个TexImageSource
对象;在使用TexImageSource
对象实例化CubeScene
对象前,请先确保TexImageSource
的图片资源已经加载完成。 - SceneAngle 场景角度:有两个属性,pitch(俯仰角) 和 yaw(偏航角)。对于全景而言,俯仰角一般在 [-90, 90] 度范围之间;偏航角理论上可以无限的旋转, 但是为了方便理解,本库会默认将偏航角转换到 [0, 360) 度的范围
实例方法
- replaceTextures
- 说明:替换贴图
- 接口:(textures: TextureSource[]) => void
- 参数:参考构造函数中的 textures 参数
- 返回值:无
SphereScene 单独接口
球体场景,仅需要一张宽高长度比 2:1 的贴图即可构建场景。
构造函数
const scene = new SphereScene(sphereImg, { yaw: 80, pitch: 10 });
| 参数名 | 说明 | 类型 | 必填 | 默认值 | 备注 |
| --- | --- | --- | --- | --- | --- |
| texture | 贴图 | TextureSource | 是 | - | 需要宽高比2:1的贴图,TextureSource
具体参考上面文档 |
| defaultAngle | 初始角度 | SceneAngle | 否 | { yaw: 0, pitch: 0 } | 类型详细说明见 SceneAngle
文档 |
实例方法
- replaceTextures
- 说明:替换贴图
- 接口:(texture: TextureSource) => void
- 参数:参考构造函数中的 texture 参数
- 返回值:无
关于 Scene 的 replaceTextures 接口
- CubeScene 和 SphereScene 都有 replaceTextures 方法,参数类型相同;只不过 CubeScene 需要六张图,SphereScene 只需要一张图
- 因为本库没有提供单独的资源加载接口,资源加载是在 render 阶段执行的,加载完资源后才真正绘制场景,因此直接使用高清网络资源图会出现白屏现象。 可以在 Scene 的构造函数中使用低清缩略图来加速首屏显示,然后同时加载高清资源图,加载完成后使用 replaceTextures 替换首屏贴图
- 同时 XLPano 库内部会对非首个场景的网络资源图有预加载机制,所以在切换场景时,一般不会存在白屏问题
HotSpot
热点是附着在场景上的 dom 节点,会跟随场景转动,还内置了被点击切换场景的功能
构造函数
const hotSpot = HotSpot(dom, { pitch: -10, yaw: 10, target: 1 });
| 参数名 | 说明 | 类型 | 必填 | 默认值 | 备注 | | --- | --- | --- | --- | --- | --- | | dom | dom对象 | HTMLElement | 是 | - | 热点本质是一个dom对象,需要自己构建后传入构造函数 | | option | 可选参数 | 参考下面文档 | 否 | { yaw: 0, pitch: 0 } | 参考下面文档 |
- option 参数:有 yaw、pitch 和 target 三个属性,都是可选属性
- yaw 和 pitch 分别为初始偏航角和初始俯仰角,可参考上面 SceneAngle 的定义
- yaw 和 pitch 的初始值是相对于 scene 的偏航角和俯仰角都是 0 的基础的;若添加热点的时候,场景有默认角度,则首次渲染热点的时候会添加场景的默认角度
- target 表示目标场景索引,如果传入了该属性,且目标场景存在,则点击该热点,会切换到目标场景
- 如果不传 target 属性,库不会对热点做任何默认操作,你可以对 dom 做自定义操作