三维可视化开发支持三维模型标注(收费功能)

您可以向三维可视化场景中添加各种高精度、有趣又炫酷的三维模型

第一步:新建一个三维标注图层 (以下代码都要在 map.on('loadComplete') 中调用)

map.on('loadComplete',function(){
    // 获取第一层的楼层对象
    var building = map.getBuildingById('test666'); 
    var floorLayer = building.getFloor(1);  
    // 方法1,共用一个模型图层layer,需要添加到楼层对象
    var layer = new esmap.ESLayer(esmap.ESLayerType.MODEL3D);
    floorLayer.addLayer(layer);
    // 方法2,通过名字的区别获取或创建不同的模型图层layer,无需添加到楼层对象
    var layer = floorLayer.getOrCreateLayerByName('camera' , esmap.ESLayerType.MODEL3D);
})

第二步:创建一个三维模型标注实例

var marker = new esmap.ES3DMarker({
    x: x,            // x轴坐标
    y: y,            // y轴坐标
    id: 10002,       // 自定义id
    name: 'myTree',  // 自定义name
    url: url,        // 模型的文件地址
    size: 1,         // 尺寸
    callback: function () {
        // 模型添加到三维场景的回调函数
    }
});
参数说明
参数 说明 类型 默认值 是否必填
x x轴坐标 Number ——
y y轴坐标 Number ——
url 模型的文件地址 String ——
size 模型尺寸大小 Number ——
id id标识 Number 10001
name 自定义name String es3dmarker
angle 模型旋转角度 Number 0
height 模型初始位置高度 Number 0
showLevel 到达三维场景缩放等级隐藏模型 Number 23
callback 模型加载完成事件回调函数 Function ——

第三步:将三维模型标注添加到图层

layer.addMarker(marker); 

第四步:启动三维场景模型加载队列

// 该方法用于通知三维场景加载3d模型。如果一个图层上有多个3d模型,可以在添加完毕后统一调用一次。
layer.show3D()

Tips:加载3d模型是异步操作,如果需要调用marker建议使用promise等方法加载

var promise = new Promise(res => {
    // 获取第一层的楼层对象
    var building = map.getBuildingById('test666'); 
    var floorLayer = building.getFloor(1);  
    // 共用一个模型图层layer
    var layer = new esmap.ESLayer(esmap.ESLayerType.MODEL3D);
    // 将共用的模型图层添加到楼层对象上
    floorLayer.addLayer(layer);
    // 创建模型标注实例
    var marker = new esmap.ES3DMarker({
        x: map.center.x,  
        y: map.center.y,
        callback: function (mode) {
        // 模型添加到三维场景的回调函数
        res(mode)
        },
    });
    // 将三维模型标注添加到图层上
    layer.addMarker(marker);
})

promise.then(function (marker) { 
    // 执行promise后异步得到模型标注marker
    console.log(marker) 
})

标注的销毁和显隐方法
销毁方法:
// 首先获取"对应楼层"的楼层对象
floor = map.getBuildingById(0).getFloor(1); // 这里获取到"一楼"楼层对象

// 方法1:销毁某个楼层所有的多边形标注层
floor.removeLayersByTypes(esmap.ESLayerType.MODEL3D);

// 方法2:根据标注层名字销毁某个楼层的多边形标注层
floor.removeLayersByNames('modelLayer');

// 方法3: 销毁该标注层里的某一个多边形标注
modelLayer.remove(marker); 

// 方法4: 销毁该标注层的所有标注
modelLayer.removeAll(); 
标注支持手动控制显隐:
marker.visible = false  // 隐藏标注
marker.visible = true   // 显示标注


标注常用方法:

1.跳跃动画
marker.jump({
    times: 100,  // 跳跃执行100次
    duration: 1, // 持续1秒
    delay: 0.5,  // 每次跳跃的间隔,默认为0
    height: 10   // 跳跃的三维场景高度
});

// 停止跳跃
marker.stopJump();

2."设置旋转" 和 "缩放大小"
marker.rotateTo(150)   // 支持传递数字来旋转
marker.rotateTo({  // 或者传递更详细的参数
    angle: 30,     // 角度,单位(度/°)
    time: 0.6,     // 旋转动画时间
    onComplete: ()=>{
        console.log('旋转结束')
    }
})

marker.setScale(5);       // 放大五倍
marker.restoreScale();    // 恢复原始设置大小

3."渐隐" 和 "渐显"
marker.fadeOut({
    time: 1,        // 默认渐隐动画时间是1秒
    callback:()=>{
        console.log('渐隐结束')
    }
})

marker.fadeIn({
    time: 1,        // 默认渐显动画时间是1秒
    callback:()=>{
        console.log('渐显结束')
    }
})

