地形建模(一)——TIN地形的生成

地形建模可能算是三維gis的一個難點。之前在學校時做過一個簡單的學校三維模型,本來是想做加上地形的,不過後來發現並不是那麼容易所以就放棄了。最後做出來的學校模型除了建築就只有幾棵樹,效果不是那麼好。

今天來介紹一下超圖三維的地形建模的相關知識。地形建模會分爲三部分介紹

1.TIN地形的生成

2.TIN拉伸成模型

3.地形貼紋理

由於時間和其他方面的一些限制,文章可能會更新得有點慢。

一、地形效果圖展示

先來看下超圖三維地形的效果圖:

從地理空間數據雲(http://www.gscloud.cn)下載免費的30m分辨率的dem以柵格的方式導入到超圖平臺,直接將dem添加到場景中。效果如下:

加載在線的天地圖隱藏影像再看下效果:


可以看下河流道路一些地物的匹配情況:


總體來說,整體效果還行。不過這種地形其實是柵格(Grid)地形,相比TIN地形精度是遠遠不夠的。
再來看一下的TIN地形與柵格(Grid)地形對比圖
(由於天地圖加載到一定精度就不給顯示,所以我加了osm對比,左邊TIN地形,右邊柵格地形):

對比效果還是比較明顯的,左邊在表現地形方面更精細,更能準確地表達地形。

二、TIN地形的生成

其實TIN地形的生成也很簡單,只需要簡單的幾行代碼就行。

主要的接口如下:

int BeginLevel { get; set; } 起始層;一般默認

string CacheName { get; set; } 緩存名稱;需要自己定義

GeoRegion ClipRegion { get; set; } 裁剪面;可默認,可自定義裁剪面

DatasetGrid Dataset { get; set; } 柵格數據集;生成TIN地形的dem數據

int EndLevel { get; set; } 結束層;一般默認
bool IsBuildNormalMap { get; set; } 是否生成法線;如果沒有法線加載到場景中看不到明 暗效果

int NormalSize { get; set; } 法線塊大小;默認64(x64)一般32(x32)、 64(x64)、 128(x128),值越大,生成的文件越大

string OutputFolder { get; set; } 輸出路徑

bool BuildTIN(); 執行生成TIN; 成功返回true;否則,發揮false;

主要代碼:

 class Program
{
    private static Datasource m_datasource;
    private static CacheBuilderTIN m_CacheBuilderTin;
    static void Main(string[] args)
    {
        m_datasource = new Datasource(EngineType.UDB);
        DatasourceConnectionInfo info = new DatasourceConnectionInfo();
        //本地udb文件型數據源
        info.Server = @"D:\BaiduYunDownload\dem\dem.udb";
        info.Alias = Path.GetFileNameWithoutExtension(info.Server);
        if (m_datasource.Open(info))
        {
            Console.WriteLine("成功打開數據源{0}", m_datasource.Alias);
            //務必確認dem.udb的第0個數據集爲柵格數據集
            m_CacheBuilderTin = new CacheBuilderTIN();
            m_CacheBuilderTin.Dataset = m_datasource.Datasets[0] as DatasetGrid;
            m_CacheBuilderTin.IsBuildNormalMap = true;
            m_CacheBuilderTin.OutputFolder = @"E:\tin";
            //進度條
            m_CacheBuilderTin.Stepped += m_CacheBuilderTin_Stepped;
            m_CacheBuilderTin.BuildTIN();
            m_CacheBuilderTin.Stepped -= m_CacheBuilderTin_Stepped;

        }
        Console.ReadKey();
    }

    private static void m_CacheBuilderTin_Stepped(object sender, SteppedEventArgs e)
    {
        //每百分之10輸出一次
        if (e.Percent % 10 == 0)
        {
            Console.WriteLine("已完成{0}%,剩餘時間:{1}", e.Percent, e.RemainTime);
        }
    }
}

生成過程:

生成後TIN緩存目錄結構:

加載到場景後的效果圖:

好了,今天的介紹就到這裏了。

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