查看: 14109|回复: 32

OSG矢量显示的简单解决方案

[复制链接]

该用户从未签到

发表于 2009-9-11 09:39:14 | 显示全部楼层 |阅读模式
简单展示一下自己这几天的成果~~也许对于从事GIS行业的专家牛人们而言,这也算不上多好的效果,不过我个人还是很高兴能用OSG来实现矢量数据的渲染以及与地形的无缝结合。

基本的思路是,将矢量数据渲染到纹理,然后再把纹理贴到地形之上。这种做法和几何求交的方法比起来,不用大量计算,不用考虑LOD,不用考虑Z-fighting和多边形偏移,也不会产生任何与地形交叉或者明显浮在表面的问题;但是,纹理图的大小有限,一块50000x50000的地形不可能直接贴上一幅50000x50000的纹理;使用FBO实现的纹理烘焙也不能直接在过高分辨率的纹理上直接渲染(会产生OpenGL内存不足的错误)。因此,要解决这种问题还是需要动一番脑筋的。

我的一个不完善的解决方案为:使用RTT相机(也就是设置了setRenderTargetImplementation的Camera对象)为每一个地块(Tile)分别渲染矢量纹理,然后贴到各个地块上。这样的话,就不得不反复改变摄像机位置和姿态,多次渲染同一个矢量数据子场景,因此需要矢量场景有空间索引的机制,以加速渲染。为每个地块都指定一个RTT相机也是不现实的,这样会导致过多的节点分配和释放操作;我的做法是维护一个固定的相机队列,然后遍历各个地块,每次为需要更新的地块设置RTT相机并渲染到纹理。总体而言,这样做的效率还是不错的,已经可以在60米+90米的中国/全球地形数据上渲染一定规模的矢量数据了,点线面或者文字模型均可;注意每个地块的矢量纹理分辨率不宜太高(当然,越高的话,矢量的渲染就越清晰),否则OpenGL帧缓存对象承受不了。

看到版上也有别的朋友在钻研矢量显示的问题,特发此帖加一加油~~ 使用OSG绝对可以实现相当不错的矢量渲染方案,做别的事情也没有问题。OSG只是一个渲染引擎而已,但是只要有您在,它就会无所不能~~~~

多边形要素的显示,多边形上面顺便贴了一幅图

多边形要素的显示,多边形上面顺便贴了一幅图

等高线的渲染,每个地块512x512的分辨率

等高线的渲染,每个地块512x512的分辨率

更清晰的等高线渲染,每个地块1024x1024的分辨率

更清晰的等高线渲染,每个地块1024x1024的分辨率

该用户从未签到

发表于 2009-9-11 12:20:04 | 显示全部楼层
哈哈,,不错~~

该用户从未签到

发表于 2009-9-12 10:28:04 | 显示全部楼层
请问 在为每一个地块渲染矢量纹理的时候,是怎样把矢量数据和地形纹理的坐标对应起来的?

该用户从未签到

 楼主| 发表于 2009-9-12 11:03:10 | 显示全部楼层
矢量纹理也用地形的影像纹理坐标就可以了

该用户从未签到

发表于 2009-9-13 08:50:26 | 显示全部楼层
我的表达可能有些问题,我想问的是,在为每一个地块渲染矢量纹理的时候,是怎样设置所用的RTT相机的投影矩阵和观察矩阵的? (需要通过计算地块坐标范围和法向,然后移动RTT相机到该地块上方中心位置吗?并根据地块长宽范围设置正交投影矩阵?)
还有个问题,你是使用矢量纹理和影像纹理两重纹理做混合是吗?(开始我以为是直接把矢量数据渲染到地块的影像纹理上了) 那么是为所有的地块都分配一个矢量纹理么,还是只为需要的地块分配?(比如有一条矢量道路,它可能只会渲染到其经过的少量地块上,需要针对矢量数据的位置计算出哪些地块可能被渲染到矢量数据从而为其分配矢量纹理?)

该用户从未签到

