查看: 1818|回复: 5

射线求交获得地球表面高度

[复制链接]

该用户从未签到

发表于 2010-5-26 16:46:58 | 显示全部楼层 |阅读模式
各位大大好,我在用射线求交获得地球表面的经纬度高,获得的经纬度是正确的而高度不正确,测得大陆的高度却是负数,不知道为什么,使用的求交代码如下:
osg::ref_ptr<osg:ineSegment> lineSegment = new osg::LineSegment();
osg::Vec3 terrainHeight;
lineSegment->set(
  osg::Vec3(x, y, z) ,
  osg::Vec3(x1, y1, z1) );
osgUtil::IntersectVisitor intersectVisitor;
intersectVisitor.addLineSegment(lineSegment);
node->accept(intersectVisitor);
osgUtil::IntersectVisitor::HitList hitList;
hitList =intersectVisitor.getHitList(lineSegment);
osgUtil::Hit heightTestResults;
if ( hitList.empty() )
{
  std::cout << " couldn't place the model on terrain" << std::endl;
  AfxMessageBox(L"empty");
  }
heightTestResults = hitList.front();
osg::Vec3 terrainHeight=heightTestResults.getLocalIntersectPoint();
return terrainHeight;

该用户从未签到

发表于 2010-5-26 16:56:14 | 显示全部楼层
1、请使用getWorldIntersectPoint()获取世界坐标而非局部坐标
2、IntersectVisitor有些太古老了,建议您使用IntersectionVisitor和LinesegmentIntersector

该用户从未签到

 楼主| 发表于 2010-5-26 17:19:09 | 显示全部楼层
哦,谢谢array老大回复,那个getWorldIntersectPoint()是写错了,已经改了,高度还是有问题,我去看了下osgPick, osg::ref_ptr< osgUtil:ineSegmentIntersector > picker = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::MODEL, vecStart, vecEnd);
        osgUtil::IntersectionVisitor iv(picker.get());
        node->accept(iv);
if (picker->containsIntersections())
        {
                intersections = picker->getIntersections();
                for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
                        hitr != intersections.end();
                        ++hitr)
                {
                       
                        terrainHeight=hitr->getWorldIntersectPoint().z();

               
                }

        }
        改成这样,高度也不对。。。不知道写的哪个地方有问题

该用户从未签到

发表于 2010-5-27 08:23:23 | 显示全部楼层
我不知道您所说的不对是怎么讲。既然您要求取经纬度高度的话,应该有相应的转换过程才对,因为这里getWorldIntersectPoint直接得到的是笛卡儿坐标系下的Z坐标。但是我并没有看到您之后的经纬度转换过程

该用户从未签到

 楼主| 发表于 2010-5-27 09:22:01 | 显示全部楼层
本帖最后由 fqyd1987 于 2010-5-27 09:40 编辑

osg::EllipsoidModel::convertXYZToLatLongHeight我采用的这个把  hitr->getWorldIntersectPoint()  转换成经纬高的:
osg::ref_ptr<osg::EllipsoidModel> Em=new osg::EllipsoidModel;
double x,y,z;
Em->convertXYZToLatLongHeight(hitr->getWorldIntersectPoint().x(),hitr->getWorldIntersectPoint().y(),hitr->getWorldIntersectPoint().z(),lat,lon,hei)

我的方法就是把当前的经纬高通过convertLatLongHeightToXYZ转换成世界坐标,作为射线求交的起点,然后把(0.0,0.0,0.0)作为射线求交的终点,与地球节点进行求交得到交点,再转换通过convertXYZToLatLongHeight成经纬度高,高度负的不对着。。。

该用户从未签到

发表于 2010-5-27 13:26:37 | 显示全部楼层
您是否考虑了地球中心位置的影响?如果地球中心不在零点,要把getWorldIntersectPoint减去一个偏移量才行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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