# 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`即可, 然后具体样式在样式标签中修改, 比如改个字号:
```