查看: 4827|回复: 18

数据拼接的问题

[复制链接]

该用户从未签到

发表于 2008-3-6 10:49:33 | 显示全部楼层 |阅读模式
背景:有多幅usgs dem的数据和纹理贴图;通过osgdem处理得到不同的IVE
目的:希望加载所有的顶层IVE数据,得到一幅完整的(包含所有dem数据)地形全景

老大们有谁这么处理过数据拼接的问题嘛?可以不可以说一下思路和处理的效果。

该用户从未签到

发表于 2008-3-6 12:42:32 | 显示全部楼层
osgdem批处理就可以~~~~~~~~
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-6 13:30:01 | 显示全部楼层
    设置好坐标系就可以了,,~~~自动就可以接上,,,,~~

    该用户从未签到

    发表于 2008-3-6 20:10:29 | 显示全部楼层
    生成ive后再拼接的话,可以就比较麻烦一点了~~~裙带拼接基本上就可以处理,感觉osgdem的在裙带拼接方面技术还是非常精辟的~~~~~~~~~~~~

    该用户从未签到

     楼主| 发表于 2008-3-6 22:47:00 | 显示全部楼层

    回复 3楼 的帖子

    嗯。。我觉得生成IVE后,然后再加载各个顶层的IVE,场景也是自动拼接好的啊。

    PS:老大,你方便具体说一下你的做法吗?(就是把简单的操作命令写一下,嘻嘻,我好贪啊)
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-6 23:41:03 | 显示全部楼层
    不是你说的那个意思~~~~~层与层之间分的小块当然是自动拼好的了~~~你遇到问题了再过来具体搞定吧~~~时刻注意坐标系就可以了,~~

    该用户从未签到

     楼主| 发表于 2008-3-7 09:06:03 | 显示全部楼层

    回复 6楼 的帖子

    嗯 好滴:)谢谢你了

    该用户从未签到

    发表于 2008-3-15 08:45:23 | 显示全部楼层
    这个问题可以开一个专题啊!楼主

    该用户从未签到

    发表于 2008-3-17 17:15:07 | 显示全部楼层
    按照两位斑竹所说的方法,请问:
    在数据读取的时候,
    比如使用OSG1.2版的osgProducer::Viewer读取这些拼接好的文件,比如输入了一个xxx.osg,使用osgDB::ReadNodeFile读取,那么当移动地形到其他区域且此时需要读取被拼接到一起的其他图幅时,是如何知道读取哪个文件的呢? 是OSG自动判断读取,还是需要我们根据自己对文件的组织方式选择所需的文件呢?

    其实,就是想知道,按照斑竹们的说法,拼接后的文件是如何组织到一起的呢???

    恢常感谢噢!
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-17 18:24:50 | 显示全部楼层
    拼接后的文件,默认的有自己的LOD,但是如果都显示第一层仍然跑不起,就可能只需要显示周边的一些文件,可以在所有的块前面加个相同的头结点,该头结点中含有LOD信息,~~~~~~

    该用户从未签到

    发表于 2008-3-17 21:16:42 | 显示全部楼层
    原帖由 FreeSouth 于 2008-3-17 18:24 发表
    拼接后的文件,默认的有自己的LOD,但是如果都显示第一层仍然跑不起,就可能只需要显示周边的一些文件,可以在所有的块前面加个相同的头结点,该头结点中含有LOD信息,~~~~~~



    还是不明白

    假设需要显示的是同一层(或者干脆只有一层LOD),
    这样不同块的文件(一块对应一个文件)该如何组织在一起?文件之间通过什么关联?如何知道当前该读取哪一块?
    除了您说的针对不同层LOD,需要添加LOD信息外;是否还需要针对不同块,来改写一下这些块的文件,比如再加个头或者添加一个专门管理这些块的控制文件什么的?

    谢谢,期待您的回复

    [ 本帖最后由 Aladdin 于 2008-3-17 21:19 编辑 ]

    该用户从未签到

    发表于 2008-3-18 00:02:14 | 显示全部楼层
    如果你想拼接多个地形模型文件的话,可以采用四叉树管理模式,裙带拼接方法~~~文件之间的关联就是点的信息了,呵呵~~~~~~读取哪一块当然是根据视点来决定啦~~~~~LOD本来就是基于视点的~~~~~

    当然也可以通过PagedLOD来调用~~~~~~
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-18 00:04:52 | 显示全部楼层
    其实你不用管这么多,只管一次全读进来,看看效果,,,,,,,,,文件全是自动调度的,,,OSGA只是一种文件格式,可以成为OSG的普通结点,,,,难道你不是用在OSG的程序中吗,,,,调度结点应该很简单吧,,,,,本身他们不用管的,除非你跑不起来再要额外的去管该结点是否显示,,,,,,你最好自己躬行一下,,,把模型全压进场景里面试一下,,~~~

    该用户从未签到

    发表于 2008-3-18 19:07:42 | 显示全部楼层

    谢谢两位斑竹的指点,试验一下,终于有了点眉目

    /******************************************************************************************/
    使用osgdem(不好意思落后了,偶还在用OSG1.2版)处理多幅地图的拼接,我觉的可以这样做:
    大的来说,可以采用三种方法,如下:
    1.生成时拼接:在使用osgdem转dem为osg格式时,进行拼接;
    2.显示时拼接:使用osgdem批量处理具有拼接关系的文件s,生成各个拼接块的文件,然后在读取/显示时进行拼接;
    3.预处理时拼接:先借助第三方软件把这些分幅的地图拼接成一个文件,再用osgdem转换来处理这一个文件;


    具体而言:
    第1种方法:
      就像FreeSouth所说,直接处理,注意坐标一致;
      比如两个具有邻接关系(可以完全拼接)的地形文件:file1、file2,假设坐标系一致,使用下面命令:osgdem -d file1.dem -d file2.dem -l 1 -o test.osg(输出文件当然也可以是xxx.ive, 或者-a xxx.osga,或者啥都没有默认好了);
    然后生成的test.osg就是拼接好的,显示出来与处理单个文件的效果一样;且就算生成多层LOD也与处理单个文件效果相同;
      是不是在处理这句命令时,osgdem的实现就像FlySky所说,进行的是裙带拼接处理?目前还没搞清楚:)
      这一方法比较好使

    第2种方法:
      应该是楼主所说的方法,分别生成各个块的文件,这样就有一组文件,然后可以自己重新组织这些文件(具体该怎么做?)或者直接使用osgDB::readNodeFiles读取;
      发现用readNodeFiles读取时,有明显的拼接痕迹(边界的skirt?)
      不知道这个方法怎么样?

    第3种方法:
      哈~~理论上可行,不知道有没有人试验过?
    /******************************************************************************************/

    不明白的是,如果使用第1种方法,好像不能分块显示了,这样是否导致一层的所有块都得显示出来;如何才能像FreeSouth老大所说,只读取周边或附近的地块?这个要怎么办呀?

    该用户从未签到

    发表于 2008-3-18 20:53:17 | 显示全部楼层

    回复 4楼 的帖子

    裙带拼接会不会有缝啊??

    该用户从未签到

    发表于 2008-3-18 20:55:17 | 显示全部楼层

    回复 3楼 的帖子

    具体是怎么设置坐标的啊??
    比如说,两幅相邻的dem,该怎样设置他的坐标呢??
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-18 21:21:18 | 显示全部楼层
    首先本人总结一下上面三层所述的方案与提的问题啊:

    对于14楼所提方法一,个人认为不要采用,
    原因有二:

    第一,这么多块读进去,看着好像没缝,其实是有缝的,虽然两块连成了一体,但是仍然中间有道沟,当然也可能你的数据坐标系统正好一点儿不差,就没缝,这种可能性很小,这种缝的产生是由以下原因造成的:
    1:如果原先DEM是一个大块,那么分成小块时肯定是使用软件分的,时下使用ERDAS造成的误差虽小,但是还是有的。
    2:OSGDEM比较措长处理TIF,或者它本身就是将所有的格式全转换成中间TIF再处理,这一来二回又有了误差,所以块与块之间的误差不可避免。
    第二,这么多块读进来,实际上14楼也说了,并没有分,还是一块,那么手工分块还有什么用呢,干脆用第三种方法,一大块全读,分个几十层不算了,故,这一种方法肯定是最臭的。

    BUT:有一种情况很例外,这一种情况等述了第二种与第三种情况再说。

    第二种方案:简单描述就是,手动把大块DEM和纹理全部分成小块块,然后每块块分别生成N层,最后全部调入场景,这个比较可行,可行的原因有二:
    1:这样每个小块块可以分别自己调度,可以让每个小块显示或不显示,每个小块上分别加上个LOD就可以分别控制他们的视距了。
    2:这样的清晰度非常的可观,因为每个小块分别有N层,那么比如你分成了八块,其实每个只显示第一层就相当于原来大块的三级了(2的三次方),所以非常可观

    要解决的问题有二:
    1:缝,肯定有缝,因为数据是分开处理的,怎么可能没有缝的。只不过显与不显的问题。
    2:大,数据肯定变大了,这样可能需要手工调度一下,不过如果只有1G或者二三个G,倒是不必管的,因为一次不可能加入内存的,它们只调度可见层这都是自动的。

    再说一下如何搞掉这个缝,在截的时候搞一段重合的地方就可以了,不过有重合肯定有痕迹,在层数多时这个痕迹并不明显,还有如果最好按L开着灯看这个痕迹,一点儿也没有了,只有对着看时才能看出来,当然这需要你调整好重合的地方,越小越好,刚好对上最好。这样就没缝了,

    第三种方案:一大块,这种一大块肯定没缝,比第一种好,原因是因为本来就是一个整体,哪来的缝呢。但是缺点也和第一种一样。

    现在来说说那个BUT:这个BUT可以解决有缝的问题,比如第二种情况吧,有缝,这个缝很难搞掉,于是可以生个点子就是一次生成一大块,然后设置个几十级,然后再把这些级的文件分别解压,然后再手工调度,这个需要很好的脑力,因为这可不是开玩笑的,这样做的好处是肯定没缝,因为所有的层级文件都是一个整体生成的。

    再说说坐标系统,楼上二层以另外一帖就问过这个事,当时我给了一个命令来者:
    http://bbs.osgchina.org/viewthread.php?tid=112&extra=page%3D1
    去看一下吧,里面有UTM 49带的坐标系统设置,FLYSKY的另外一个教程里也有一些别的说明,教程在这:
    http://bbs.osgchina.org/viewthread.php?tid=77&extra=page%3D1

    先说到这里吧,有问题谁个再发就可以了
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-18 21:26:23 | 显示全部楼层
    再稍带的来讲一个关键函数,该函数是这样的:
    void osgDB:atabasePager::setExpiryDelay  ( double  expiryDelay   )  [inline]

    该函数的作用是有一个时限,在不需要显示的层级消失时怎么确定呢,怎么让它消失呢

    比如有些人不喜欢回头,那么走过的路就可以马上消失,这样这个expiryDelay就可以设置成1S或是更少,那么如果有些人喜欢回头呢,如果鼠标晃了呢,那么马上消失显然不合适,这个函数的默认值是10S,可能版本不同有的是20S,也就是不需要显示的层级在10S后才会被放掉,这样就可以防止回头率和一个级反复被短期调入调出这种事情了
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-18 21:27:48 | 显示全部楼层
    顺便抓个个案,,,14楼,传头像
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表