进阶教程(11)- 自定义指南针

为什么说是自定义指南针,这是因为指南针的heading值(即是控制指南针正确朝向的数值)是由我们定义的。真正的指南针,其方向就是指北,你永远都不需要指定heading值,像krpano自身也有指南针插件,它是直接调用手机上的指南针来找出对应的方位,无需人工干预。但事实上我还没遇到过国内有真正把指南针插件拿来商用的案例。

但在自定义地图中。例如房地产、旅游景区中,对朝向、方向的指示是有迫切需求的。但不可能用移动设备上的指南针,因此一个虚拟的指南针更有利于用户体验。krpano的官方案例提供了三种指南针样式。它的位置在krpano-1.17.5\examples\xml-usage\compass 。

三种样式分别是两种表盘和一个文字样式。表盘的一个为固定盘转动针,一个是固定针转动盘。而文字样式则是八个方向的热点显示在全景中。相比而言,从酷炫效果来说,肯定是表盘效果更赞,但文字热点明显更直观。

首先我们得把对应表盘的图片复制到我们的项目文件夹,这几乎是我们每次移花接木之前要做的必选动作了。只有把对应的图片拷贝到正确的文件夹,才能保证xml的路径能够正确地对应到文件。目前官方案例的自定义指南针的heading为0的时候就是默认向北,也就是说,如果你拍全景的时候第一张是朝正北的话,同时ptgui拼接的时候没有在X轴上移动的话,那么view.hlookat为0也就是对着正北。这么说的话,假如你拍摄的是这一组全景图全部都是对着正北,你就能确保所有场景的指南针都是heading为0,也就是你无需调整在每个场景载入时调整。但如果不是这样的话,你就需要在每个场景都要设定heading。

例如

  1. <scene
    name="scene_a3kt"
    title="A户型75㎡"
    onstart=""
    thumburl="panos/a3kt.tiles/thumb.jpg"
    lat=""
    lng=""
    heading=""
    compass_heading="50">

我在这里把每个场景的heading值用scene里的自定义属性compass_heading来表示。也就是你只需要在每个scene写个数字就可以了。

