【二次开发】CityMaker动态效果——动态海水

时间:2019-02-19
本文章向大家介绍【二次开发】CityMaker动态效果——动态海水,主要包括【二次开发】CityMaker动态效果——动态海水使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

**

创建动态海水

**

一:技术原理:

为了模拟真实的水面波浪效果,我们引入了动态海水的感念。
创建动态海水主要步骤是:加载地形图,创建IMultiPolygon作为海水范围,开启地形动态海水特效设置即可。

二:创建动态海水:

1. .Net代码

//设置海水范围
private void oceanArea()
{
    IGeometryFactory gfactory = new GeometryFactory();

    //创建面要素,作为海水范围
    IPolygon fde_polygon = (IPolygon)gfactory.CreateGeometry(gviGeometryType.gviGeometryPolygon,
                           gviVertexAttribute.gviVertexAttributeZ); 
    fde_polygon.SpatialCRS = crs as ISpatialCRS;//定义面坐标系

    //创建点要素,作为海水面范围点
    fde_point = (IPoint)gfactory.CreateGeometry(gviGeometryType.gviGeometryPoint,
            gviVertexAttribute.gviVertexAttributeZ);

    //定义范围坐标
    fde_point.SetCoords(20821, 9552, 0, 0, 0);
    fde_polygon.ExteriorRing.AppendPoint(fde_point);
    fde_point.SetCoords(20793, 9318, 0, 0, 0);
    fde_polygon.ExteriorRing.AppendPoint(fde_point);
    fde_point.SetCoords(21043, 9278, 3, 0, 0);
    fde_polygon.ExteriorRing.AppendPoint(fde_point);
    fde_point.SetCoords(21096, 9517, 2, 0, 0);
    fde_polygon.ExteriorRing.AppendPoint(fde_point);

    //创建IRenderPolygon
    ISurfaceSymbol sfbottom = new SurfaceSymbol();
    IRenderGeometry currentRenderGeometry = rendercontrol.ObjectManager.CreateRenderPolygon(fde_polygon as IPolygon, sfbottom, rootId);

    //将面要素转化成IMultiPolygon
    IMultiPolygon multiPolygon = gfactory.CreateGeometry(gviGeometryType.gviGeometryMultiPolygon, gviVertexAttribute.gviVertexAttributeZ) as IMultiPolygon;
    IPolygon polygon = currentRenderGeometry.GetFdeGeometry() as IPolygon;
    multiPolygon.AddPolygon(polygon);

    //设置面可见性
    currentRenderGeometry.VisibleMask = gviViewportMask.gviViewNone;
    //定义海水范围
    rendercontrol.Terrain.EnableOceanEffect = true;//开启动态海水
    rendercontrol.Terrain.SetOceanRegion(multiPolygon);//海水范围
    rendercontrol.Terrain.OceanWindSpeed = 5;//风速,将影响波浪起伏大小
    rendercontrol.Terrain.OceanWindDirection = 0;//波浪方向,正北为0,顺时针递增
}

2. JS代码

//设置海水范围
private void oceanArea()
{
    var gfactory = rendercontrol.geometryFactory

    //创建面要素,作为海水范围
    var fde_polygon = gfactory.createGeometry(gviGeometryType.gviGeometryMultiPolygon, gviVertexAttribute.gviVertexAttributeZ);

    //创建点要素,作为海水面范围点
    var fde_point = gfactory.createGeometry(gviGeometryType.gviGeometryPoint, gviVertexAttribute.gviVertexAttributeZ);

    //定义范围坐标
    fde_point.setCoords(20821, 9552, 0, 0, 0);
    fde_polygon.exteriorRing.appendPoint(fde_point);
    fde_point.setCoords(20793, 9318, 0, 0, 0);
    fde_polygon.exteriorRing.appendPoint(fde_point);
    fde_point.setCoords(21043, 9278, 3, 0, 0);
    fde_polygon.exteriorRing.appendPoint(fde_point);
    fde_point.setCoords(21096, 9517, 2, 0, 0);
    fde_polygon.exteriorRing.appendPoint(fde_point);

    //创建IRenderPolygon
    var sfbottom = rendercontrol.new_SurfaceSymbol;
    var currentRenderGeometry = rendercontrol.objectManager.createRenderPolygon(fde_polygon, surfaceSymbol, '');

    //将面要素转化成IMultiPolygon
    var multiPolygon = currentRenderGeometry.getFdeGeometry();
    multiPolygon = __g.geometryFactory.createGeometry(gviGeometryType.gviGeometryMultiPolygon, gviVertexAttribute.gviVertexAttributeZ);
    var polygon = this.currentRenderGeometry.getFdeGeometry();
    multiPolygon.addPolygon(polygon);

    //设置面可见性
    currentRenderGeometry.visibleMask = gviViewportMask.gviViewNone;
    //定义海水范围
    rendercontrol.terrain.enableOceanEffect = true;//开启动态海水
    rendercontrol.terrain.setOceanRegion(multiPolygon);//海水范围
    rendercontrol.terrain.oceanWindSpeed = 5;//风速,将影响波浪起伏大小
    rendercontrol.terrain.oceanWindDirection = 0;//波浪方向,正北为0,顺时针递增
}

重点解析
1.动态海水主要借助了ITerrain所属的属性和方法,具体包括以下四个:

三:注意事项

1.本节示例代码中使用了tmpTedPath,路径为SDK安装目录下的Samples\Media\terrain\terrain.ted。
2.setOceanRegion方法传入了ImultiPolygon对象,该对象是场景中若干个多边形的集合,需要先创建Ipolygon,再通过ImultiPolygon的AddPolygon方法生成。

3.本示例方法仅适用于地形某一范围海水化。如果效果不能达到要求,还可以使用动态贴图方法实现更好的展示效果。具体可以参考SDK初级篇DynamicImage一章。
4.更多示例请参考SDK中级篇动态海水一章。