一、技术原理
基础原理是点组成线,线组成面,而citymaker中直接给的是创建多边形或者圆的几何,然后可视化该对象。
过程:CityMaker创面,先创建几何对象,然后把几何对象可视化,用到的是sdk中的IGeometryFactory(几何体工厂接口)来创建几何,然后利用IObjectManager对象管理器接口来创建可视化对象(可以设置几何样式样式IGeometrySymbol)具体类型详见几何篇。
分类:面分为polygon(面类)和triMesh(三角面),圆、椭圆、圆弧其实也是一个多边形,也是一个面,在CityMaker中给了对应的创建接口,下面我们就来说下创建过程,至于三角面详见高级篇
二、创建三维面对象
1. .NET
public void CreateRenderObject(){
//创建几何点和多边形,详见几何篇
IGeometryFactory gFactory = new GeometryFactory();
var point = (IPoint)gFactory.CreateGeometry(gviGeometryType.gviGeometryPoint, gviVertexAttribute.gviVertexAttributeZ);
var polygon = (IPolygon)gFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ);
var polyline = polygon.ExteriorRing;//获取多边形外环对象
point.SetCoords(0,0,100,0,0);//设置第一个点的坐标
polyline.AppendPoint(point);//把点第一个点加入到线上
point.SetCoords(100,0,100,0,0);
polyline.AppendPoint(point);
point.SetCoords(100,100,100,0,0);
polyline.AppendPoint(point)
point.SetCoords(0,100,100,0,0);
polyline.AppendPoint(point);
polyline.Close();//设置闭合
ISurfaceSymbol surfaceSymbol = new SurfaceSymbol();//初始化面样式
surfaceSymbol.Color = 0xff0000ff;//设置填充颜色
surfaceSymbol.ImageName ="D:\\citymakerbookdata\\point.png"; //设置图片
surfaceSymbol.RepeatLengthU=100;//设置水平方向多少米间隔重复
surfaceSymbol.RepeatLengthV=100;//设置垂直方向多少米间隔重复
surfaceSymbol.Rotation=30;//设置图片旋转的角度
ICurveSymbol curveSymbol = new CurveSymbol();//初始化线属性详见创建线章节
curveSymbol.Color=0xffcccccc;//设置边框颜色
surfaceSymbol.BoundarySymbol=curveSymbol;//设置面的边框样式
//创建可视化多边形对象
var rPolygon = rendercontrol.ObjectManager.CreateRenderPolygon(polygon, surfaceSymbol,rootId);
rendercontrol.Camera.FlyToObject(rPolygon.Guid,gviActionCode.gviActionFlyTo);//设置相机飞到对象
}
//创建圆
public void CreateCircle(){
IPosition position = new Position();//初始化位置
position.X = 100;//x坐标
position.Y = 100;//y坐标
position.Altitude = 0;//高度
position.Cartesian = true;//是否是平面
position.Heading = 0;//设置圆的方向
position.Roll = 0;
position.Tilt = 0;
//1、创建圆 参数为位置、半径、线颜色、填充颜色、主节点id
ITerrainRegularPolygon rCircle = rendercontrol.ObjectManager.CreateCircle(position, 20, 0xFF00FF00, 0xFF808080, __rootId);
rCircle.NumberOfSegments=50;//设置圆边的个数
//2、创建椭圆 参数为位置、x方向半径、y方向半径、线颜色、填充颜色、组成椭圆线段的个数、主节点id
ITerrainEllipse rEllipse =rendercontrol.ObjectManager.CreateEllipse(position,30,20, 0xFF00FF00, 0xFF808080,25, __rootId);
//3、创建圆弧 参数为位置、x方向半径、y方向半径、起始角度、终止角度、线颜色、填充颜色、组成椭圆线段的个数、主节点id
ITerrainArc rArc = rendercontrol.ObjectManager.CreateArc(position,30,30,45,180,0xFF00FF00, 0xFF808080,25, __rootId);
rendercontrol.Camera.FlyToObject(rCircle.Guid,gviActionCode.gviActionFlyTo);//设置相机飞到对象
}
2. JavaScript
function createRenderObject(){
//创建几何点和多边形
var point = __g.geometryFactory.createGeometry(gviGeometryType.gviGeometryPoint,gviVertexAttribute.gviVertexAttributeZ);
var polygon = __g.geometryFactory.createGeometry(gviGeometryType.gviGeometryPolygon,gviVertexAttribute.gviVertexAttributeZ);
var polyline = polygon.exteriorRing;//获取多边形外环对象
point.setCoords(0,0,100,0,0);//设置第一个点的坐标
polyline.appendPoint(point);//把点第一个点加入到线上
point.setCoords(100,0,100,0,0);
polyline.appendPoint(point);
point.setCoords(100,100,100,0,0);
polyline.appendPoint(point);
point.setCoords(0,100,100,0,0);
polyline.appendPoint(point);
polyline.close();//设置闭合
var surfaceSymbol = __g.new_SurfaceSymbol;//初始化面颜色
surfaceSymbol.color = 0xff0000ff;//设置填充颜色
surfaceSymbol.imageName ="D:\\citymakerbookdata\\point.png"; //设置图片
surfaceSymbol.repeatLengthU=100;//设置水平方向多少米间隔重复
surfaceSymbol.repeatLengthV=100;//设置垂直方向多少米间隔重复
surfaceSymbol.rotation=30;//设置图片旋转的角度
var curveSymbol = __g.new_CurveSymbol;//初始化线 线属性详见创建线章节
curveSymbol.color=0xffcccccc;//设置边框颜色
surfaceSymbol.boundarySymbol=curveSymbol;//设置面的边框样式
//创建可视化多边形对象
var rPolygon = __g.objectManager.createRenderPolygon(polygon, surfaceSymbol, __rootId);
__g.camera.flyToObject(rPolygon.guid,gviActionCode.gviActionFlyTo);//设置相机飞到线对象
}
//创建圆
function createCircle(){
var position = __g.new_Position;//初始化位置
position.x = 100;//x坐标
position.y = 100;//y坐标
position.altitude=0//高度
position.cartesian = true;//是否是平面
position.heading = 0;//设置圆的方向
position.roll = 0;
position.tilt = 0;
//1、创建圆 参数为位置、半径、线颜色、填充颜色、主节点id
var rCircle = __g.objectManager.createCircle(position, 20, 0xFF00FF00, 0xFF808080, __rootId);
rCircle.numberOfSegments=50;//设置圆边的个数
//2、创建椭圆 参数为位置、x方向半径、y方向半径、线颜色、填充颜色、组成椭圆线段的个数、主节点id
var rEllipse = __g.objectManager.createEllipse(position,30,20, 0xFF00FF00, 0xFF808080,25, __rootId);
//3、创建圆弧 参数为位置、x方向半径、y方向半径、起始角度、终止角度、线颜色、填充颜色、组成椭圆线段的个数、主节点id
var rArc = __g.objectManager.createArc(position,30,30,45,180,0xFF00FF00, 0xFF808080,25, __rootId);
__g.camera.flyToObject(rCircle.guid,gviActionCode.gviActionFlyTo);//设置相机飞到对象
}
3. 注意
- 创建多边形,可以有多个内环和一个外环,外环一定要闭合,用close接口或者添加两次起始点
- 创建多边形设置图片地址,可以用本地路径也可以用imageClass中的图片名称,详细参考创建点篇
- 创建面的样式一般分为 填充样式跟边框样式,即面跟线的样式
- position位置是一个包括xyz坐标和欧拉角(heading、roll、tilt)的一个位置信息对象