4."更改颜色" 和 "发光报警"
// 方法1: 通过map对象搜索marker更改颜色
map.change3dColor({    // 单个模型
    id: 0,             // 指定的单个模型id
    // name: 'model',  // 或者指定模型的name
    // fnum: [1,2]     // 楼层范围
    color: '#00ff00'
})
map.change3dColor({    // 多个模型
    id: [1,2,3],       // 指定的多个模型id
    // fnum: [1,2]     // 楼层范围
    color: '#00ff00'
})
// 若需要还原默认颜色把color设为false


// 方法2: 通过调用marker自带API更改颜色
marker.changeColor('#FF0000');   // 改变模型为红色
marker.restoreColor();           // 还原默认颜色

// 三维模型发光报警
marker.glow({
    color: '#00FF00', // 设置光圈颜色
    scale: 2,         // 设置光圈效果大小
    opacity: 0.2,     // 设置光圈效果透明度
});

marker.stopGlow();    //停止发光报警光圈效果

5.移动三维模型位置(moveTo)
// 如果是移动到另外楼层,需要自行删除此marker,然后新建立一个标注添加到对应楼层的标注层上面
marker.moveTo({
    x: marker.mapCoord.x + 10, // 目标点x轴
    y: marker.mapCoord.y + 10, // 目标点y轴
    z: marker.mapCoord.z + 10, // 目标点高度z轴
    time: 0, // 位移动画时间,单位(秒/s)
    orientToPath: true,        // 是否朝向路径
})

6.支持沿着路径移动(movePath)
let points =[       // 线段数据
    { "x":map.center.x, "y":map.center.y, "fnum":1, "offset":2 },
    { "x":map.center.x + 20, "y":map.center.y + 20, "fnum":1, "offset":2 },
    { "x":map.center.x - 20, "y":map.center.y - 20, "fnum":1, "offset":2 },
];
marker.movePath({
    speed: 10,          // 速度m/s,设置此属性则忽略time属性
    loop: true,         // 是否循环执行
    path: points,       // 路径点集
    offsetHeight: 0,    // 移动时的偏移高度
    complete:  ()=> {
        // 执行完movePath的回调函数
    },
    onMoving:  (e)=>{
        // 一直在执行movePath时的回调函数
    },
})

// 执行movePath过程中支持暂停继续
marker.pauseMovePath();     // 暂停移动
marker.resumeMovePath();    // 继续移动
movePath方法参数说明:
参数 说明 类型 默认值 是否必填
time 指定时间内完成移动(设置此值忽略speed) Number —— 与speed参数二选一
speed 移动速度(设置此值忽略time) Number —— 与time参数二选一
path 路径点集 Array ——
loop 是否循环执行 Boolean false
loopReverse 是否反向循环执行 Boolean false
offsetHeight 高度偏移 Number 0
orientToPath 模型移动时是否朝向路径方向 Boolean true
followPosition 是否跟随第一人称视角移动 Boolean false
followAngle 是否根据路径来动态变换三维场景角度 Boolean false
followTilt 是否跟随俯仰角 Boolean false
followSmooth 平滑跟随程度 Number 0
viewTiltAngle 第一人称视角的三维场景俯仰角 Number 0
angle 模型移动朝向路径方向的角度 Number 0
maxViewDistance 最大可视距离 Number 0
minViewDistance 最小可视距离 Number 0
complete 动画执行完成回调事件 Function ——
onMoving 路径移动实时回调 Function ——

7.播放模型动画(playAnimation)
// 每个模型都有自带的动画,可在marker.animations属性上查看
const animateName = marker.animations[0];   // marker.animations是一个数组,里面存储了模型动画名词

// 演示使用默认参数来播放模型动画
marker.playAnimation(animateName)     // 播放模型指定动画

// 设置详细参数来模型动画播放
marker.playAnimation({
    name: animateName,         // 动画名称
    time: 2.5,                 // 执行时间/s
    loop: false,               // 是否循环执行动画
    callback: ()=>{     // 动画执行完成回调
        console.log('动画执行完成')
    },  
})
// 停止模型动画播放
marker.stopAnimation();
playAnimation方法参数说明:
参数 说明 类型 默认值 是否必填
name 动画名称 String ——
delay 延迟播放时间/s Number 0
time 动画时长/s Number 1
repeat 动画播放次数 Number 1
loop 是否循环执行动画(开启时repeat属性无效) Boolean false
clampWhenFinished 是否在播放完成后保持最后一帧 Boolean false
stopLastAction 是否停止上一个动画 Boolean true
callback 动画执行完成的回调 Function ——