Marzipano-3D全景图最优雅的打开方式

简介: 有时候需要开发简单的全景图,在上面打几个交互点而已,不想引入three.js这大家伙,这时你一定要用谷歌的Marzipano!

有时候需要开发简单的全景图,在上面打几个交互点而已,不想引入three.js这大家伙,这时你一定要用谷歌的Marzipano!

1.全景图

全景图就是一种广角图,可以360度查看,感觉就像是身临其境的感觉,经常用于虚拟旅游、3D看房、地图街景等。

20230520\_094745.gif

2.Marzipano

  • 基于Webgl技术的轻量级全景图展示器,性能绝佳
  • 支持html和css创建交互
  • 支持所有主要的桌面浏览器和移动设备。
  • 可显示任何尺寸的全景图,支持球体(等矩形)和立方体格式

官网地址:https://www.marzipano.net/

github地址:https://github.com/google/marzipano

API文档地址:https://www.marzipano.net/reference/

3.开启全景图的漫游之旅

官方单立方体全景图示例:https://www.marzipano.net/demos/cube-single-res/

1)安装使用

 <script src="marzipano.js"></script>


 npm install marzipano

 import Marzipano from 'marzipano';

 var viewer = new Marzipano.Viewer(document.getElementById('pano'));

注意:需配置viewport,避免渲染错误

<meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui" /> 
<style>@-ms-viewport {
    
     width: device-width; }</style>

2)创建图源


var source = Marzipano.ImageUrlSource.fromString(
  "//www.marzipano.net/media/cubemap/{f}.jpg"
);

image.png

立方体图源说明:f前,b后,u上,d下,l左,r右

3)创建立方体视图

//创建形状
var geometry = new Marzipano.CubeGeometry([{
   
    tileSize: 1024, size: 1024 }]);
//矩形视图限制 traditional(立方面大小, 最大垂直视角, 最大横向视角(可选))
var limiter = Marzipano.RectilinearView.limit.traditional(4096, 100*Math.PI/180);
//创建视图
var view = new Marzipano.RectilinearView(null, limiter);

4)初始化场景

// 创建场景
var scene = viewer.createScene({
   
   
  source: source,//图源
  geometry: geometry,//形状
  view: view,//视图
  pinFirstLevel: true
});

// 展示场景
scene.switchTo();

20230520\_101745.gif

5)equirectangular等距圆柱体格式

angra.jpg

//创建图源
var source = Marzipano.ImageUrlSource.fromString(
  "//www.marzipano.net/media/equirect/angra.jpg"
);

//创建等圆柱体形状
var geometry = new Marzipano.EquirectGeometry([{
   
    width: 4000 }]);

//创建视图
var limiter = Marzipano.RectilinearView.limit.traditional(1024, 100*Math.PI/180);
//RectilinearView(初始化视角,视图限制)
var view = new Marzipano.RectilinearView({
   
    yaw: Math.PI }, limiter);

20230520\_103003.gif

6)控制视角

视角说明:

image.png

  • yaw:围绕 y 轴旋转,偏航角,默认0
  • pitch:围绕 x 轴旋转,俯仰角,默认0
  • roll:围绕 z 轴旋转,翻滚角,默认0
  • fov:视场角,视野范围角度,默认45度,数值越大,看到的场景范围越大

获取视角


var yaw = view.yaw();//偏航角
var pitch = view.pitch();//俯仰角
var fov = view.fov();      // 横向视场角
var vfov = view.vfov();//横向视场角
var hfov = view.hfov();    //纵向视场角

设置视角

//方法1,设置目标视角,让场景看向对应的角度
var destinationViewParameters = {
   
   
  yaw: 10 * Math.PI/180,
  pitch: 15 * Math.PI/180,
  fov: 60 * Math.PI/180
};

var options = {
   
   
  transitionDuration: 2000
}

scene.lookTo(destinationViewParameters, options);

//方法2
view.setYaw(45 * Math.PI/180);
view.setPitch(30 * Math.PI/180);
view.setFov(60 * Math.PI/180);

//方法3
view.setParameters({
   
   
  yaw: 45 * Math.PI/180,
  pitch: 30 * Math.PI/180,
  fov: 60 * Math.PI/180
});

//方法4,相对于当前视角的偏移
view.offsetYaw(10 * Math.PI/180);
view.offsetPitch(10 * Math.PI/180);
view.offsetFov(10 * Math.PI/180);

