查看: 1369|回复: 13

为什么该段代码读出的顶点数组会有偏差

[复制链接]

该用户从未签到

发表于 2012-10-30 08:41:15 | 显示全部楼层 |阅读模式

class VertexVisitor : public osg::NodeVisitor
{
public:
        osg::ref_ptr<osg::Vec3Array> extracted_verts;   //保存顶点数据
        VertexVisitor() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
        {
                extracted_verts = new osg::Vec3Array();
        }

        void apply(osg::Geode& geode)  //重载apply方法
        {
                //得到每一个drawables
                for (unsigned int i=0; i<geode.getNumDrawables(); ++i)
                {
                        //得到几何体
                        osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode.getDrawable(i));
                        if(!geom)
                        {
                                std::cout<<"几何体错误!"<<std::endl;
                                continue;
                        }

                        //得到顶点数组
                        osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());
                        if(!verts)
                        {
                                std::cout<<"顶点数组错误!"<<std::endl;
                                continue;
                        }
                        //添加到extracted_verts
                        extracted_verts->insert(extracted_verts->end(), verts->begin(), verts->end());
                }
        }
};

附上测试的ive文件

puget.ive

260.74 KB, 下载次数: 2, 下载积分: 威望 1

测试文件

该用户从未签到

 楼主| 发表于 2012-10-30 08:42:29 | 显示全部楼层
偏差的数值为81925 ,请问为什么会这样

该用户从未签到

发表于 2012-10-30 08:50:34 | 显示全部楼层
父节点列表中可能还有矩阵

该用户从未签到

 楼主| 发表于 2012-10-30 09:26:27 | 显示全部楼层
求解决方案

该用户从未签到

发表于 2012-10-30 09:42:53 | 显示全部楼层
偏差的数值为81925 ,请问为什么会这样



是说顶点数少了这么多个吗? 你知道总个数?

该用户从未签到

发表于 2012-10-30 09:57:15 | 显示全部楼层
??

该用户从未签到

 楼主| 发表于 2012-10-30 09:59:30 | 显示全部楼层
是错位了,如果所有顶点的x坐标+81925
y坐标+81925 就正常了

该用户从未签到

 楼主| 发表于 2012-10-30 10:10:09 | 显示全部楼层
错位如图所示
有偏差.jpg

该用户从未签到

发表于 2012-10-30 10:15:21 | 显示全部楼层
父节点 有MT吧

该用户从未签到

 楼主| 发表于 2012-10-30 12:10:17 | 显示全部楼层
直接root->addChild不存在MT结点啊

该用户从未签到

发表于 2012-10-30 12:21:38 | 显示全部楼层
张逸 发表于 2012-10-30 12:10
直接root->addChild不存在MT结点啊

您的节点不可能都是Geode吧,肯定父节点中有MT

该用户从未签到

 楼主| 发表于 2012-10-30 14:12:07 | 显示全部楼层
nt main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
        osg::ref_ptr<osg::Group> root =  new osg::Group();

        osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("d:/ive/puget.ive");
        VertexVisitor vtea;
        node->accept(vtea);

         root->addChild(geode.get());
root->addChild(node.get());     // 显示原结点
osgUtil::Optimizer optmizer;
        optmizer.optimize(root.get());

        viewer->setSceneData(root.get());


        viewer->realize();
        viewer->run();
        return 0;
}

该用户从未签到

发表于 2012-10-30 14:47:54 | 显示全部楼层
去分析 d:/ive/puget.ive 到底有什么节点吧

该用户从未签到

发表于 2012-11-5 09:29:25 | 显示全部楼层
事实上将您的ive转换为osg后,它根本就不是一个Geometry而是osgTerrain的HeightField,并且整个Terrain是存在全局偏移的。您的NodeVisitor显然需要重写一下,并且如果您想要得到世界坐标顶点的话,请用computeLocalToWorld提前计算得到世界变换矩阵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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