然后把所有的其他玩意,包括events元素、action元素以及plugin元素写在scene标签的外面。

  1. <!--
    events, 在场景开始时设定heading,在视角变化时执行action -->
  2. <events
    onxmlcomplete="c_startup();"
  3. onviewchange="rotatecompasses();"
  4. />
  5. <!--
    设定 heading, 添加文字方向热点-->
  6. <action
    name="c_startup">
  7. <!--
    设定 HEADING -->
  8. copy(heading, scene[get(xml.scene)].compass_heading);
  9. action(add_compass_spots);
  10. </action>
  11. <!--
    改变指南针表盘或指针图像的旋转 -->
  12. <action
    name="rotatecompasses">
  13. sub(plugin[compass_pointer].rotate, view.hlookat, heading);
  14. sub(plugin[compass2_plate].rotate, heading, view.hlookat);
  15. </action>
  16. <!--
    指南针样式一 (右侧的) -->
  17. <!--
    指南针表盘 -->
  18. <plugin
    name="compass"
    url="compass.png"
    keep="true"
    zorder="1"
    children="false"
  19. align="righttop"
    x="10"
    y="10"
  20. scale="1.0"
    scalechildren="true"
  21. destscale="1.0"
  22. onclick="switch(destscale,1.0,0.5);tween(scale,get(destscale));"
  23. heading="0"
  24. />
  25. <!--
    表针, 根据"onviewchange" 进行旋转 -->
  26. <plugin
    name="compass_pointer"
    url="compass_pointer.png"
    keep="true"
    handcursor="false"
  27. parent="compass"
    zorder="1"
  28. align="center"
  29. />
  30. <!--
    指南针玻璃效果 (flash 下有效, html5不支持 blendmode ) -->
  31. <plugin
    name="glass"
    devices="flash"
    url="glass.jpg"
    keep="true"
    enabled="false"
  32. blendmode="screen"
    alpha="0.5"
  33. parent="compass"
    zorder="2"
  34. align="center"
  35. />
  36. <!--
    指南针样式二 (左侧) -->
  37. <!--
    指南针表盘 -->
  38. <plugin
    name="compass2"
    url="compass.png"
    keep="true"
    zorder="1"
    children="false"
  39. align="lefttop"
    x="10"
    y="10"
  40. scale="1.0"
    scalechildren="true"
  41. destscale="1.0"
  42. onclick="switch(destscale,1.0,0.5);tween(scale,get(destscale));"
  43. />
  44. <!--
    表盘随着"onviewchange" 改变旋转 -->
  45. <plugin
    name="compass2_plate"
    url="compass_plate.png"
    keep="true"
    handcursor="false"
  46. parent="compass2"
    zorder="1"
  47. align="center"
  48. />
  49. <!--
    固定的表针 -->
  50. <plugin
    name="compass2_pointer"
    url="compass_pointer.png"
    keep="true"
    handcursor="false"
  51. parent="compass2"
    zorder="2"
  52. align="center"
  53. />
  54. <!--
    指南针2外部固定的环 -->
  55. <plugin
    name="compass2_ring"
    url="compass_ring.png"
    keep="true"
    handcursor="false"
  56. parent="compass2"
    zorder="3"
  57. align="center"
  58. />
  59. <!--
    指南针2玻璃 (flash下有效, 因为HTML5不支持 blendmode) -->
  60. <plugin
    name="glass2"
    devices="flash"
    url="glass.jpg"
    keep="true"
    enabled="false"
  61. blendmode="screen"
    alpha="0.5"
  62. parent="compass2"
    zorder="4"
  63. align="center"
  64. />
  65. <!--
    动态创建文字方向热点 -->
  66. <action
    name="addspot">
  67. addhotspot(%1);
  68. set(hotspot[%1].url,%CURRENTXML%/hotspots.png);
  69. set(hotspot[%1].crop,%3);
  70. add(hotspot[%1].ath,%2,heading);
  71. set(hotspot[%1].atv,0);
  72. set(hotspot[%1].scale,%4);
  73. set(hotspot[%1].scale1,%4);
  74. mul(hotspot[%1].scale2,%4,2);
  75. set(hotspot[%1].zoom,true);
  76. set(hotspot[%1].onover,tween(scale,get(scale2)));
  77. set(hotspot[%1].onout,tween(scale,get(scale1)));
  78. set(hotspot[%1].onclick,lookto(get(ath),get(atv),90,smooth(),true,true));
  79. </action>
  80. <action
    name="add_compass_spots">
  81. addspot(n, 0, 0|0| 76|76, 1.0);
  82. addspot(no, 45, 78|0|118|76, 0.5);
  83. addspot(o, 90, 202|0| 71|76, 1.0);
  84. addspot(so, 135, 281|0|109|76, 0.5);
  85. addspot(s, 180, 400|0| 69|76, 1.0);
  86. addspot(sw, 225, 469|0|134|76, 0.5);
  87. addspot(w, 270, 603|0| 86|76, 1.0);
  88. addspot(nw, 315, 689|0|141|76, 0.5);
  89. </action>
时间: 2024-10-09 12:51:14

进阶教程(11)- 自定义指南针的相关文章

Android高手进阶教程(三)之----Android 中自定义View的应用.

大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习惯了Android 传统的页面布局方式,如下代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertic

shell进阶教程

背景:就自己常用的shell脚本写作风格,总结了一些知识点.也是作为交接工作的一部分文档.部分内容单独写 #!/bin/sh # shell脚本进阶教程 # 1.常用知识点:变量设置/日期设置/格式化输出/定义函数/函数传参/脚步传参/变量的嵌套和迭代 # 2.常用环境:/数据库监控/本地日志监控/批量处理/定期获取表数据/备份 # 3.常用循环:for/while # 4.常用命令:sed/cut/awk/ # 5.crontab 计划任务 # 第一部分:常用知识点 # 1.[变量设置及变量替

