# krpano-learn **Repository Path**: h7374521/krpano-learn ## Basic Information - **Project Name**: krpano-learn - **Description**: 学习krpano而创建的仓库 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-03-04 - **Last Updated**: 2025-03-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 跟着[krpano中文网](http://www.krpano360.com/)的入门教程一步步尝试, 然后零零散散地记一些笔记: > krpano version: 1.20.9 # 起步 使用下载的krpano文件夹中的工具可直接生成本demo # [循序渐进(6)- 为何本地预览时在浏览器中显示错误](http://www.krpano360.com/xunxujianjin6-weihehtmlwenjianzailiulanqizhongxianshiheipingcuowu/) ## 编辑漫游 文中使用编辑工具加载`tour.xml`设置了启动视角, 并添加了一个热点, 发现这个加载的xml文件中就有了相应的修改变动: 启动视角: ``` ``` 热点: ``` ``` 文中提供了一个看示例的方法运行`krpano`文件夹里面的`krpano Testing Server.exe`, 然后修改本地文件夹为: `D:/{krpano目录}/viewer/`, 接着点击这个测试服务器下方的`Sever Address`即可, 然后能看到`/viewer`目录下的文件, 点击相应的`example`即可, 选择完毕之后地址会变为: `http://192.168.3.38:8090/krpano.html?xml=examples/animated-hotspots/anihotspots.xml`, 后面发现是因为`/example/index.html`里面有个一个`meta`标签的内容是: ``` ``` 这导致页面渲染到浏览器的时候直接浏览器做了刷新操作, `url`被替换成了这个`meta`标签的`content`中的`url`, 我自己也写了一个`html`文件试了试, 发现浏览器解析到`html`文件的`meta`标签的时候时`url`就被变更了, 后面的内容都不会被解析, `body`中的`js`也不会被执行 查看`w3c`文档之后发现这个操作相当于是给`响应头`里添加了一个键值对: ``` refresh: 0; url=../../krpano.html?xml=examples/demotour-corfu/tour.xml ``` ## 参数问题 工具制作成的漫游项目的启动代码如下: ``` embedpano({ swf:"tour.swf", xml:"krpano.xml", target:"pano", html5:"auto", mobilescale:1.0, passQueryParameters:true }); ``` `passQueryParameters`设置为`true`, 此时表示能从`url`中接收`查询字符串参数`, 比如启动之后`url`为这样: ``` http://192.168.3.101:8090/tour.html?xml=/tour.xml ``` 那么此时, `krpano`将只会加载`tour.xml`而不会加载配置中的`xml`的值`krpano.xml`, 相反, 如果此时`url`上没有参数, 则只会加载`krpano.xml` ## 启动问题 通过xhr加载xml的问题, 这是由于浏览器的CORS策略导致的, 解决方法有两个: 1. https://krpano.com/docu/localusage/#changebrowsersettings, 修改浏览器的策略 2. 使用服务器环境, 比如直接用自带的`krpano testing server` 这里需要注意的是, 为了让服务器环境能正常启动生效, 路径里面不要带中文, 同时, 在学习过程中, 可能会遇到需要频繁查看`krpano`官方示例的情况, 那么此时可以使用`/vtour/tour_testingserver.exe`来启动我们自己的`demo`, 用`krpano`包里的`krpano testing server`来启动官方示例(`Local Folder`选到`viewer`文件夹即可), 这样就能一边写`demo`一边看官方示例了 # [循序渐进(11)- 1.19版本的默认tour.xml解析与换肤](http://www.krpano360.com/xunxujianjin11-tour-xmldejingtaidaimadouyoushenmezuoyong/) ## skin_settings标签 - `littleplanetintro`: 是否使用小行星开场 (其他标签可查看文章) ### 覆盖已经定义的xml配置(小行星开场) 给`embedpano`做如下设置能覆盖原本的配置, 从而打开小行星入场: ``` vars: { "skin_settings.littleplanetintro": "true" } ``` `embedpano`方法接收的参数具体可以查看[Embedding into HTML](https://krpano.com/docu/html/) ### 设置小行星视角的第三种方式 ``` initvars: { "view": "planet" } ``` 这个方法会在加载`xml`之前执行, 以及这个视角设置之后视角会一直保持小行星视角, 而且距离会很远, 不像`vars`设置的那样 ## include标签 这个用于嵌入另一个`xml`标签, 由于`xml`的执行顺序也是从上到下的, 因此如果`a.xml`嵌入`b.xml`: ``` ``` ``` ``` 这样的写法, `b.xml`中的配置会被`a.xml`给覆盖了, 反之如果`include`写在后面, 则是`a.xml`中的配置会被`b.xml`中的给覆盖 # [循序渐进(12)- krpano的内置元素](http://www.krpano360.com/krpanode26geneizhiyuansu/) ## 自定义右键菜单 通过`xml`中的`contextmenu`标签来自定义右键菜单, 比如自带的视角切换是英文的, 可以修改成中文的: ``` //... //... ``` ``` //... //... ``` 但更自由的, 比如右键菜单中新增一个里面没有的项目, 然后做其他的功能, 比如点击之后打开一个弹窗这个暂时不了解, 目前唯一确定的就是其他的功能不比如小行星视角, 调用了一个叫`skin_view_littleplanet`的方法(`action`): ``` tween(view.architectural, 0.0, distance(1.0,0.5)); tween(view.pannini, 0.0, distance(1.0,0.5)); tween(view.distortion, 1.0, distance(1.0,0.8)); tween(view.fov, 150, distance(150,0.8)); tween(view.vlookat, 90, distance(100,0.8)); tween(view.hlookat, calc(view.hlookat + 100.0 + 45.0*random), distance(100,0.8)); skin_deeplinking_update_url(1.0); ``` 那么解法就在于在`action`标签中写代码了, 我推测这也是`krpano`的一个难点, 也就是它里面代码的语法规则是怎样的, 是如何被解析的 ## 路径占位符 [url](https://krpano.com/docu/xml/#url) `krpano`使用一些约定的占位符来解决路径层级过深的问题, 相当于目前前端工程化项目中的`@`指代`src`那样 ## krpano和js之间的交互 [krpano js interface](https://krpano.com/docu/js/#top) [External / Javascript Interface](https://krpano.com/docu/actions/#js) ### krpano调用js 法一: 这会是一个核心的内容, 探索了一下, `krpano`中调用`js`确实需要用到`action`: ``` console.log(123); ``` 比如使用的时候, 右键点击项被点击之后调这个方法: ``` ``` 那么这个`js`方法就会被执行 法二: 更常见的情形是我们的`js`代码没写在`krpano`的`action[type="Javascript"]`中, 就在我们的项目里, 此时如果遇到`krpano`调用的话, `krpano`也提供了调用的接口或者说调用的处理方式: `js`: ``` function foo(param) { console.log('foo invoked', param); } ``` `krpano action`: ``` tween(view.architectural, 0.0, distance(1.0,0.5)); tween(view.pannini, 0.0, distance(1.0,0.5)); tween(view.distortion, 1.0, distance(1.0,0.8)); tween(view.fov, 150, distance(150,0.8)); tween(view.vlookat, 90, distance(100,0.8)); tween(view.hlookat, calc(view.hlookat + 100.0 + 45.0*random), distance(100,0.8)); skin_deeplinking_update_url(1.0); js(foo(abc)); ``` 这里还是以`小行星视角`的`action`为例, 在里面加上一行: ``` js(foo(abc)); ``` 那么切换`小行星视角`的时候我们就能通过`krpano`调用`js`方法`foo`, 最终输出: ``` foo invoked abc ``` 同时需要注意的是, `js`中定义的方法要写在`全局`, 也就是要写到`window`上, 否则`krpano`无法调到 ### js调用krpano 方法一: 右键菜单中加一项, 点击之后执行`js`并调用`小行星`视角方法 ``` ``` ``` console.log(123); krpano.call("skin_view_littleplanet();"); ``` 方法二: 这是官方文档中推荐的一个方法, 但这是`onready`这生命周期执行之后调用, 实际情况要看是否需要在该生命周期中执行 ``` embedpano({ //... onready: krpano => { krpano.call("skin_view_littleplanet();"); } //... }); ``` 往后看的过程中发现, 有一个场景可能比较常见: 直接在`js`代码中的任意位置随意调用`krpano`的方法; 而`krpano`这个实例只能在`action[type="Javascript"]`中访问到, 而这个里面能写`js`, 那么我可以在项目一开始加载的时候将`krpano`实例设置到`window`对象上即可, 此时的`window`对象可以理解为`JSBridge`, 一个桥梁, 一个连接`js`和`krpano`的桥梁, 具体写法如下: ``` ``` 这里的`autorun="preinit"`表示: ``` preinit - 'Pre-Initialize' - run this action at initialization before any other event or action (also before the onstart event). Will be called only ONCE. > 在初始化时, 任何其他事件和动作(也在onstart事件)之前执行, 它只会被执行一次 ``` 看了官网文档的解释, 给这个`action`设置`autorun="preinit"`再合适不过 此时如果我们需要在`js`代码里切换`小行星视角`, 那么此时就可以这么写: ``` window.krpano.call('skin_view_littleplanet'); ``` 这样的写法也可以: ``` window.krpano.call('skin_view_littleplanet()'); ``` 但私以为第一种写法要更合适, 毕竟我们要调用`skin_view_littleplanet`这个方法, 那么给它传方法名即可, 而不是方法的调用, 除非这个方法调用之后返回另一个方法, 但观察`krpano`的例子发现, 在标签中调用`action`的方式是这样的: ``` //... onclick="skin_view_stereographic();" //... ``` 就是还是加了`()`, 尝试后发现这样不加`()`也是可以的: ``` ``` 以及我们的切换`小行星视角`: ``` onclick="skin_view_littleplanet" ``` 这里需要注意的是这个标签: ``` ``` 论坛中`krpano`的作者`Klaus Reinfeld`回复说这是为了防止某些字符在解析`xml`时导致`xml解析错误`而设置的, 他推荐的处理方式是: 无论如何都加上; 原贴如下: [Question about 'CDATA' inside JavaScript type action in xml](https://krpano.com/forum/wbb/index.php?page=Thread&threadID=16034) 这里不特指写`js`的时候需要加, 作者只是以`js`来举例, 同时在后面的学习中发现`krpano`自己的`action`中也出现了这个标签, 但写`js`的时候推荐加上, 理由就是防止出现解析报错的问题出现 # [修改默认皮肤缩略图文字大小](http://www.krpano360.com/%e4%bf%ae%e6%94%b9%e9%bb%98%e8%ae%a4%e7%9a%ae%e8%82%a4%e7%bc%a9%e7%95%a5%e5%9b%be%e6%96%87%e5%ad%97%e5%a4%a7%e5%b0%8f/) 加载一些`xml`配置是通过`action`标签里写的方法实现的, 比如修改一个默认皮肤的样式, 这个样式是被`action`标签加载进来的, 比如`缩略图文字样式`的`style`: ``, 首先显示缩略图文字的设置在这: `tour.xml`: ``` ``` `thumbs_text`改为`true`即可, 然后具体样式在样式标签中修改, 比如改个字号: ```