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;
}
}
点击查看示例演示 →
Powered by mms3D