地形建模(一)——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缓存目录结构:

加载到场景后的效果图:

好了,今天的介绍就到这里了。

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