duilib进阶教程 -- 响应windows原生消息和自定义消息(13)

duilib进阶教程 -- 响应windows原生消息和自定义消息(13) 一.windows原生消息 同样,入门教程只是给出了响应windows原生消息的方法,并没给出例子,这里以自适应屏幕分辨率为例.迅雷播放器虽然可以在启动的时候自动调整窗口大小,但是当屏幕分辨率实时改变时并没有调整窗口,所以我们给播放器加上实时调整大小的功能,很明显,应该响应WM_DISPLAYCHANGE消息,而duilib自己处理windows消息的函数是在HandleMessage里,因此我们重载HandleMess

Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!

分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloaderencoding 大家好,相信大家用的ListView控件一定很多的,是竖向滑动的,复用convertView,我们可以加载成千上万的数据,但有时候我们会有 这个需求比如相册,我们想横向滑动,并且数据有好多,这时候ViewPager控件就派上用场了,ViewPager使用时候我们需要导入第三方包 an

ABP进阶教程6 - 功能按钮

点这里进入ABP进阶教程目录 下载插件 打开Datatables官网(https://datatables.net/download/) 勾选Extensions/Buttons,下载插件,复制到JD.CRS.Web.Mvc\wwwroot\lib\dataTables目录. 引入插件 打开展示层(即JD.CRS.Web.Mvc)的Views/Course/Index.cshtml //Course查询视图 添加以下代码,引入插件. <link href="~/lib/dataTables

【v2.x OGE教程 11】 动画编辑器帮助文档

[v2.x OGE教程 11] 动画编辑器帮助文档 版本号 日期 作者 说明 1.0 2014-9-3 橙子游戏 文档创建       一.简单介绍 动画编辑器用于游戏动画的可视化编辑,支持序列帧动画和关键帧动画.通过解析生成的数据文件就可以获取动画信息,并能随时调整,以降低开发工作量.提高开发效率. 二.相关概念 1. 帧 帧是动画在某个时间点的状态.一系列的帧组成了动画的时间线.动画播放时.通过帧的切换,实现动画效果 2. 序列帧 序列帧组成序列帧动画,这样的动画中.仅通过静态图片的切换来实

Nodejs爬虫进阶教程之异步并发控制

Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回答才会再加载一部分,所以说如果直接发送一个问题的请求链接,取得的页面是不完整的.还有就是我们通过发送链接下载图片的时候,是一张一张来下的,如果图片数量太多的话,真的是下到你睡完觉它还在下,而且我们用nodejs写的爬虫,却竟然没有用到nodejs最牛逼的异步并发的特性,太浪费了啊. 思路 这次的的爬

点赞和吐糟Adblock Plus~进阶教程

前言:Adblock Plus后文都简称ABP,这是一篇ABP进阶教程!用ABP实现flashBlock和NoScript.推荐有相当基础的阅读!初学者先看懂这里:http://adblockplus.org/zh_CN/filters 先夸夸ABP,它是最流行.语法最完善严谨的过滤软件,其它同类都以它为标准!它把网络资源按以下选项分几大类: script -- 外部脚本,由 HTML script 标签加载 image -- 正常图片,通常由 HTML 的 img 标签所载入 styleshe

Numpy库进阶教程(二)

第一篇在这里:Numpy库进阶教程(一)求解线性方程组 求解特征值和特征向量 关于特征值和特征向量的介绍,可以点击这里 首先创建一个矩阵 In [1]: A=mat("3 -2;1 0") In [2]: A Out[2]: matrix([[ 3, -2], [ 1, 0]]) 在numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应特征向量的元组. 使用eigvals函数求解特征值 In [3]: linalg.eigval