很久前,寫了一篇“地形建模(一)—TIN地形的生成”的文章,現在來把這個坑填上。TIN地形生成後添加到場景,然後添加影像,效果如下:
TIN地形效果
TIN拉伸爲模型主要有三個步驟:
1.提取TIN表面模型
2.拉伸提取到的模型
3.貼紋理
主要接口如下:
提取TIN指定層級表面模型
SuperMap.Realspace.ThreeDDesigner.CacheProcessor3D.ExtractTINSurface(string sctFile, int nLevel);
拉伸閉合,第一個參數爲需要拉伸的模型,第二個爲海拔
SuperMap.Realspace.ThreeDDesigner.ModelBuilder3D.Envelop(GeoModel3D geomodel, double dbZ);
骨架、材質及紋理相關接口
Skeleton、Material3D及TextureData
主要代碼如下:
privatestaticvoidTestExtrudeAndAddTexture()
{
WorkspaceworkSpace=newWorkspace();
//打開數據源
DatasourceConnectionInfoconn=newDatasourceConnectionInfo();
conn.Server=@"D:\數據\dalian\DL_TIN\xinghai_dem_da\TINTest.udb";
conn.EngineType=EngineType.UDB;
Datasourcedatasource=workSpace.Datasources.Open(conn);
//新建數據集
DatasetVectorInfodtInfo=newDatasetVectorInfo();
dtInfo.Name="TinTest";
dtInfo.Type=DatasetType.Model;
DatasetVectordtVector=datasource.Datasets.Create(dtInfo);
//設置爲地理座標系
dtVector.PrjCoordSys=newPrjCoordSys(PrjCoordSysType.EarthLongitudeLatitude);
//提取TIN表面模型,第二個參數爲提取的層級,最精細層爲最佳。
GeoModel3DgeoModel3d=CacheProcessor3D.ExtractTINSurface(@"D:\數據\dalian\DL_TIN\xinghai_dem_da\xinghai_dem_da.sct",16);
if(geoModel3d!=null)
{
//拉伸閉合,第二個參數爲海拔(-100是爲了防止拉伸失敗)
List<GeoModel3D>modelList=ModelBuilder3D.Envelop(geoModel3d,geoModel3d.MinZ-100);
geoModel3d.Dispose();
geoModel3d=null;
geoModel3d=modelList[0];
//貼紋理
Modelmodel=geoModel3d.Model;
Skeletonske=model.GetSkeleton(newSkeletonID(-1,0));
Material3Dmat=ske.Material;
TextureDatatxtData=newTextureData();
txtData.Name=Guid.NewGuid().ToString();
txtData.FromFile(@"D:\數據\dalian\DL_TIN\xinghai_dem_da\xinghai_dom.png")
List<TextureData>txtDatas=mat.Textures;
txtDatas.Add(txtData);
mat.Textures=txtDatas;
ske.Material=mat;
model.Update(ske);
geoModel3d.Model=model;
//添加到數據集
Recordsetrd=dtVector.GetRecordset(false,CursorType.Dynamic);
rd.Edit();
rd.AddNew(geoModel3d);
rd.Update();
mat.Dispose();
geoModel3d.Dispose();
}
}
執行後用iDesktop打開效果如下:
TIN地形模型效果圖
緩存與模型對比效果(左爲TIN緩存,右爲地形模型)
總的來說代碼很簡單。代碼適用於SUperMap.iObject9D及以上版本。