发表于 2009-9-13 08:57:38 | 显示全部楼层
“我的做法是维护一个固定的相机队列,然后遍历各个地块,每次为需要更新的地块设置RTT相机并渲染到纹理”
这个相机队列会增长么?如果需要更新矢量纹理的地块超过相机队列中RTT相机的数量呢?
还有就是,对地块做纹理混合、是否需要更新矢量纹理的判断,是否需要派生个节点类来支持呢?

问题比较多,多谢解答。
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-9-13 22:04:07 | 显示全部楼层
    这个要支持的

    该用户从未签到

     楼主| 发表于 2009-9-14 09:01:32 | 显示全部楼层
    “需要通过计算地块坐标范围和法向,然后移动RTT相机到该地块上方中心位置吗?并根据地块长宽范
    围设置正交投影矩阵”


    是这样,不过由于地块的范围信息是固定的,因此我采用修改VPB的方式,在构建时就把它们写入到节点信息中了。

    “你是使用矢量纹理和影像纹理两重纹理做混合是吗”


    基本上是这样,当然我要用GLSL进行更详细的处理。

    “那么是为所有的地块都分配一个矢量纹理么,还是只为需要的地块分配”


    我的做法是可以只为需要的地块分配的,这取决于具体的用户需求

    该用户从未签到

     楼主| 发表于 2009-9-14 09:05:17 | 显示全部楼层
    “这个相机队列会增长么?如果需要更新矢量纹理的地块超过相机队列中RTT相机的数量呢?”


    我目前的做法不会。这个队列每帧都会更新并指向新的地块;因此当需要更新的地块较多时,可能需要数帧以至数十帧的时间来完成所有地块的更新,我个人觉得这样是可以接受的。

    “对地块做纹理混合、是否需要更新矢量纹理的判断,是否需要派生个节点类来支持呢?”


    我个人对OSG的使用方法:所有重要的功能类都会做派生并重新定义功能,Camera,MatrixTransform,PagedLOD,Geometry,以及DatabasePager……等等

    该用户从未签到

    发表于 2009-9-14 11:51:47 | 显示全部楼层
    多谢Arrray细致的解答

    该用户从未签到

    发表于 2009-9-17 03:57:38 | 显示全部楼层
    我的做法是维护一个固定的相机队列,然后遍历各个地块,每次为需要更新的地块设置RTT相机并渲染到纹理。

    对这个不是很理解具体怎么实现. 能再说具体一点么. 在什么时机遍历呢?
    还有这里的相机队列中的所有相机都是在同一个线程里面执行渲染吗?
    我最近也在做这个效果. 一直没做出来啊.

    该用户从未签到

    发表于 2009-9-17 03:59:21 | 显示全部楼层
    有样例代码最好. 因为我也是采用的您的这种方案, 可以结果总是不正确。 而且还总是崩溃掉.

    该用户从未签到

    发表于 2009-10-13 16:54:49 | 显示全部楼层
    楼主,俺想问个问题:

    我用OGR读取mif格式的数据,然后怎么在OSG里画出来呢?

    烦请提供一下思路呗~

    大概用到哪些类,我也好自己联系一下~

    不胜感激~

    该用户从未签到

    发表于 2009-10-16 15:29:18 | 显示全部楼层
    请问array,图上的等高线是原来数据带有的吗?还是计算出来的?
    我知道最简单的方法生成等高线,是用一维纹理,根据高程计算纹理坐标生成的。不过这种方法效果不好;

    该用户从未签到

     楼主| 发表于 2009-10-17 00:04:26 | 显示全部楼层
    不是计算的,我只是用它来演示矢量的绘制

    该用户从未签到

    发表于 2009-10-19 13:11:07 | 显示全部楼层
    真是很漂亮!

    该用户从未签到

    发表于 2009-10-21 08:10:15 | 显示全部楼层
    那个纹理贴图是怎么做成的呢?或者有什么文章讲到制作纹理贴图呢?我现在有一幅tif图,但是没有纹理图,所以看看能不能做纹理图?谢谢

    该用户从未签到

    发表于 2009-10-29 12:36:27 | 显示全部楼层

    也来show一下我做的矢量叠加

    国界.PNG

    测试用的,矢量图配色的不好,效果不是很清楚,但功能实现了
    方法是直接用切好的具有LOD分级的矢量图预处理到VPB切好的地形数据中

    该用户从未签到

    发表于 2009-11-12 05:47:22 | 显示全部楼层
    请问等高线矢量数据加的是颜色还是纹理呢,如果为这些线条加上纹理,纹理坐标如何处理呢?谢谢。

    该用户从未签到

    发表于 2009-11-12 06:02:45 | 显示全部楼层
    我是使用overlay技术将矢量图形,如铁路线,叠加到地形上面。地形由vpb生成。现在有铁路矢量数据,想叠加到地形上,利用overlay叠加的比较成功。但是由于一般地图上铁路用黑白相间的线条显示,所以想为铁路线条添加“黑白相间的线条纹理”,但不知道应该如何叠加纹理,纹理坐标也不好指定。请问您的等高线矢量数据加的是颜色还是纹理呢,如果为这些线条加上纹理,纹理坐标如何处理呢?谢谢。

    该用户从未签到

    发表于 2009-12-5 09:51:18 | 显示全部楼层
    21# tingzh
    我用overlay技术后投影出来的矢量图是平面的,怎么能叠加到地形上面呢?

    该用户从未签到

    发表于 2009-12-5 14:02:04 | 显示全部楼层
    osgSim::OverlayNode* overlayNode = new osgSim::OverlayNode(technique);
            /**//*每一帧都更新overlay的纹理*/
            overlayNode->setContinuousUpdate(true);
            /**//*设置将渲染成纹理的节点*/
            overlayNode->setOverlaySubgraph(movingModel);
            /**//*设置映射的高度,设成比地面低一点即可*/
            overlayNode->setOverlayBaseHeight(baseHeight-0.01);
            overlayNode->addChild(baseModel);
            root->addChild(overlayNode);
    我估计您没有把读入的矢量图放入到movingModel这个节点上,所有矢量节点应该加入到movingModel节点中的。

    该用户从未签到

    发表于 2010-4-17 10:41:01 | 显示全部楼层
    新人路过

    该用户从未签到

    发表于 2010-6-9 14:17:04 | 显示全部楼层
    有一个很现实的问题,你把矢量数据当纹理给贴上去了,对于GIS来说就没有什么用了。即无法拣选查询,又无法操作修改

    该用户从未签到

     楼主| 发表于 2010-6-9 15:13:32 | 显示全部楼层
    可以查询,也可以操作修改~~因为矢量依然是场景中的节点对象,只是被渲染到纹理而已

    该用户从未签到

    发表于 2010-9-10 10:45:06 | 显示全部楼层
    这种做法会不会出现在放大时,线会一起跟着变粗吗?(在新的LOD生成之前), ossimplanet有这个问题。

    该用户从未签到

    发表于 2010-9-11 13:53:26 | 显示全部楼层
    我是想给VPB生成的地球中,给中国加上边境,求大神帮助。
    我刚接触。

    该用户从未签到

    发表于 2011-4-13 17:08:22 | 显示全部楼层
    我做了一个小东西,使用rtt将一个shp文件贴到一个正方形上面,可我发现旋转这个正方形的时候,纹理跟正方形旋转稍微有些不同步,有些偏差,而且当图形拉远或者缩进的时候,纹理跟图形缩放比率也不同,纹理总是变化大些,比如拉远,图形还在,纹理就看不清了,缩进时候,纹理就会超出图形范围像被截断。还有个问题就是我使用RELATIVE_RF纹理显示,当使用ABSOLUTE_RF就看见图形,没有纹理,怎么回事?

    该用户从未签到

    发表于 2011-4-18 15:38:07 | 显示全部楼层
    回复 28# TsChus

       使用osggis,叠加lod的矢量图层,参见flysky的书,最后一章。

    该用户从未签到

    发表于 2011-7-12 14:25:00 | 显示全部楼层
    很好很强大
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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