KRPano可以实现多个屏幕之间的同步显示,主要应用到Websocket技术进行通信。

在控制端,我们需要发送当前KRPano场景的实时的视角和场景信息,可以使用如下的代码:

            embedpano({
swf: "tour.swf",
xml: "tour.xml",
target: "pano",
html5: "auto",
mobilescale: 1.0,
passQueryParameters: true,
onready: krpanoReady
}); function krpanoReady(krpano) {
krpano.call("trace(krpano is ready...)");
krpano.call("loadscene(scene_04, null, MERGE);")
initialWebSocket();
}
//实时发送KRPano的视角信息
function IntervalSendMessage() {
var krpano = document.getElementById("krpanoSWFObject"); if (krpano && krpano.get) {
var hlookat = krpano.get("view.hlookat");
var vlookat = krpano.get("view.vlookat");
var fov = krpano.get("view.fov");
var scene = krpano.get("xml.scene"); var krObj = {
hlookat: hlookat,
vlookat: vlookat,
fov: fov,
scene: scene
} ws.send(JSON.stringify(krObj));
}
}
var ws;
var WebSocketsExist; function initialWebSocket() {
WebSocketsExist = true;
try {
ws = new WebSocket("ws://localhost:8989/");
} catch (ex) {
try {
ws = new MozWebSocket("ws://localhost:8989/");
} catch (ex) {
WebSocketsExist = false;
}
}
if (WebSocketsExist) {
console.log("The current browser support websocket!");
} else {
console.log("The current browser not support websocket!")
return;
}
ws.onopen = WSonOpen;
ws.onmessage = WSonMessage;
ws.onclose = WSonClose;
ws.onerror = WSonError;
} function WSonOpen() {
console.log("websocket opened success!");
setInterval(IntervalSendMessage, 50);
}; function WSonMessage(event) {
console.log(event.data);
}; function WSonClose() {
console.log("Websocket closed.");
}; function WSonError() {
console.log("Websocket error occur.");
};

在被控制端,我们需要实时接收控制端传过来的视角信息,并周期性更新当前的视角和场景。

            embedpano({
swf: "tour.swf",
xml: "tour.xml",
target: "pano",
html5: "auto",
mobilescale: 1.0,
passQueryParameters: true
}); const WebSocket = require('ws'); const wss = new WebSocket.Server({
port: 8989
}); wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
krObj = JSON.parse(message);
var hlookat = krObj.hlookat;
var vlookat = krObj.vlookat;
var fov = krObj.fov;
var scene = krObj.scene;
var krpano = document.getElementById("krpanoSWFObject");
if (krpano && krpano.set) {
krpano.call("loadscene(get(" + "scene_04" + "), null, MERGE);")
krpano.set("view.hlookat", hlookat);
krpano.set("view.vlookat", vlookat);
krpano.set("view.fov", fov);
if (krpano.get("xml.scene") !== scene) {
//loadscene(get(startscene), null, MERGE);
krpano.call("loadscene(" + scene + ", null, MERGE);")
}
}
}); ws.send('something');
});

如果被控制端(如网页)无法直接创建WebSocket.Server,可以使用中间服务器进行中转,控制端和被控制端都连接至中间服务器,中间服务器负责把控制端的状态信息发送给被控制端。

本博文发表于:http://www.krpano.tech/archives/534

发布者:屠龙

转载请注明出处,谢谢!

