地形建模(二)--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=@"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及以上版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章