当前位置: 首页 > news >正文

基于web的全景—— Pannellum小试

前言

基于C端的业务需求,为了更好地服务于用户。需要在售卖端加上全景预览的功能,目前用的是 web开发的产品,需要基于web的全景预览功能。通过搜索查找比较,最终选择使用 pannellum

Pannellum 小试

官网的首页对 pannelum的描述是,'Pannellum is a lightweight, free, and open source panorama viewer for the web. Built using HTML5, CSS3, JavaScript, and WebGL, it is plug-in free.'

简而言之,pannelum是轻量的(只有20kB)、免费的、开源的一个基于web的全景插件。
那么从一个小小的demo开始。
HTML部分:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>全景</title>
    <!-- pannellum 自带的样式,必需 -->
    <link rel="stylesheet" href="https://cdn.pannellum.org/2.4/pannellum.css"/>
</head>

<body>
    <div id='vrview' class="container"></div>
    <!-- pannellum js库,必需 -->
    <script src="https://cdn.pannellum.org/2.4/pannellum.js"></script>
</body>

</html>

css代码:

<style>
    body, html {
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
    }
    .custom-hotspot {
        height: 50px;
        width: 50px;
        border-radius: 100%;
        box-shadow: 0 0 6px #fff;
        background: #fff;
    }
    div.custom-tooltip span {
        visibility: hidden;
        position: absolute;
        border-radius: 3px;
        background-color: #fff;
        color: #000;
        text-align: center;
        max-width: 200px;
        padding: 5px 10px;
        margin-left: -220px;
        cursor: default;
    }
    div.custom-tooltip:hover span{
        visibility: visible;
    }
    div.custom-tooltip:hover span:after {
        content: '';
        position: absolute;
        width: 0;
        height: 0;
        border-width: 10px;
        border-style: solid;
        border-color: #fff transparent transparent transparent;
        bottom: -20px;
        left: -10px;
        margin: 0 50%;
    }
</style>

js部分:

window.addEventListener('load', bodyLoad);
var p;
function bodyLoad() {
    // 多场景配置
    p = pannellum.viewer('vrview', {   
        "default": {
            "firstScene": "circle",
            "author": "Juven",
            "sceneFadeDuration": 1000,
            "orientationOnByDefault": true,
            "showControls": false,
            "autoRotate": -2,
            "autoRotateInactivityDelay": 2000
        },

        "scenes": {
            "circle": {
                "title": "Sea Circle",
                "hfov": 110,
                "pitch": -3,
                "yaw": 117,
                "type": "equirectangular",
                "panorama": "../assets/images/pic2.jpg",
                "hotSpots": [
                    {
                        "pitch": -2.1,
                        "yaw": 132.9,
                        "type": "scene",
                        "text": "Spring House or Dairy",
                        "sceneId": "house"
                    }
                ]
            },

            "house": {
                "title": "Spring House or Dairy",
                "hfov": 110,
                "yaw": 5,
                "type": "equirectangular",
                "panorama": "../assets/images/pic1.jpg",
                "hotSpots": [
                    {
                        "pitch": -0.6,
                        "yaw": 37.1,
                        "type": "scene",
                        "text": "Mason Circle",
                        "sceneId": "circle",
                        "targetYaw": -23,
                        "targetPitch": 2
                    }
                ]
            }
        }
    });
}

打开这个html文件,在windowload事件开始时执行初始化全景代码,其中pannellum对象是挂载在window对象下的,调用viewer方法来初始化并返回一个viewer实例,第一个参数是元素的id(也可以是HTMLElement元素),第二个事配置对象,该对象下面可以是一些基本的配置参数,也可以是由defaultscenes属性组成的配置项。初始化时,会将被挂载的元素append一些全景用到的元素。
clipboard.png

关于初始化配置,对于多场景的全景来说最好使用 defaultscenes属性组成的配置项。详细内容可参考原文:A tour configuration file contains two top level properties, default and scenes. The default property contains options that are used for each scene, but options specified for individual scenes override these options. The default property is required to have a firstScene property that contains the scene ID for the first scene to be displayed. The scenes property contains a dictionary of scenes, specified by scene IDs. The values assigned to these IDs are specific to each scene.

