前端实现全景图1

使用前端可视化界面的方案:xml+krpano

约定开发命名规则
    a. XML标签中,自定义变量,方法,函数,都需使用下划线 _ 方式进行命名连接,禁止使用驼峰命名;
    b. XML调用js函数以 handle_xxx开头;
    c. 属性值不区分大小写,系统属性值-统一采用大写,自定义属性值采用小写加下划线;
    d. 所有标签中,name必须是唯一值,有重复会覆盖;
项目所需标签记录, xml中所有标签及元素都不区分大小写:
1. krpano 根标签所有xml文件都需要包含在 krpano 标签下,必须设置,且可以标签可以嵌套多次,
    a. 属性:version当前版本
<krpano version="1.20.7">
    ...
</krpano>
2. scene 场景标签,属性:name 是必须值,切换场景需要用到这个值
<krpano version="1.20.7">
    <scene name="scene_hongqi">
      ...
  </scene>
</krpano>  
3. preview 预览图标签,属性:
    a. url 全景图路径;type(SPHERE,CYLINDER,CUBESTRIP)默认SPHERE(球形);
<krpano version="1.20.7">
    <scene name="hong_qi">
      <preview url="img/hongqi_1.jpg" type="SPHERE"></preview>
  </scene>
</krpano>
4. view 视图标签,属性:
    a. hlookat 水平视角(-180~180),水平方向;
    b. vlookat 垂直视角(-90~90),垂直方向;
    c. hlookatmin 视角左侧限制范围, 范围:-180—180,默认值:-180    此处参数要慢慢修改,不断调整参数,反复预览 ;
    d. hlookatmax 视角右侧限制范围,范围:-180—180,默认值:180;
    e. vlookatmin 视角向上限制范围,范围:-90—0,默认值:-90;
    f. vlookatmax 视角向下限制范围,范围:0—90,默认值:90;
    g. fovtype 视角类型,默认MFOV(VFOV垂直视角,HFOV水平视角,DFOV对角线视角,MFOV最大视角);
    h. fov 默认缩放视角FOV,初始化默认视角FOV,默认90;
    i. fovmin 缩放最小FOV,缩放最小FOV(场景拉近),必须小于初始FOV,默认60;
    j. fovmax 缩放最大FOV,缩放最大FOV(场景拉远),必须大于初始FOV,默认150;
    k. maxpixelzoom 缩放视角比例,范围:1.0—5.0。数值越大 拉近距离越近;
<krpano version="1.20.7">
    <scene name="scene_hongqi">
    <preview url="img/hongqi_1.jpg" type="SPHERE" />
    <view hlookat="0" vlookat="0" hlookatmin="-180" hlookatmax="180" vlookatmin="-90" vlookatmax="90" fovtype="MFOV" fovmin="60" fovmax="150" fov="90" />
    </scene>
</krpano>
5. hotspot热点标签,分为内置属性和自定义属性:
    a. 内置属性:
    i. name 热点名称;
    ii. url 热点路径;
    iii. ath 热点坐标H,图中热点坐标H;
    iv. atv 热点坐标V,图中热点坐标V;
    v. scale 热点缩放,1为原始大小,0.1~0.9等小数值为缩小,大于1数值为放大;
    vi. zoom 热点缩放跟随,热点是否跟随场景缩放,默认true;
    vii. onloaded 热点加载事件,会写一些内置的action;
    viii. onclick 热点点击事件,切换场景及查看设备信息;
    b. 自定义属性:
    i. device_type 设备类型,设备类型热点,场景切换热点,不填则默认场景切换热点;
    ii. device_title 设备提示标题,热点上方显示名称,持续显示,仅对“设备类型热点”类型有效;
    iii. target_scene 目标场景,热点跳转的目标场景;
<krpano version="1.20.7">
    <scene name="scene_hongqi">
    <preview url="img/hongqi_1.jpg" type="SPHERE" />
    <view hlookat="0" vlookat="0" hlookatmin="-180" hlookatmax="180" vlookatmin="-90" vlookatmax="90" fovtype="MFOV" fovmin="60" fovmax="150" fov="90" />
    <hotspot name="spot_scene" url="icon/hotspot.png" ath="0" atv="0" scale="0.6" zoom="true" />
    </scene>
