查看: 1292|回复: 8

osgUtil::DelaudayTriangulator

[复制链接]

该用户从未签到

发表于 2012-8-19 16:34:23 | 显示全部楼层 |阅读模式
使用removeInternalTriangles()去掉约束多边形内部的三角形,为什么总是出现程序中断?

该用户从未签到

发表于 2012-8-20 07:56:26 | 显示全部楼层
是否是多线程渲染的问题,Dynamic设置了没有?

该用户从未签到

 楼主| 发表于 2012-8-20 08:48:13 | 显示全部楼层
liuzhiyu123 发表于 2012-8-20 07:56
是否是多线程渲染的问题,Dynamic设置了没有?

大师可不可以说具体些????

该用户从未签到

 楼主| 发表于 2012-8-21 16:15:39 | 显示全部楼层
中断啦………………………………………………!!!!!!!!!!!!!!!
未命名.jpg

该用户从未签到

 楼主| 发表于 2012-8-21 16:34:21 | 显示全部楼层
osg::Group* makedelaunay(osg::ref_ptr<osg::Vec3Array> bounds)
{  
osg::ref_ptr<osg::Group> grp=new osg::Group;
osg::ref_ptr<osg::Geode> geode=new osg::Geode;
osg::ref_ptr<osgUtil:elaunayTriangulator> trig=new osgUtil::DelaunayTriangulator();
osg::StateSet *stateset=geode->getOrCreateStateSet();
unsigned int nmax=bounds->getNumElements();
osg::Vec3Array *points=new osg::Vec3Array;

geode->setStateSet( stateset );

osgUtil::DelaunayConstraint * dc=new osgUtil::DelaunayConstraint;
dc->setVertexArray(bounds);
dc->addPrimitiveSet(new osg::DrawArrays(osg:rimitiveSet:INE_LOOP,0,nmax) );

trig->addInputConstraint(dc);
trig->setInputPointArray(points);
osg::Vec3Array *norms=new osg::Vec3Array;
trig->setOutputNormalArray(norms);

trig->triangulate();
osg::notify(osg::WARN) << " End of trig\n " <<std::endl;

osg::ref_ptr<osg::Geometry> gm=new osg::Geometry;
gm->setVertexArray(points);  
gm->addPrimitiveSet(trig->getTriangles());
gm->setNormalArray(trig->getOutputNormalArray());

gm->setNormalBinding(osg::Geometry::BIND_OVERALL);
gm->addPrimitiveSet(dc->getTriangles());

geode->addDrawable(gm.get());
trig->removeInternalTriangles(dc);//异常中断位置
geode->addDrawable(dc);
return grp;

}

该用户从未签到

发表于 2012-8-22 07:58:53 | 显示全部楼层
越界访问,检查一下是否有这种情况

该用户从未签到

 楼主| 发表于 2012-8-22 08:52:50 | 显示全部楼层
liuzhiyu123 发表于 2012-8-22 07:58
越界访问,检查一下是否有这种情况

我知道是越界了,可是不知道那里越界了呀,那个中断的位置,例子程序也是这样子写的呀,能说具体点儿么?

该用户从未签到

发表于 2012-8-22 08:54:54 | 显示全部楼层
本帖最后由 gis_wudi 于 2012-8-22 08:55 编辑

grp定义与返回最好一致
返回类型改成智能指针,并用智能指针来接收
或者return grp.release();
或者全部用指针类型

该用户从未签到

 楼主| 发表于 2012-8-22 09:21:30 | 显示全部楼层
gis_wudi 发表于 2012-8-22 08:54
grp定义与返回最好一致
返回类型改成智能指针,并用智能指针来接收
或者return grp.release();

函数定义成osg::ref_ptr<osg::Group> makedelauny(osg::ref_ptr<osg::Vec3Array>bounds){}
返回return grp.release();
依然会在trig->removveInternalTriangles(dc);出现中断

dos界面依然有:Warning: invalid index i ofr primitiveset passed to osg::Geometry::addPrimitiveSet<i,primitiveset>, ignoring call不知道这个是不是能帮大师看出错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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