查看: 2318|回复: 6

convertLatLongHeightToXYZ函数问题

[复制链接]

该用户从未签到

发表于 2009-12-5 22:24:56 | 显示全部楼层 |阅读模式
本帖最后由 口口广大 于 2009-12-5 23:46 编辑

利用VPB做了一个地球,已知某个模型的经度、纬度、高度,想利用convertLatLongHeightToXYZ函数转化出其在地心坐标系的XYZ坐标。但是按照转出的XYZ去放置模型,发现经纬度基本是正确的,但在高度上却高了很多,大概有5000多米。


为说明问题做了个简单的实验,即将经度120,纬度40,高度0的一个模型转换出其在地心坐标系下的的位置点osg:Vec3 center(x,y,z),然后画一条从地心 osg:Vec3(0,0,0)到center的线段,如图所示黄线段明显的高出地面一节,代码如下

  1. [local]1[/local]
  2. //加载地球模型
  3. osg::CoordinateSystemNode* csn = new osg::CoordinateSystemNode;
  4. csn->setEllipsoidModel(new osg::EllipsoidModel());

  5. osg::Node* TerrainNode= osgDB::readNodeFile("earth.osga");
  6. csn->addChild(TerrainNode);


  7. //将BLH转换为XYZ
  8. osg::Vec3d m_center;
  9. csn->getEllipsoidModel()->convertLatLongHeightToXYZ(osg:egreesToRadians(40.0f),osg:egreesToRadians(120.0f),0.0f,double(m_center.x()),double(m_center.y()),double(m_center.z()));

  10. //画从球心到xyz的线段
  11. osg::Geode *geode_line = new osg::Geode;
  12. osg::Geometry *geom = new osg::Geometry();
  13. geode_line->addDrawable(geom);
  14. csn->addChild(geode_line);
  15. osg::Vec3Array *v = new osg::Vec3Array();
  16. v->push_back(osg::Vec3(0,0,0));
  17. v->push_back(m_center);
  18. geom->setVertexArray(v);
  19. osg::Vec4Array *vc = new osg::Vec4Array();
  20. vc->push_back(osg::Vec4(1.0f,0.5f,0.0f,1.0f));
  21. geom->setColorArray(vc);
  22. geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);   
  23. geom->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INES,0,2));
复制代码



我试了下其他的几个坐标,有的高出地面,有的低于地面。我参考了osgSimulation,也是同样的问题
GetAttachment1.jpg

该用户从未签到

发表于 2009-12-6 00:02:28 | 显示全部楼层
这里你没有必要把经纬度转换为弧度,用的就是经纬度~~~~~~~~

该用户从未签到

 楼主| 发表于 2009-12-6 00:49:46 | 显示全部楼层
我改成

csn->getEllipsoidModel()->convertLatLongHeightToXYZ(40.0f,120.0f,0.0f,double(m_center.x()),double(m_center.y()),double(m_center.z()));

整个位置就差很多了,我想这里仍然要转化成弧度。

该用户从未签到

 楼主| 发表于 2009-12-6 00:55:12 | 显示全部楼层
官方论坛上有人回答了下这个问题
convertLatLongHeightToXYZ gives you a point on the surface of the ellipsoid, but the actual polygons in the terrain model are just a tessellated approximation of that ellipsoid. So if you want the point on the triangulated surface, you have to convert to XYZ and then "clamp" down to the surface (using the local up-vector at that point).
我还不太理解是什么意思

该用户从未签到

发表于 2009-12-6 11:58:35 | 显示全部楼层
意思是地形模型其实是椭球体的近似方格,你先转换为X,Y,Z,你再使用osg::Vec3d  computeLocalUpVector (double X, double Y, double Z) const 就可以了~~~~

该用户从未签到

 楼主| 发表于 2009-12-6 20:50:42 | 显示全部楼层
本帖最后由 口口广大 于 2009-12-6 23:10 编辑
意思是地形模型其实是椭球体的近似方格,你先转换为X,Y,Z,你再使用osg::Vec3d  computeLocalUpVector (double X, double Y, double Z) const 就可以了~~~~
FlySky 发表于 2009-12-6 11:58

  1. osg::Vec3d m_center;
  2. csn->getEllipsoidModel()->convertLatLongHeightToXYZ(osg::inDegrees(40.0f),osg::inDegrees(120.0f),0.0f,double(m_center.x()),double(m_center.y()),double(m_center.z()));

  3. osg::Vec3d center;
  4. center.set(csn->getEllipsoidModel()->computeLocalUpVector(m_center.x(),m_center.y(),m_center.z()));
复制代码
是这样用吗?怎么osg::Vec3d center得出来的结果是三个小于1的数?

还有一个问题,在地心坐标系如何设置一个模型的方位向量(pitch,row,yaw)?比如我想放一个房子在东经120,北纬40的地方,如果是在平面坐标系下,我只要让房子的坐标轴和平面的坐标轴一致就可以了,因为平面坐标系的Z轴始终指向一个方向。但在地心坐标系下,就不知如何计算方位了。

我知道用以上computeLocalUpVector算出的向量可以设置该模型的方位,但不知道该怎麽用。

我是用一个PositionAttitudeTransform来设置模型的位置和方位
不知以下的代码对不对?


  1. osg::Quat rotation =(osg::Quat(center.x(),osg::Vec3(1.0,0.0,0.0))*osg::Quat(center.y(),osg::Vec3(0.0,1.0,0.0))*osg::Quat(center.z(),osg::Vec3(0.0,0.0,1.0)));

  2. myObject->PositionAttitudeTransform->setAttitude(rotation);
复制代码




该用户从未签到

发表于 2009-12-7 06:01:50 | 显示全部楼层
邮件列表已经回复你的问题:
1) Get the XYZ using convertLatLongHeightToXYZ (lat/long must be in radians).

2) Get the local normalized UP vector at that point, as in your code above. (you need revision 10536 or newer for this method to work correctly -- if you are using an older version, just copy the newer code and do it manually).

3) Start at your XYZ, and extend along the up vector in each direction to create a line segment long enough to intersect the terrain.

4) Use the osgUtil:ineSegmentIntersector to find the intersection point.

Keep in mind that the intersection point will be different for each LOD in your VPB terrain ... but that's another topic.


你得到的osg::Vec3的LocalUpVector是一个向量,你旋转的话,需要转换为角度吧~不知道这样理解是否正确~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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