查看: 1647|回复: 10

坐标旋转后的误差问题

[复制链接]

该用户从未签到

发表于 2012-9-21 15:04:58 | 显示全部楼层 |阅读模式
将地心下的坐标旋转平移到某块局部坐标下,然后逆运算反转回去,结果输出与输入值不一样,应该是旋转带来的误差,请问如何消除这种误差????   
以下是测试代码:
        double x,y,z;
        osg::EllipsoidModel em;
        em.convertLatLongHeightToXYZ(osg::inDegrees(39.123456),osg::inDegrees(116.123456),1000.0,x,y,z);
        osg::Vec3d p(x,y,z);
        p = p*osg::Matrixd::translate(2544540.0f, -4950970.0f, -3103160.0f);
        p = p*osg::Matrixd::rotate(osg:egreesToRadians(58.0),osg::Vec3(1.0,0.0,0.0),
                osg::DegreesToRadians(23.0),osg::Vec3(0.0,1.0,0.0),
                osg::DegreesToRadians(-14.0), osg::Vec3(0.0,0.0,1.0));
        p = p*osg::Matrixd::rotate(osg::DegreesToRadians(-58.0), osg::Vec3(1.0,0.0,0.0),
                osg::DegreesToRadians(-23.0), osg::Vec3(0.0,1.0,0.0),
                osg::DegreesToRadians(14.0), osg::Vec3(0.0,0.0,1.0));
        p = p*osg::Matrixd::translate(-2544540.0f, 4950970.0f, 3103160.0f);
        double lon,lat,hgt;
        em.convertXYZToLatLongHeight(p.x(),p.y(),p.z(),lat,lon,hgt);

lon != 116.123456,lat!=39.123456,hgt!=1000.0, ????

该用户从未签到

发表于 2012-9-23 00:00:55 | 显示全部楼层
我帮你顶一下好了。

该用户从未签到

发表于 2012-9-23 11:55:36 | 显示全部楼层
乘上一个当地矩阵就可以了

该用户从未签到

 楼主| 发表于 2012-9-23 12:40:12 | 显示全部楼层
StackSnow 发表于 2012-9-23 11:55
乘上一个当地矩阵就可以了

能否具体说下?反应在代码上,我对这个不熟,谢谢!

该用户从未签到

发表于 2012-9-23 19:42:30 | 显示全部楼层
white_water125 发表于 2012-9-23 12:40
能否具体说下?反应在代码上,我对这个不熟,谢谢!

哦 好象是我看错了,你是想先平移再旋转,在逆旋转再平移回去,然后用该值计算经纬度和之前的不一样是吧

该用户从未签到

发表于 2012-9-23 19:44:05 | 显示全部楼层
em.convertLatLongHeightToXYZ(osg::inDegrees(39.123456),osg::inDegrees(116.123456),1000.0,x,y,z);



这里面的参数 应该是弧度的吧

  em.convertXYZToLatLongHeight(p.x(),p.y(),p.z(),lat,lon,hgt);
得到的应该也是弧度

该用户从未签到

 楼主| 发表于 2012-9-23 21:19:55 | 显示全部楼层
StackSnow 发表于 2012-9-23 19:44
这里面的参数 应该是弧度的吧

  em.convertXYZToLatLongHeight(p.x(),p.y(),p.z(),lat,lon,hgt);
...

感谢snow的回答,你说的没错,其实我的问题代码里少了两行:
lon = osg::RadiansToDegrees(lon);
lat = osg::RadiansToDegrees(lat);

结果是一样的,lon != 116.123456, lat != 39.123456 ? 单纯从数学公式上讲似乎没看出什么问题,但结果就是这样的?

该用户从未签到

发表于 2012-9-24 11:48:03 | 显示全部楼层
em.convertLatLongHeightToXYZ(osg::inDegrees(39.123456),osg::inDegrees(116.123456),1000.0,x,y,z);


这个的参数 应该是弧度,  你是把这些参数成了度然后传进去的

后面返回的时候 弧度转成了度  怎么会和39.123456  116.123456相同呢

该用户从未签到

 楼主| 发表于 2012-9-24 12:39:23 | 显示全部楼层
StackSnow 发表于 2012-9-24 11:48
这个的参数 应该是弧度,  你是把这些参数成了度然后传进去的

后面返回的时候 弧度转成了度  怎么会 ...

osg::inDegrees 这个出来的是度????,不是吧,好像返回的就是弧度吧?

该用户从未签到

发表于 2012-9-24 12:47:23 | 显示全部楼层
white_water125 发表于 2012-9-24 12:39
osg::inDegrees 这个出来的是度????,不是吧,好像返回的就是弧度吧?

你这逆旋转的时候,旋转顺序是不是有问题

该用户从未签到

发表于 2012-9-24 12:48:43 | 显示全部楼层
osg::inDegrees

这个出来 确实是弧度
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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