查看: 2013|回复: 4

大坐标问题

[复制链接]

该用户从未签到

发表于 2009-9-8 16:47:11 | 显示全部楼层 |阅读模式
本帖最后由 forest37 于 2009-9-8 16:48 编辑

当数据坐标较大时(五位数),显示对象闪烁;当数据坐标很大时(七位数),显示对象显示不出来,不知道各位是否遇到这种情况,除了将所有坐标点偏移一个值,还有其他解决方法吗?代码如下,将60000换成6000000时,什么也显示不出来。
#include "stdafx.h"
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Vec3>
#include <osg/MatrixTransform>
#include <osg/Group>
#include <osgViewer/Viewer>

osg::ref_ptr<osg::Node> createTransform()
{       
        osg::MatrixTransform *mt = new osg::MatrixTransform();
        mt->setMatrix(osg::Matrix::translate(-60000,0,0));

        osg::Geode *geo=new osg::Geode;
        mt->addChild(geo);

        osg::Geometry* geom=new osg::Geometry;
        osg::Vec3Array* vec3a= new osg::Vec3Array;
        vec3a->push_back(osg::Vec3(60000.4,0,0.4));
        vec3a->push_back(osg::Vec3(60000.4,0,0.6));
        vec3a->push_back(osg::Vec3(60000.6,0,0.6));
        vec3a->push_back(osg::Vec3(60000.6,0,0.4));
        geom->setVertexArray(vec3a);
        geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));
        geo->addDrawable(geom);
       
        return mt;
}

int main(int, char **)
{
        osgViewer::Viewer viewer;
        viewer.setSceneData( createTransform() );
        return viewer.run();
}

该用户从未签到

发表于 2009-9-8 21:50:22 | 显示全部楼层
注意OpenGL只支持float形式的数据,因此您最好用MatrixTransform节点和Geode节点结合进行绘制,不然数据精度上无法保证

该用户从未签到

发表于 2012-9-11 14:46:09 | 显示全部楼层
到底应该怎么做

该用户从未签到

发表于 2012-9-12 11:19:09 | 显示全部楼层
简单来说,就是把Geometry中的
vertex->push_back(osg::Vec3(6000000, 0, 0))
改成:
vertex->push_back(osg::Vec3(6000, 0, 0))
并且叠加一个MatrixTransform在(1000,0,0)的位置上,降低局部有效位数

该用户从未签到

发表于 2012-9-12 13:07:15 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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