mars3d for cesium 小记(4)

1,217 阅读1分钟

本节主要记一下用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
}

效果如下图,绿色线段表示从观察点能够看到的位置,紫色表示无法看到的位置 image.png

视域通视分析

// 视域通视分析
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()
    }
})

效果如下图 image.png

场景漫游

场景漫游主要是实现模型或者相机视角在根据指定的位置路线进行移动

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()

效果如下图,模拟跟随任务运动漫游

my.gif

结束,以上为通视分析和场景漫游,当前mars3d使用版本为2.2,其他版本API或有差异