地形建模(二)--TIN拉伸成模型并贴纹理
很久前,写了一篇“地形建模(一)—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[email protected]"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及以上版本。