</krpano>
6. acion 自定义动态代码标签,类似 js 中的 function,属性:
    a. name 函数名称,全局唯一;
    b. scope 作用域类型,global,local,parent;
    c. args 参数列表;
    d. 标签内部实现,函数操作;
<krpano version="1.20.7">
    <scene name="scene_hongqi">
    <preview url="img/hongqi_1.jpg" type="SPHERE" />
    <view hlookat="0" vlookat="0" hlookatmin="-180" hlookatmax="180" vlookatmin="-90" vlookatmax="90" fovtype="MFOV" fovmin="60" fovmax="150" fov="90" />
    <hotspot name="spot_scene" url="icon/hotspot.png" ath="0" atv="0" scale="0.6" zoom="true"
             device_type="" device_title="" target_scene="scene_xiaoshang"
             onloaded="hotspot_do_animation();"
             onclick="hotspot_click();"/>
    </scene>
  <scene name="scene_xiaoshang">
    <preview url="img/hongqi_2.jpg" type="SPHERE" />
    <view hlookat="0" vlookat="0" hlookatmin="-180" hlookatmax="180" vlookatmin="-90" vlookatmax="90" fovtype="MFOV" fovmin="60" fovmax="150" fov="90" />
    </scene>
  <!-- 热点增加动画 -->
  <action name="hotspot_do_animation" scope="local">
      calc(local.xframes, (caller.imagewidth /128) BOR 0);
    calc(local.frames, xframes * ((caller.imageheight / 128) BOR 0));
    def(local.frame, integer, 0);
    calc(caller.crop, '0|0|' + 128 + '|' + 128);
    setinterval(calc('crop_anim_' + caller.name), 0.03,
    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, 128);
    mul(ypos, 128);
    calc(caller.crop, xpos + '|' + ypos + '|' + 128 + '|' + 128);
      ,
    clearinterval(calc('crop_anim_' + caller.name));
    );
    ,10);
  </action>
  <!-- 热点切换场景 -->
  <action name="hotspot_jump_scene" scope="local" args="jump_scene">
    loadscene(get(jump_scene),null,MERGE,ZOOMBLEND(2.0, 2.0, easeInOutSine));
  </action>
  <!-- 热点显示标题,device_title 字段 -->
  <action name="hotspot_show_title">
    txtadd(tooltipname, 'tooltip_', get(name));
    addplugin(get(tooltipname)); txtadd(plugin[get(tooltipname)].parent, 'hotspot[',get(name),']');
    set(plugin[get(tooltipname)].url,'%SWFPATH%/plugins/textfield.swf');
    set(plugin[get(tooltipname)].align,top);
    set(plugin[get(tooltipname)].edge,bottom);
    set(plugin[get(tooltipname)].x,0);
    set(plugin[get(tooltipname)].y,0);
    set(plugin[get(tooltipname)].autowidth,true); 
    set(plugin[get(tooltipname)].autoheight,true);
    set(plugin[get(tooltipname)].background,false);
    set(plugin[get(tooltipname)].border,false);
    set(plugin[get(tooltipname)].css,'text-align:center; color:#FFFFFF; font-family: PingFangSC-Medium,PingFang SC; font-weight:bold; font-size:16px;');
    set(plugin[get(tooltipname)].textshadow,1);
    set(plugin[get(tooltipname)].textshadowrange,6.0);
    set(plugin[get(tooltipname)].textshadowangle,90);
    copy(plugin[get(tooltipname)].html,hotspot[get(name)].device_title);
    set(plugin[get(tooltipname)].enabled,false);
  </action>
  <!-- 热点点击显示对话框 -->
  <action name="hotspot_click">
    js(handleClickHotSpots(get(device_type),get(target_scene)));
  </action>
</krpano>
// 全局方法
function handleClickHotSpots(deviceType,targetScene) {
    if(deviceType){
    console.log('这里做弹框操作');
    } else {
    // 这里执行场景切换逻辑
    var krpano = document.getElementById('krpanoSWFObject');
    krpano.call(`hotspot_jump_scene(${targetScene})`);
    }
}

 前端js操作 krpano,进行切换场景

// 获取对象krpano
var krpano = document.getElementById("krpanoSWFObject");
// 执行一个krpano的内部动作或自定义动作,例如js操作跳转场景
krpano.call("hotspot_jump_scene('scene_hongqi');");

 

posted on 2022-06-21 11:45  忘忧很努力呀~  阅读(219)  评论(0编辑  收藏  举报