用到的参数

查看pannellum的文档,可以发现有很多功能丰富的配置项;在这里主要介绍一些常用到的配置;

firstScene

全景的默认场景,每个多场景的全景都需要在default里面配置此选项;

author

作者名称,全景图生成时,会在左下角显示此配置的值;

clipboard.png

sceneFadeDuration

全景图场景切换时的持续时间,单位为:毫秒,使用的动画效果默认为fade

orientationOnByDefault

是否开启重力感应查看全景图,默认false

showControls

是否显示控制按钮,默认true

autoRotate

是否自动旋转,在加载之后,全景图会水平旋转显示,负数为往右边旋转,整数为往左边旋转,值为数字类型;(目前还不知道数字代表是角速度还是什么

autoRotateInactivityDelay

autoRotate设定的情况下,用户停止操作多长时间后继续自动旋转,单位为毫秒;

scenes

场景,值为对象,其属性名代表着场景的id(sceneId),属性值为viewer的配置参数,其参数会覆盖默认(上述中的default对象)设置的参数;

hotSpots

热点,以全景为坐标系的固定点,可以设置链接跳转和点击事件,也可以跳转到不同的场景,该属性的值为对象,该对象有几个常用的配置项:

  • pitch 定位参数, 单位:角度
  • yaw 定位参数, 单位:角度
  • type 热点类型,scene 场景切换热点; info 信息展示;
  • URL 以热点为链接,跳转到其他页面的`url
  • sceneId 需要切换的场景id,当 typescene使用;

全景坐标示意图:
clipboard.png

(图片来源于网络)

总结

经过一个小小的示例测试,目前在PC端的Chrome浏览器运行正常流畅,在iPhoneSafari浏览器和微信运行流畅,在低版本Android微信运行略为卡顿,但还是能够接受的范围内;有个不好的地方就是pannellum的官方文档是全英文的(可能我没找到中文的)且解析的不够全面,示例也不足够多,总体来说pannellum还是不错的选择,有需要的同学可以考虑一下。

相关文章:

  • vlan
  • BTA 常问的 Java基础40道常见面试题及详细答案
  • ELK的心脏,ElasticSearch学习方法论
  • 达梦db遇到的一些SQL语句
  • [搬运]什么叫幂等性?
  • python学习之老男孩python全栈第九期_数据库day001知识点总结 —— MySQL操作数据库以及数据表、基本数据类型、基本增删改查、外键定义以及创建...
  • virtualenvwrapper
  • GetDlgItem的用法小结
  • MySQL——索引基础
  • 用Go语言实现微信支付SDK
  • 文档和元素的几何滚动
  • Java编程——数据库两大神器:索引和锁
  • 80% UI 初学者走过的弯路,你走了几条?
  • Numpy数值计算基础
  • MYSQL设置查询内存表大小
  • [译] 怎样写一个基础的编译器
  • Git的一些常用操作
  • Go 语言编译器的 //go: 详解
  • HTML中设置input等文本框为不可操作
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript设计模式系列一:工厂模式
  • MD5加密原理解析及OC版原理实现
  • python docx文档转html页面
  • Redis 懒删除(lazy free)简史
  • Zepto.js源码学习之二
  • 阿里云应用高可用服务公测发布
  • 什么是Javascript函数节流?
  • 时间复杂度与空间复杂度分析
  • 系统认识JavaScript正则表达式
  • 小试R空间处理新库sf
  • 赢得Docker挑战最佳实践
  • 怎么将电脑中的声音录制成WAV格式
  • 正则表达式小结
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $.each()与$(selector).each()
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)SpringCloud 整合Python
  • (13)Hive调优——动态分区导致的小文件问题
  • (六)软件测试分工
  • (排序详解之 堆排序)
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • .gitignore文件---让git自动忽略指定文件
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net打印*三角形
  • .NET中 MVC 工厂模式浅析
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /var/spool/postfix/maildrop 下有大量文件
  • :not(:first-child)和:not(:last-child)的用法
  • [20180129]bash显示path环境变量.txt
  • [2021 蓝帽杯] One Pointer PHP
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法