如何使用CesiumJs在多边形上显示地板

时间:2015-11-03 07:23:33

标签: cesium

我是CesiumJs的新手,我想在建筑物上添加12层楼。我使用多边形创建了建筑物。

这是我用来创建多边形的代码

var viewer = new Cesium.Viewer('cesiumContainer');
	var wyoming = viewer.entities.add({
	name : 'My location',
	polygon : {
    hierarchy : Cesium.Cartesian3.fromDegreesArray([cordinates of location]),
		material : Cesium.Color.WHITE.withAlpha(0.5),
		outline : true,
		fill : true,
		outlineColor : Cesium.Color.BLACK,
	  }
	});
	wyoming.polygon.extrudedHeight = 50;
	viewer.camera.flyTo({
  destination : Cesium.Cartesian3.fromDegrees(-79.38443,43.64843, 144.00),
  orientation : {
    heading : Cesium.Math.toRadians(121.00),
    pitch : Cesium.Math.toRadians(60.00 - 90.0),
    roll : 0.0
  },
  duration : 4.0, // in seconds
  complete : function() {
  },
  
   point : {
    pixelSize : 5,
	color : Cesium.Color.RED,
	outlineColor : Cesium.Color.WHITE,
	outlineWidth : 2
  },
  label : {
	text : 'My another location',
    font : '14pt monospace',
    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
    outlineWidth : 2,
    verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
    pixelOffset : new Cesium.Cartesian2(0, -9)
  }
});

提前致谢

1 个答案:

答案 0 :(得分:0)

在这种情况下,您需要比挤压多边形更复杂的东西。

如果您需要一个具有交替颜色的地板的简单建筑物,您可以使用带有条纹材料的Wall实体构建它,并将多边形放在它上面作为“屋顶”(使用相同的坐标,将height属性设置为高度为墙,而不是设置extrusionHeight)。

这将创建具有交替的黑色和白色地板的墙壁:

function createBuildingWalls(coordinates, floors)
{
  var floorHeight = 4;
  var height = floors * floorHeight;
  var low = Array.apply(null, Array(coordinates.length/2)).map(function() { return 0 });
  var high = Array.apply(null, Array(coordinates.length/2)).map(function() { return height });
  var buildingWalls = new Cesium.Entity({
    name : 'Wall',
    wall : {
        positions : Cesium.Cartesian3.fromDegreesArray(coordinates),
        maximumHeights : high,
        minimumHeights : low,
        material : new Cesium.StripeMaterialProperty({
                        evenColor : Cesium.Color.WHITE,
                        oddColor : Cesium.Color.BLACK,
                        repeat : 20
        })
    }});
    return buildingWalls;
}

这个屋顶(可能会遇到很大的多边形问题,但建筑物应该没问题):

function createBuildingRoof(coordinates, floors)
{
  var floorHeight = 4;
  var buildingHeight = floors * floorHeight;
  var buildingRoof = new Cesium.Entity({
     name : 'My location',
    polygon : {
      hierarchy : Cesium.Cartesian3.fromDegreesArray(coordinates),
      material : Cesium.Color.RED.withAlpha(0.9),
      outline : true,
      height : buildingHeight,
      fill : true,
      outlineColor : Cesium.Color.BLACK,
    }
  });

  return  buildingRoof;
}

您还可以使用纹理(图像)作为材质并将其应用到墙上,但它更复杂。您需要设置ImageMaterial属性,并根据纹理的类型设置重复属性(即重复单个楼层verticaly,或单个12层条纹水平或其他组合) http://cesiumjs.org/Cesium/Build/Documentation/ImageMaterialProperty.html

其他解决方案是使用建筑物的3D模型: http://cesiumjs.org/2014/03/03/Cesium-3D-Models-Tutorial/