KRPano多屏互动原理的更多相关文章

  1. [Mugeda HTML5技术教程之16]案例分析:制作跨屏互动游戏

    本节我们将要做一个跨屏互动应用的案例分析,该应用时给一家商场做活动使用的,是一个跨屏爱消除游戏.PC端页面显示在连接在PC的大屏幕上,参与活动的玩家可以用自己的手机扫描PC端页面上的二维码,连接成功后 ...

  2. [Mugeda HTML5技术教程之12]制作跨屏互动应用

    mugeda动画平台还可以用来制作跨屏互动的动画应用,比如在PC端的大屏幕上显示动画的主界面,同时会显示出供手机扫描的二维码,手机扫描后会在手机上显示手机端动画界面.通过手机就可以和PC端的显示界面跨 ...

  3. U3D外包公司—北京动点(公司性质)承接U3D、Kinect、VR虚拟现实,增强现实,体感互动,大屏互动等各类外包

    unity3d外包就找动点软件承接虚拟现实项目外包 承接U3D.Kinect.VR虚拟现实,增强现实,体感互动,大屏互动等各类外包 联系请加QQ:372900288 联系电话:13911652504 ...

  4. H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...

  5. CSS-页面滑屏滚动原理

    现在的网站有的时候为了简洁就是很多的单页滑屏滚动介绍,主要呈现方式有两种,一种是整体的元素一直排列下去,假设有五个需要展示的全屏页面,那么高度是500%,只是展示100%,剩下的可以通过transfo ...

  6. web 多屏互动显示方案

    1 基于 local storage 实现的信息传递 相关插件 lsbridge.js https://github.com/krasimir/l... 且项目中有非常简单易懂的示例你需要了解的一些关 ...

  7. 解析电子墨水屏技术(工作原理与LCD的区别)【转】

    转自:https://blog.csdn.net/weixin_42509369/article/details/84646808 阅读电子书早已成为大家生活中一部分,方便轻巧的电子版书籍更便于携带, ...

  8. Android 长截屏原理

    https://android-notes.github.io/2016/12/03/android%E9%95%BF%E6%88%AA%E5%B1%8F%E5%8E%9F%E7%90%86/   a ...

  9. krpano下全屏后弹窗失效问题解决方法

    原因 krpano 自身的全屏仅全屏自身,以外的html效果将无法显示 解决方法 把全屏按钮换成浏览器自身的全屏效果 解决步骤 vtourskin.xml <layer name="n ...

  10. CDN技术详解及实现原理

    CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...

随机推荐

  1. LeetCode刷题,代码随想录算法训练营Day3| 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

    链表理论基础 链表是通过指针串联在一起的线性结构,每个节点由一个数据域和一个指针域构成. 链表的类型 单链表 双链表 有两个指针域,一个指向下一个节点,一个指向上一个节点,既可以向前查询也可以向后查询 ...

  2. 为什么说 Go 语言字符串是不可变的?

    原文链接: 为什么说 Go 语言字符串是不可变的? 最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于 ...

  3. Galaxy生物信息分析平台的数据集对象清理

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. Galaxy Project 是在云计算背景下诞生的一个生物信息学可视化分析开源项目.该项目由 ...

  4. CF1442D Sum

    题意 有 \(n\) 个不降的非负整数数组,每个数组可以不取或取一个前缀,总共要取 \(k\) 个元素,问取到的和最大多少. 题解 结论题,但是想到结论还不会. 首先,我们只会有一个数组没选完,其它要 ...

  5. redis集群报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

    之前在x86架构的服务器部署redis集群,未遇到题中问题:然而在ARM架构的服务器部署redis集群,第一次遇到如此问题.虽然问题已经解决,但不清楚问题的具体原因,在此做个记录. 性能测试过程中,通 ...

  6. mysql处理delete后不释放磁盘空间

    myisam:optimize table table_name innodb:alter table table.name engine='innodb' 1. 问题描述在使用mysql的时候有时候 ...

  7. Visual Studio Code调试和发布ASP.NET Core Web应用

    前言 上一篇文章主要讲了Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用有兴趣的同学可以去看看,今天咱们主要是要讲讲如何在VS Code中调试和发布AS ...

  8. 零基础实现Java直播(二):实现流程

    一.前提条件 在实现Java直播前,请确保: 已在项目中集成 ZEGO Express SDK,详情请参考 快速开始 - 集成. 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 App ...

  9. 【调制解调】PM 调相

    说明 学习数字信号处理算法时整理的学习笔记.同系列文章目录可见 <DSP 学习之路>目录,代码已上传到 Github - ModulationAndDemodulation.本篇介绍 PM ...

  10. [Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC

    上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring ...