虚拟电子围栏

MMSDT.electronicFence()

       在虚拟场景中绘制电子围栏,实时监测是否有目标闯入。如有闯入,该段虚拟电子围栏变成色,自定义时间后恢复本身颜色,并传回当前闯入点坐标和闯入者id号。

       Tips: 利用该功能,在无实际围栏的情况下,可设置任意区域来检测闯入目标。因该功能为实时碰撞检测,如检测人员过多,可能会卡顿。

构造函数

      MMSDT.electronicFence( position: object, option:object, position: function )

       position - json格式,电子围栏坐标位置。

       option - json格式,参数设置。

       position - 回调函数,参数为闯入目标点的坐标数组和闯入者id号。

属性

       .add( arrayIndex )

       显示区域,arrayIndex 数组内的区域下标。

       .remove()

       移除所有区域。

代码示例

var MMS3D_exceptionMesh = []; //需要材质拆分的网格 var MMS3D_instancingMesh = ["shu"]; //合并实例化网格 //初始化场景 MMSDT.initScene( false, MMS3D_exceptionMesh, MMS3D_instancingMesh ); //设置第3人称鼠标控制器 controls3.maxPolarAngle = Math.PI*0.49; //向下,最大角度限制 controls3.maxDistance = 500; //最远距离限制 controls3.screenSpacePanning = false; //右键平移是否上下移动 controls3.enableDamping = true; //是否开启惯性阻尼 controls3.dampingFactor = 0.1; //惯性阻尼系数 //使用json文件让场景还原 MMSDT.onloadScene( "models/mms3D_fdc1.json", function(progress){ if( progress == 'done' ){ //加载完成,播放风机动画 for( var i=0; i<actions[0].length; i++ ){ actions[0][i].play(); } }else if( progress == 'ok' ){ //渲染完成 onloadDone(); }else{ //显示进度条数字 document.getElementById("loadNum").innerHTML = Math.round( progress )+'%'; } }); var positioning, fences; //定义人员定位 //场景加载完成 function onloadDone(){ //实时定位的参数设置 var parameters = { model: ['models/lvren.mms'], //需要定位的人物三维模型 scale: 4, //三维模型缩放大小 rotation: 0, //模型面向前,旋转偏移(弧度) icon: ['textures/icon.png'], //显示图标 color: 0xffffff, //图标默认颜色 height: 6, //图标相对高度 size: 3, //图标缩放大小 area: 'man', //图标所在区域 lookAt: false, //是否面向相机 animate: true, //是否上下浮动的动画 } //初始化GPS定位构建函数(模型参数,加载完成回调函数) positioning = new MMSDT.GPSpositioning( parameters, callback ); function callback(data){ if( data == 'done'){ console.log("定位人员加载完成"); positioning.styleChang(0x00ffff); //透视颜色 } } //实时定位人员模拟路径数据 MMSDT.getJson( "models/path1.json", function(dataJson){ var mans = ["毕昌远","胡婉清","吴成龙","龚均鸿","李娟","刘周","王宇","黄绒"] loopData(); setInterval(function(){ loopData(); //循环测试数据 },30000) function loopData(){ var testData=[]; for( var i=0; i<mans.length; i++ ){ var jsonTemp = { id: mans[i], //人员或车辆的ID号 arrayData: dataJson.explode[i], //二维数组坐标数据(至少两组以上) interval: 3000, //补间动画间隔时间 } testData.push(jsonTemp); } positioning.locations(testData); //更新定位数据 (数组对象的定位数据) } }); //对场景中包含子网格进行监听 var meshEvent = new MMSDT.mouseChildEvent( [] ); //移入场景模型 var onMove = function(name){} //移出场景模型 var outMove = function(){ } //移入设备图标 var onIot = function(icon){ MMSDT.superposition( icon.id,0xff0000 ); //指定图标变色 positioning.objectStyle( icon.id, 0xff0000 ); //对应的人员变色 document.body.title = '当前人员: ' + icon.id; //返回IoT设备的ID号 } //移出设备图标 var outIot = function(){ MMSDT.superposition(); //移出图标变色恢复 positioning.objectStyle(); //移出图标人员变色 document.body.title = ''; } MMSDT.mouseMoveEvent( onMove, outMove, onIot, outIot ); //初始化鼠标移入移出事件 //虚拟电子围栏的参数设置 var hurdles = [ { position: [ [-36,0,54], [-36,0,120], [-196,0,179], [-209,0,38],[-79,0,18] ], //电子围栏坐标点 color: 0x00ff00, //电子围栏颜色 height: 8, //电子围栏高度 visible: true, //默认显示 closed: true //是否封口 },{ position: [ [11,0,23], [70,0,15], [100,0,86], [70,0,104],[30,0,47] ], color: 0x00ff00, height: 8, visible: true, closed: false },{ position: [ [36,0,151], [75,0,148], [75,0,185], [36,0,185] ], color: 0x00ff00, height: 8, visible: true, closed: false } ] var options = { alarmColor: 0xff0000, //告警颜色 alarmArea: false, //告警变色区域,true整个围栏,false当前段 contTime: 5000, //持续时间 } var divInfo=[],list=0, divPos=[]; //初始化电子围栏 fences = new MMSDT.electronicFence( hurdles, options, function(pos,id){ //创建一个告警信息框 divInfo[list] = document.createElement("div"); divInfo[list].className = "infoBox"; divInfo[list].innerHTML = id + " !警告 !
电子围栏非法闯入"; document.body.appendChild(divInfo[list]); divPos.push(pos); list++; //5秒后消失 setTimeout(function(){ divInfo[0].parentNode.removeChild(divInfo[0]); divInfo.splice(0,1); divPos.splice(0,1); list--; },5000) }); animate(); //循环动画,告警框位置更新 function animate(){ requestAnimationFrame( animate ); for( var i=0; i<divPos.length; i++ ){ var vector = MMSDT.mapped3to2( divPos[i] ); divInfo[i].style.bottom = vector.y + 20 + "px"; divInfo[i].style.left = vector.x - 90 + "px"; } } } //自定义对外函数接口------------------------------------------------------------------------ //添加人员 MMAPI.addMan = function(){ positioning.add(["毕昌远","胡婉清","吴成龙","龚均鸿","李娟","刘周","王宇","黄绒"],0); } //删除人员 MMAPI.delMan = function(){ positioning.remove(["毕昌远","胡婉清","吴成龙","龚均鸿","李娟","刘周","王宇","黄绒"]); } //显示围栏 MMAPI.display = function( num ){ switch(num) { case 0: //移除所有区域 fences.remove(); break; case 1: //显示一号区域 fences.add( 0 ); break; case 2: //显示二号区域 fences.add( 1 ); break; case 3: //显示三号区域 fences.add( 2 ); break; } }

点击查看示例演示 →