7)添加交互点

  • 交互点样式,需设置禁止浏览器默认行为
.interface {
   
    
-moz-user-select: none;
-webkit-user-select: none; 
-ms-user-select: none;
user-select: none; 
-webkit-user-drag: none;
-webkit-touch-callout: none;
-ms-content-zooming: none;
}

//dom样式
#hotspot {
   
   
        background-color: rgba(0, 0, 0, 0.5);
        border-radius: 4px;
      }
      #hotspot .detail {
   
   
        white-space: pre-wrap;
        word-wrap: break-word;
      }
      #hotspot .header {
   
   
        border-bottom: solid 1px white;
      }
      #hotspot > .info-box {
   
   
        width: 160px;
        display: none;
        color: white;
        font-size: 16px;
        line-height: 32px;
        padding: 0 10px;
      }
      #hotspot:hover > .info-icon {
   
   
        display: none;
      }
      #hotspot:hover > .info-box {
   
   
        display: block;
      }
  • 交互点html
<div class="interface" id="hotspot">
      <img src="info.png" class="info-icon" />
      <div class="info-box">
        <div class="header">Marzipano</div>
        <div class="detail">Marzipano,Marzipano,Marzipano,Marzipano,Marzipano,Marzipano</div>
      </div>
    </div>
  • 添加交互点
//交互点位置
var position = {
   
    yaw: Math.PI / 4, pitch: 0, fov: Math.PI / 8 };
var element = document.getElementById('hotspot');
//添加到场景中
scene.hotspotContainer().createHotspot(element, position);

交互点位置,位置是基于视角的,转到什么视角就能看到该交互点

20230520\_114535.gif

8)切换全景图

 function switchScene1() {
   
   
        //初始化新全景图...        
        scene.switchTo();
         var switchImage = document.createElement('img');
        switchImage.src = 'link.png';
       //全景图添加交互点进行切换场景交互
        scene.hotspotContainer().createHotspot(switchImage, position);
        //添加交互动作
        switchImage.onclick = (ev) => {
   
   
          switchScene2();
        };
 }

20230520\_121249.gif

分别在两个场景中添加对应的场景切换点就可以进行场景之间的切换,如果是连续的全景图就可以做成移步换景的感觉了

总结

Marzipano全景图真的轻量又好用,它还能实现里再嵌套的视频地图,多层全景图叠加等功能,挺厉害的!我这里只是简单介绍了常用的部分,更高级的功能请到官网上仔细研究,示例很多,讲得都特别详细!

相关文章
无需cad,从dwg文件中读取缩略图
无需cad,从dwg文件中读取缩略图
|
10月前
|
存储
Photoshop合并多个图片为PDF格式文件的(PDF文件编辑删除页面及合并的操作方法)解决方案
Photoshop合并多个图片为PDF格式文件的(PDF文件编辑删除页面及合并的操作方法)解决方案
196 0
|
5月前
在word、ppt、excel编辑软件标题栏顶部左上角加入自定义功能:另存为、导出PDF
在word、ppt、excel编辑软件标题栏顶部左上角加入自定义功能:另存为、导出PDF
|
定位技术
一步到位, ArcGIS Pro区位图教学来啦
一步到位, ArcGIS Pro区位图教学来啦
310 0
|
7月前
[笔记]黑科技:文件隐藏在图片里
[笔记]黑科技:文件隐藏在图片里
|
9月前
|
人工智能 编解码
Photoshop的AI功能上新:截图→背景填充一气呵成,再也不怕没拍全了
Photoshop的AI功能上新:截图→背景填充一气呵成,再也不怕没拍全了
107 0
|
10月前
|
数据处理 Windows
成信大ENVI_IDL第二周课堂内容:打开HDF4文件并读取文件以及简单的数据处理和保存+详细解析
成信大ENVI_IDL第二周课堂内容:打开HDF4文件并读取文件以及简单的数据处理和保存+详细解析
268 1
|
数据处理 数据格式
Adobe Acrobat PDF编辑器,具备创建阅读编辑合并PDF的功能
Adobe Acrobat PDF编辑器,具备创建阅读编辑合并PDF的功能
150 0
PPT - 双屏幕情况下,如何设置 PPT 不在主屏幕显示问题?
PPT - 双屏幕情况下,如何设置 PPT 不在主屏幕显示问题?
423 0
PPT - 双屏幕情况下,如何设置 PPT 不在主屏幕显示问题?