本节主要记一下用mars3d实现
场景漫游
及通视分析
通视分析
通视分析是指以某一点为观察点,研究某一区域通视情况的地形分析。利用DEM判断地形上任意两点之间是否可以互相可见的技术方法,分为视线通视分析和视域通视分析,前者判断任意两点之间能否通视,后者从任一点出发,判断该区域内所有其他点的通视情况。
视线通视分析
// 创建通视分析实体类
let sightline = new mars3d.analysi.Sightline({
viewer: viewer,
depthFailColor: Cesium.Color.fromCssColorString('#db2c8f')
})
// 绘制模拟视线
map.mars.draw.startDraw({
type: 'polyline',
config: {
maxPointNum: 2
},
style: {
color: '#55ff33',
width: 3
},
success: function(entity) {
// 绘制成功后回调
var positions = entity.polyline.positions.getValue()
var center = positions[0]
center = _this.mars3d.point.addPositionsHeight(center, 0.5) // 加人的身高等因素,略微抬高一些
let targetPoint = positions[1]
sightline.add(center, targetPoint)
createPoint(center, true) // 创建点
createPoint(targetPoint, false)
map.mars.draw.deleteAll()
}
})
// 创建点的方法
function createPoint(position, isFirst) {
const Cesium = this.Cesium
var point = map.entities.add({
position: position,
point: {
color: Cesium.Color.fromCssColorString('#3388ff'),
pixelSize: 6,
outlineColor: Cesium.Color.fromCssColorString('#ffffff'),
outlineWidth: 2,
scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.2)
},
label: {
text: isFirst ? '观察位置' : '目标点',
font: 'normal small-caps normal 17px 楷体',
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
fillColor: Cesium.Color.AZURE,
outlineColor: Cesium.Color.BLACK,
outlineWidth: 2,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
pixelOffset: new Cesium.Cartesian2(0, -20), // 偏移量
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 2000000)
}
})
arrPoint.push(point)
return point
}
效果如下图,绿色线段表示从观察点能够看到的位置,紫色表示无法看到的位置
视域通视分析
// 视域通视分析
viewer.mars.draw.startDraw({
type: 'circle',
style: {
color: '#ffff00',
opacity: 0.2,
clampToGround: true
},
success: function(entity) {
// 绘制成功后回调
viewer.scene.globe.depthTestAgainstTerrain = true
var center = entity.position.getValue()
center = mars3d.point.addPositionsHeight(center, 0.5) // 加人的身高等因素,略微抬高一些
let targetPoints = mars3d.draw.attr.circle.getOutlinePositions(entity, true, 45)
for (var i = 0; i < targetPoints.length; i++) {
var targetPoint = targetPoints[i]
targetPoint = mars3d.point.setPositionSurfaceHeight(viewer.scene, targetPoint)
sightline.add(center, targetPoint)
}
createPoint(center, true)
viewer.mars.draw.deleteAll()
}
})
效果如下图
场景漫游
场景漫游主要是实现模型或者相机视角在根据指定的位置路线进行移动
var flydata = {
name: '步行路线',
camera: { type: 'gs', distance: 100 },
// camera: {
// type: 'gs', // '':无、'gs':跟随视角、'dy':第一视角、'sd':上帝视角
// radius: 30, // 'gs'跟随视角时的 初始俯仰距离值(单位:米)
// heading: 130, // 'gs'跟随视角时的 初始方向角度值,绕垂直于地心的轴旋转角度, 0至360
// pitch: 180, // 'gs'跟随视角时的 初始俯仰角度值,绕纬度线旋转角度, 0至360
// followedX: 10, // 锁定第一视角时,距离运动点的距离(后方)
// followedZ: 10 // 'dy'锁定第一视角或'sd'上帝视角时,距离运动点的高度(上方)
// },
// 漫游路线
points: [
[116.476892, 39.913338, 45],
[116.477097, 39.913173, 45.1],
[116.477357, 39.913442, 44.8],
[116.477105, 39.913583, 44.8],
[116.476874, 39.913352, 45]
],
speed: 10,
model: {
show: true,
uri: 'http://xxx.gltf', // 漫游模型的url
scale: 1,
minimumPixelSize: 20
},
shadow: [
{
type: 'circle',
radius: 2,
color: '#ffff00',
opacity: 0.3,
fill: true,
fillType: 'animationCircle',
animationDuration: 2000,
animationCount: 3,
animationGradient: 0.1,
show: true
}
],
clockRange: Cesium.ClockRange.LOOP_STOP, // CLAMPED到达终点后停止
pauseTime: 0.5
}
const roamLine = new mars3d.FlyLine(map, flydata)
roamLine.start()
效果如下图,模拟跟随任务运动漫游
结束,以上为通视分析和场景漫游,当前mars3d使用版本为2.2,其他版本API或有差异