KRPano多屏互动原理
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多屏互动原理的更多相关文章
- [Mugeda HTML5技术教程之16]案例分析:制作跨屏互动游戏
本节我们将要做一个跨屏互动应用的案例分析,该应用时给一家商场做活动使用的,是一个跨屏爱消除游戏.PC端页面显示在连接在PC的大屏幕上,参与活动的玩家可以用自己的手机扫描PC端页面上的二维码,连接成功后 ...
- [Mugeda HTML5技术教程之12]制作跨屏互动应用
mugeda动画平台还可以用来制作跨屏互动的动画应用,比如在PC端的大屏幕上显示动画的主界面,同时会显示出供手机扫描的二维码,手机扫描后会在手机上显示手机端动画界面.通过手机就可以和PC端的显示界面跨 ...
- U3D外包公司—北京动点(公司性质)承接U3D、Kinect、VR虚拟现实,增强现实,体感互动,大屏互动等各类外包
unity3d外包就找动点软件承接虚拟现实项目外包 承接U3D.Kinect.VR虚拟现实,增强现实,体感互动,大屏互动等各类外包 联系请加QQ:372900288 联系电话:13911652504 ...
- H5单页面手势滑屏切换原理
H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...
- CSS-页面滑屏滚动原理
现在的网站有的时候为了简洁就是很多的单页滑屏滚动介绍,主要呈现方式有两种,一种是整体的元素一直排列下去,假设有五个需要展示的全屏页面,那么高度是500%,只是展示100%,剩下的可以通过transfo ...
- web 多屏互动显示方案
1 基于 local storage 实现的信息传递 相关插件 lsbridge.js https://github.com/krasimir/l... 且项目中有非常简单易懂的示例你需要了解的一些关 ...
- 解析电子墨水屏技术(工作原理与LCD的区别)【转】
转自:https://blog.csdn.net/weixin_42509369/article/details/84646808 阅读电子书早已成为大家生活中一部分,方便轻巧的电子版书籍更便于携带, ...
- 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 ...
- krpano下全屏后弹窗失效问题解决方法
原因 krpano 自身的全屏仅全屏自身,以外的html效果将无法显示 解决方法 把全屏按钮换成浏览器自身的全屏效果 解决步骤 vtourskin.xml <layer name="n ...
- CDN技术详解及实现原理
CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...
随机推荐
- 你还在用Object.equals()方法吗?
前言 当<阿里巴巴Java开发手册>发布后,我也是仔细进行了阅读,想从中找出一些"标准",让自己的代码质量提高.手册中对 Object 的 equals 方法的使用进行 ...
- 有关 python 切片的趣事
哈喽大家好,我是咸鱼 今天来讲一个我在实现 python 列表切片时遇到的趣事 在正式开始之前,我们先来了解一下切片(slice) 切片操作是访问序列(列表.字符串......)中元素的另一种方法,它 ...
- 高精度减法(模板yxc)
#include <bits/stdc++.h> using namespace std; bool cmp(vector<int> &A, vector<int ...
- 深入探究for...range语句
1. 引言 在Go语言中,我们经常需要对数据集合进行遍历操作.对于数组来说,使用for语句可以很方便地完成遍历.然而,当我们面对其他数据类型,如map.string 和 channel 时,使用普通的 ...
- tvm relay IR 可视化
本文地址: https://www.cnblogs.com/wanger-sjtu/p/16819877.html 发现最近relay 的可视化已经在tvm主线上支持了,这里有一个简单的demo代码记 ...
- memcached使用中踩的一些坑
背景 线上启用memcached(以下简称mc)作为热点缓存组件已经多年,其稳定性和性能都经历住了考验,这里记录一下踩过的几个坑. 大key存储 某年某月某日,观察mysql的读库CPU占比有些异常偏 ...
- 快速上手 vercel,手把手教你白嫖部署上线你的个人项目
一.关于 vercel Vercel 是一个云服务平台,支持静态网站(纯静态页面,比如现在base utils 文档也是基于vercel)和动态网站的应用部署.预览和上线.如果你用过 GitHub P ...
- T-star高校挑战赛部分wp
web-1签到 checkin还是很基础的 网站上传存在js检测,禁用js即可上传 写PHP一句话木马上传,http://588f25a5.yunyansec.com/upload/test.php连 ...
- mysql:EXPLAIN
推荐阅读原文:EXPLAIN用法和结果分析 语法:EXPLAIN SELECT * FROM t1 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句 ...
- Kafka主从模式和故障切换
Kafka集群有主从模式吗? Kafka集群实际上并没有严格意义上的主从模式.Kafka的设计是基于分布式的,每个Topic都会切分为多个Partition,每个Partition都有一个Leader ...