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

发布者:屠龙

转载请注明出处,谢谢!

时间: 2024-10-20 07:36:11

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

成都三屏互动旋转屏 经典案例展示

武汉绘芯科技有限公司成立于2009年,是一家在武汉市具有较高影响力.地位和声誉的多媒体智能化系统工程服务商. 我司主要经营:滑轨屏.全息柜.双屏及多屏互动.虚拟主持人.虚拟翻书.幻影成像.投影互动.一体机.拼接屏等其他多媒体定制方案. 此次我司承接了成都某大型企业的三屏互动旋转屏项目.在19年春节前,我司已完成了该项目的初步安装,由于时间关系,该项目的调试放到春节后.这不,节后一上班,我们的工程师就立马去了现场,对整个项目进行调试.和大家简单介绍一下,这个项目的工作原理及调试情况 : 一. 运动

19.液晶屏的原理

19.液晶屏的原理 LCD工作原理解析: 1.LCD硬件体系架构: LCD硬件体系:可以看到LCD控制器是在ARM处理器里的,用排线将LCD液晶屏和处理器连接在一起.中间是通过了LCD驱动芯片. 1.1液晶: 液晶属于一种有机化合物,分子形状为长棒状,在不同的电流作用下,分子会做有规律的旋转,这样对光线(背光灯产生)产生了一定的控制(折射),形成一个像素,而很多像素又可构成完整图像. 1.3 LCD驱动芯片: LCD驱动芯片是控制液晶分子发生变化的模块,它为液晶分子的偏转提供电压.通常情况下,L

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

unity3d外包就找动点软件承接虚拟现实项目外包 承接U3D.Kinect.VR虚拟现实,增强现实,体感互动,大屏互动等各类外包 联系请加QQ:372900288 联系电话:13911652504 我们制作各类型严肃游戏,虚拟现实,增强现实项目! 品质保证,售后完备. 我们团队成立于2011年10月,是一个专业从事严肃游戏研发的团队,主做:Unity3D外包.VR虚拟现实外包.AR增强现实外包 .3DSMAX.MAYA建模外包.大屏互动外包.体感互动外包. 我们能为您提供的服务 一.项目负责

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

H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 假设有5个页面,每个页面占屏幕100%宽,则创建一个DIV容器viewport,将其宽度(width) 设置为500%,然后将5个页面装入容器中,并让这5个页面平分整个容器,最后将容器的默认位置设置为0,overflow设置为hidden,这样屏幕就默认显示第一个页面. <div id="v

仿 惠锁屏 侧滑锁屏的原理

上面是效果图. 锁屏 总体来说 注意的地方 就两点  一个是  关闭电源 重启 的时候 保证  锁屏界面可以出现, 另一个就是  按home键的时候 不要返回 桌面. 对于  唤醒 电源键  和重启手机时候 弹出锁屏界面 ,可以通过监听 电源 唤醒的 广播,开机广播. 1) 待机: 广播消息:android.intent.action.SCREEN_OFF 2) 唤醒: 广播消息:android.intent.action.SCREEN_ON  3) 开机 广播消息:android.intent

CSS-页面滑屏滚动原理

现在的网站有的时候为了简洁就是很多的单页滑屏滚动介绍,主要呈现方式有两种,一种是整体的元素一直排列下去,假设有五个需要展示的全屏页面,那么高度是500%,只是展示100%,剩下的可以通过transform进行Y轴定位,也可以通过margin-top实现,第二种就是所有的子元素和页面一样,都显示在当前页面,简单的实现第一种页面. Html代码: <div class="container"> <div class="wrapper"> <

手机投屏技术原理

基础概念 DLNA DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟), 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Living Network Alliance) 由索尼.英特尔.微软等发起成立.旨在解决个人PC,消费电器,移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务的无限制的共享和增长成为可能,目前成员公司已达280多家.

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/   android长截屏原理 小米系统自带的长截屏应该很多人都用过,效果不错.当长截屏时listview就会自动滚动,当按下停止截屏时,就会得到一张完整的截屏. 该篇就介绍一下长截屏的原理 上篇中介绍了android屏幕共享实现方式,该篇的原理和上一篇基本一致. 获取view影像 当我们想得到一个view

电容式触摸屏原理

一.电容屏工作原理 触摸屏的工作原理概括来说就是上报坐标值,X轴.Y轴的值.前面我们分析了电阻触摸屏,它是通过ADC来检测计算X.Y轴坐标值,下面我们分析一下电容触摸屏的工作原理,看它是如何去检测计算X.Y坐标的值. 与电阻式触摸屏不同,电容式触摸屏不依靠手指按力创造.改变电压值来检测坐标的.电容屏通过任何持有电荷的物体包括人体皮肤工作.(人体所带的电荷)电容式触摸屏是由诸如合金或是銦錫氧化物(ITO)这样的材料构成,电荷存储在一根根比头发还要细的微型静电网中.当手指点击屏幕,会从接触点吸收小量