1. 小行星开场效果
来自1.20及以上版本皮肤中的效果修改。如果使用系统自带的皮肤,可以在skin_settings中设置:
littleplanetintro="false"
以下是实现方法,调用即会显示
<action name="skin_setup_littleplanetintro_custom">
set(global.lpinfo, scene=get(xml.scene), hlookat=get(view.hlookat), vlookat=get(view.vlookat), fov=get(view.fov), fovmax=get(view.fovmax), limitview=get(view.limitview) );
set(view, fovmax=170, limitview=lookto, vlookatmin=90, vlookatmax=90);
set(layer[cross_menu].visible, false);
lookat(calc(global.lpinfo.hlookat - 0), 90, 150, 1, 0, 0);
delayedcall (0.5,
start_custom_view();
);
</action>
<!--小行星结束后进入正常视角-->
<action name="start_custom_view">
set(control.usercontrol, off);
set(view, limitview=get(lpinfo.limitview), vlookatmin=null, view.vlookatmax=null);
tween(view.hlookat|view.vlookat|view.fov|view.distortion, calc('' + lpinfo.hlookat + '|' + lpinfo.vlookat + '|' + lpinfo.fov + '|' + 0.0), 3.0, easeOutQuad);
delayedcall(3.0,
set(control.usercontrol, all);
tween(view.fovmax, get(lpinfo.fovmax));
delete(global.lpinfo);
);
</action>
2. 动态热点
使用png图片序列,重复切割显示达到动态的效果,调用的方法:
<!--参数分别是 每一帧宽、高,以及帧率-->
<action name="do_crop_animation" scope="local" args="framewidth, frameheight, framerate">
calc(local.xframes, (caller.imagewidth /framewidth) BOR 0);
calc(local.frames, xframes * ((caller.imageheight / frameheight) BOR 0));
def(local.frame, integer, 0);
calc(caller.crop, '0|0|' + framewidth + '|' + frameheight);
setinterval(calc('crop_anim_' + caller.name), calc(1.0 / framerate),
if(caller.loaded,
inc(frame);
if(frame GE frames, if(caller.onlastframe !== null, callwith(caller, onlastframe() ) ); set(frame,0); );
mod(xpos, frame, xframes);
div(ypos, frame, xframes);
Math.floor(ypos);
mul(xpos, framewidth);
mul(ypos, frameheight);
calc(caller.crop, xpos + '|' + ypos + '|' + framewidth + '|' + frameheight);
,
clearinterval(calc('crop_anim_' + caller.name));
);
);
</action>
3. Hotspot或Layer显示网页
<hotspot name="iframelayer"
url="black.png"
ath="0" atv="0"
distorted="true"
renderer="css3d"
onloaded="delayedcall(0,add_iframe('https://www.krpano.com', 640, 360));"
/>
<!--添加一个iframe用以显示网页-->
<action name="add_iframe" type="Javascript">
var iframe = document.createElement("iframe");
iframe.style.position = "absolute";
iframe.style.left = 0;
iframe.style.top = 0;
iframe.style.width = "100%";
iframe.style.height = "100%";
iframe.style.border = 0;
iframe.src = args[1];
iframe.setAttribute('id',resolve(caller.name));
caller.registercontentsize(args[2], args[3]);
caller.sprite.appendChild(iframe);
caller.sprite.style.webkitOverflowScrolling = "touch";
caller.sprite.style.overflowY = "auto";
caller.sprite.style.overflowX = "auto";
</action>
如同上面的热点一样,如果使用热点,则需设置 render="css3d"
,此时热点如同 layer 一样,作为一个html元素存在于页面上。同时由于hotspot不直接支持网页,需要设置一张透明或黑色图片作为url。
4. Hotspot Layer 循环
<!--layer 类似 -->
for(set(i,0),i LT hotspot.count,inc(i),
hotspot[get(i)]
);
5. 空白预览全景
只需要一个网格或空白的时候(网格颜色可设置透明):
<krpano>
<preview type="grid(CUBE,16,16,512,0xCCCCCC,0xFFFFFF,0x999999);" />
</krpaon>
6. js动态添加一个 events
krpano.set('events[test_event].keep', true);
krpano.set('events[test_event].onidle', 'trace(view.fov);');
7. flat图的真实fovmax
flat图的fov都很小,当设置的fovmax比较大的时候几乎等于无效。测试发现当设置了一个fovmax,例如为10之后,虽然缩小到最小了,但fovmax并不为10,也就是实际的fovmax和设置的fovmax不一样。且不会自己更新为实际的。
可以使用如下方法获取真实的fovmax:
<events name="f" onresize="set_fovmax()"/>
<action name="set_fovmax">
div(imageratio, image.hfov, image.vfov);
div(screenratio, stagewidth, stageheight);
if(imageratio LT screenratio,
set(view.fovtype, HFOV);
copy(view.fovmax, image.hfov);
,
set(view.fovtype, VFOV);
copy(view.fovmax, image.vfov);
);
</action>