查看: 1200|回复: 11

osg::Geomterty的绘制

[复制链接]

该用户从未签到

发表于 2017-7-28 21:01:18 | 显示全部楼层 |阅读模式
if(!_geom.valid())
{
        _geom = new osg::Geometry;
         _geom->setDataVariance(osg::Object:YNAMIC);

        _geom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
        _geom->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);
     

      
        //定义颜色数组
        osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
        _geom->setColorArray(c.get());
        _geom->setColorBinding(osg::Geometry::BIND_OVERALL);
        c->push_back(_LineColor);

        //定义法线
        osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
        _geom->setNormalArray(n.get());
        _geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
        n->push_back(osg::Vec3(0.f, -1.f, 0.f));

        _pointArray = new osg::Vec3Array;
        _geom->setVertexArray(_pointArray.get());
}
//添加顶点
....
_geom->addPrimitiveSet(
                new osg::DrawArrays(osg:rimitiveSet:UADS, primitiveSetCount, 4));
    primitiveSetCount++;

请问这么绘制的时候每个图元之间有交集的地方 闪烁  该如何解决

该用户从未签到

 楼主| 发表于 2017-8-16 10:51:20 | 显示全部楼层
gnibuoz 发表于 2017-8-15 17:50
如果量比较大的话确实是个问题,那么你已经解决了吗?

现在用的奇淫巧记解决的
利用Qt的QPolygon每次取边界点的交集
然后连成lineLoop 进行三角分割
大概代码如下
//设置顶点关联方式
    blendShapeGeom->addPrimitiveSet(
                new osg:rawArrays(osg:rimitiveSet:INE_LOOP, 0, v->size()));
    blendShapeGeom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
   osgUtil::Tessellator tessellator;
    tessellator.setBoundaryOnly(false);
    tessellator.setTessellationType(osgUtil::Tessellator::TESS_TYPE_GEOMETRY);
    tessellator.setWindingType(osgUtil::Tessellator::TESS_WINDING_ODD);
    tessellator.retessellatePolygons(*(blendShapeGeom.get()));
也算是基本解决了  
我看了osgEarth::Geomtery也有这个取并集的功能 但是用了并没有效果
也许是我用的方式不对

该用户从未签到

 楼主| 发表于 2017-7-28 21:02:57 | 显示全部楼层
这一句是
geom->addPrimitiveSet(
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; new osg:rawArrays(osg:rimitiveSet:UADS, primitiveSetCount*4, 4));

该用户从未签到

发表于 2017-8-8 15:47:31 | 显示全部楼层
每个图元之间有交集的地方 闪烁,从你贴上来的代码没看出问题,但是图元交集闪烁很有可能是你的顶点划分不合理,导致图元间的平面重叠,进而随着视点变化,平面互相遮挡导致闪烁

该用户从未签到

 楼主| 发表于 2017-8-10 17:32:04 | 显示全部楼层
gnibuoz 发表于 2017-8-8 15:47
每个图元之间有交集的地方 闪烁,从你贴上来的代码没看出问题,但是图元交集闪烁很有可能是你的顶点划分不 ...

顶点划分是合理的 因为每次都是一个类似梯形  只是梯形的区域有重叠  造成闪烁

该用户从未签到

发表于 2017-8-11 10:09:56 | 显示全部楼层
ldxcomeon 发表于 2017-8-10 17:32
顶点划分是合理的 因为每次都是一个类似梯形  只是梯形的区域有重叠  造成闪烁

可以传几张截图看看

该用户从未签到

 楼主| 发表于 2017-8-11 20:19:14 | 显示全部楼层
gnibuoz 发表于 2017-8-11 10:09
可以传几张截图看看

就是这样子

这是效果图

这是效果图

该用户从未签到

发表于 2017-8-14 12:14:37 | 显示全部楼层

刚看到,不好意思你这几个红色矩形是高度都是一样的吗?如果都是一样的话,那肯定会闪烁,面片之间的距离太近时由于z-fighting现象的存在,视点变化时就会产生闪烁现象,如果是这个原因的话,你可以试着把几个矩形的高度稍微错开点试试

该用户从未签到

 楼主| 发表于 2017-8-14 16:18:45 | 显示全部楼层
gnibuoz 发表于 2017-8-14 12:14
刚看到,不好意思你这几个红色矩形是高度都是一样的吗?如果都是一样的话,那肯定会闪烁,面片之间的距离 ...

但是我这个四边形是一直叠加的  就类似飞机一直在天上飞   一直扫描地面形成的形状  高度一直加的话就会叠加很高的 起始最好是把这些多边形融合到一起   形成一个大的多边形

该用户从未签到

发表于 2017-8-15 17:50:54 | 显示全部楼层
ldxcomeon 发表于 2017-8-14 16:18
但是我这个四边形是一直叠加的  就类似飞机一直在天上飞   一直扫描地面形成的形状  高度一直加的话就会 ...

如果量比较大的话确实是个问题,那么你已经解决了吗?

该用户从未签到

发表于 2017-8-16 16:09:53 | 显示全部楼层
ldxcomeon 发表于 2017-8-16 10:51
现在用的奇淫巧记解决的
利用Qt的QPolygon每次取边界点的交集
然后连成lineLoop 进行三角分割

厉害了,解决问题就是要脑洞够大,哈哈!

该用户从未签到

 楼主| 发表于 2017-8-16 16:48:47 | 显示全部楼层
gnibuoz 发表于 2017-8-16 16:09
厉害了,解决问题就是要脑洞够大,哈哈!

惭愧啊 学业不精!谁叫我是小菜鸟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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