查看: 4277|回复: 17

osgDem生成数字地球的经纬度查询?

[复制链接]

该用户从未签到

发表于 2009-8-19 21:38:09 | 显示全部楼层 |阅读模式
请问如何在osg三维场景中利用鼠标查询数字地球上经维度坐标?
直接利用Pick拾取的坐标值很大,如何转换成球心对应地球经纬度坐标?

该用户从未签到

发表于 2009-8-19 21:59:28 | 显示全部楼层
请先了解采用何种投影方式,然后利用该投影方式的正算和反算公式

该用户从未签到

发表于 2009-8-20 17:25:53 | 显示全部楼层
2#
那生成的ive文件怎么遍历得到地形的坐标值呢?osgviewer的时候直接是把地形节点放在(0,0,0)这个点了,怎么设置坐标呢?谢谢

该用户从未签到

发表于 2009-8-20 17:29:06 | 显示全部楼层
“osgviewer的时候直接是把地形节点放在(0,0,0)这个点了,怎么设置坐标呢”,抱歉我不明白您这句话的意思

该用户从未签到

发表于 2009-8-21 08:15:42 | 显示全部楼层
4# array
是这样的,把生成 的地形作为一个节点读到程序里面以后,这个节点的position是(0,0,0)。我现在想得到生成地形的地理坐标,比如经纬度,高程等等。不知道怎么做?请指导,谢谢

该用户从未签到

发表于 2009-8-21 08:34:55 | 显示全部楼层
您需要有地球作为参照物;一般只要DEM数据准确的话,生成的地形和实际位置是一致的;而计算某一点的高程可以用射线求交来实现

该用户从未签到

发表于 2009-8-21 09:47:11 | 显示全部楼层
6#
我在程序里写了如下代码 :
osg::CoordinateSystemNode* csn = new osg::CoordinateSystemNode;
        osg::EllipsoidModel* ellm = new osg::EllipsoidModel();
        csn->setEllipsoidModel(ellm);
        csn->addChild(root.get());
不知道是不是设置地球参照呢?但是地形的position还是(0,0,0);还有就是地形上要放一个坦克的话是不是要进行多边形检测呢,从而得到坦克与地形的交点?谢谢

该用户从未签到

发表于 2009-8-21 14:45:05 | 显示全部楼层
如果您使用osgdem处理地形的话,那么它的位置就不应当是原点了;具体还需要您自行排查
地形上物体与地形的碰撞检测的话,用物理引擎进行辅助是最好的,否则尽量不要做太过精确的交集测试,以免影响系统性能

该用户从未签到

发表于 2009-8-21 16:27:52 | 显示全部楼层
8#
是用osgdem生成的地形,然后读到程序里面去的,然后用boundingsphere来包围的时候,然后用boundingbox的时候,它的一个角点是在原点附近的。实在是不知道怎么回事了?

该用户从未签到

发表于 2009-8-21 22:39:00 | 显示全部楼层
那么地形应该就是在正确的位置的,不必太担心。至于您所说的“用boundingsphere来包围的时候,然后用boundingbox”,抱歉我不是很理解您的意思

该用户从未签到

发表于 2009-8-23 13:30:02 | 显示全部楼层
看来我的表达方式确实有待改进,我的意思是说读进地形节点后,用boundingsphere来包围地形节点,发现地形所处的坐标是(0,0,0),不知道是什么问题

该用户从未签到

发表于 2009-8-23 22:31:37 | 显示全部楼层
没有必要另外定义一个boundingsphere来做这种事情吧?或者您的代码写的有问题?

该用户从未签到

发表于 2009-8-24 08:14:12 | 显示全部楼层
我定义了boundingsphere是为了看它的位置的,我的代码发上来
        osg::ref_ptr<osg::Group> root = new osg::Group;
        osg::ref_ptr<osg::Node> terrainnode = new osg::Node;

        osg::CoordinateSystemNode* csn = new osg::CoordinateSystemNode;
        osg::EllipsoidModel* ellm = new osg::EllipsoidModel();
        csn->setEllipsoidModel(ellm);
        csn->addChild(root.get());


        terrainnode = osgDB::readNodeFile("terrain_cc.ive");
        root->addChild(terrainnode.get());
//        osg::BoundingSphere bs = terrainnode->getBound();
//        cout<<bs.center().x()<<" "<<bs.center().y()<<" "<<bs.center().z()<<endl;
        osgViewer::Viewer *viewer = new osgViewer::Viewer();
        viewer->setSceneData( csn );

        osgUtil::Optimizer optimizer;
        optimizer.optimize(csn);

        viewer->addEventHandler(new osgViewer::StatsHandler);

        viewer->addEventHandler(new osgViewer::WindowSizeHandler);
        viewer->realize();
        return viewer->run();
谢谢

该用户从未签到

发表于 2009-8-24 13:43:15 | 显示全部楼层
不要用BoundingSphere来看,意义不大。准确的地理坐标还是使用射线求交或者从原始数据中得到比较恰当

该用户从未签到

发表于 2009-8-24 17:39:59 | 显示全部楼层
嗯,明白了,但是用intersectionvisitor进行求交运算的时候,它的start和end就不知道如何确定了,因为读入来的地形节点是放在(0,0,0)的,所以start和end的点也是这个坐标系下的,而不是地理坐标了,不知道说的对不对,请指导,谢谢

该用户从未签到

发表于 2009-8-24 20:19:55 | 显示全部楼层
start和end肯定是世界坐标的点,也可以用屏幕坐标的点并执行坐标系变换

该用户从未签到

发表于 2009-8-24 21:15:51 | 显示全部楼层
嗯,大概明白一点了,不过地形节点的坐标系(xyz)和世界坐标貌似不是一个坐标系的,所以在射线求交得到的只能是世界坐标(也就是OSG定义的坐标),不知道说的对不对,谢谢

该用户从未签到

发表于 2009-8-24 22:50:44 | 显示全部楼层
地形节点可能是局部坐标系。intersectionvisitor可以直接得到其世界坐标,也可以是局部坐标
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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