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
发布者:屠龙
转载请注明出处,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现