查看: 2003|回复: 3

osgUtil::PlaneIntersector产生多余的交点(原点)

[复制链接]

该用户从未签到

发表于 2013-4-2 09:49:02 | 显示全部楼层 |阅读模式
osg:lane plane(osg::Vec4(0,1,0,-0.1));
     osgUtil::PlaneIntersector* pi = new osgUtil::PlaneIntersector(plane);
        osgUtil::IntersectionVisitor iv(pi);
        node->accept(iv);
        if(pi->containsIntersections())
        {
                for(osgUtil::PlaneIntersector::Intersections::iterator it = pi->getIntersections().begin();
                        it!=pi->getIntersections().end(); it++)
                {
                        //交点坐标
                        std::vector<osg::Vec3d> intersectPoints = it->polyline;
                        std::cout<<        intersectPoints.size()<<std::endl;
                        osg::Geode * geode=new osg::Geode;
                        osg::Geometry * geom=new osg::Geometry;
                        osg::Vec3Array* v3a=new osg::Vec3Array;
                        for (int i=0;i<intersectPoints.size();i++)
                        {
                                v3a->push_back(intersectPoints.at(i));
                        }
                        geom->setVertexArray(v3a);
                        geom->addPrimitiveSet(new osg:rawArrays(osg::PrimitiveSet::POLYGON,0,intersectPoints.size()));
                        geode->addDrawable(geom);
                        osg::BoundingSphere bs=geode->getBound();这里会有偶尔坐标原点产生,也就是说多边形相交产生了osg::Vec3(0.0,0.0,0.0)或者距离原点很近的点,不知道谁遇到过这种情况,还望指点,谢谢
                        std::cout<<"radius"<<bs.radius()<<std::endl;
                        root->addChild(geode);
                        //对应的参考矩阵
                        //osg::RefMatrix mat = it->matrix;
                }
        }
未命名.jpg 这个图片中那个灰色的圆片是正常面相交组成的polygon,左下角的乱的多边形,是坐标原点的位置,不是相交产生的,不知道哪位大师遇到过这种情况还望指点,谢谢

该用户从未签到

发表于 2013-4-2 13:22:18 | 显示全部楼层
您不妨检查一下这个时候交点都是哪些,是否BoundBox本身就已经是无效的了

该用户从未签到

 楼主| 发表于 2013-4-2 13:47:30 | 显示全部楼层
array 发表于 2013-4-2 13:22
您不妨检查一下这个时候交点都是哪些,是否BoundBox本身就已经是无效的了

我跟过了,交点intersectPoints是有的,并且都在原点附近,BoundingBox是有效地,不知道原因。对了,还有一个奇怪的现象,曾经我用ComputeBoundsVisitor 检查模型中心的时候,画出所有的boundingBox的线框,用的是这个函数,
  1. osg::ref_ptr<osg::Geode> getBox(osg::Node *node)
  2. {
  3.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  4.         osg::ComputeBoundsVisitor cbbv;
  5.         node->accept(cbbv);       
  6.         osg::BoundingBox box = cbbv.getBoundingBox();               

  7.         osg::Vec3 center = osg::Vec3(box.center().x(), box.center().y(), box.center().z());
  8.         float dx = box.xMax()-box.xMin();
  9.         float dy = box.yMax()-box.yMin();
  10.         float dz = box.zMax()-box.zMin();

  11.         osg::ref_ptr<osg::ShapeDrawable> pSelectionDrawble = new osg::ShapeDrawable(
  12.                 new osg::Box(center, dx, dy, dz));
  13.         pSelectionDrawble->setColor(osg::Vec4(1.0f, 1.0f, 0.0f, 0.3f));
  14.         geode->addDrawable(pSelectionDrawble.get());
  15.         osg::PolygonMode* polymode = new osg::PolygonMode;
  16.         polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
  17.         geode->getOrCreateStateSet()->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
  18.         geode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);
  19.         geode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
  20.         return geode;
  21. }
复制代码
也会在某个地方(猜测是原点位置)出现多个点,请Array大师指导,谢谢

该用户从未签到

发表于 2013-4-3 10:30:50 | 显示全部楼层
这种时候只能是您自己去做判断了,比如node是否是正确的,还有您取得的一直都是node的父节点坐标系下的数据,如果直接在根节点下进行绘制的话,肯定是不对的,您要考虑LocalToWorld变换的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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