查看: 1937|回复: 8

超级指针建立的vec3array变量怎样清空?

[复制链接]

该用户从未签到

发表于 2010-2-4 16:26:59 | 显示全部楼层 |阅读模式
osg::ref-ptr<osg::vec3Array> v=new osg::vec3Array
这样建立的变量清空的时候可以用clear()和resize(0)吗?我怎么感觉清空以后再往里面
pushback数据运行不正常了呢?

该用户从未签到

发表于 2010-2-4 16:32:59 | 显示全部楼层
没有问题,您感觉不正常可能是其它代码编写不当而已

该用户从未签到

 楼主| 发表于 2010-2-4 20:08:48 | 显示全部楼层
版主大哥,我是这么用的,我用v保存的数据是用来画线的,用法如下:
geom->setVertexArray(v);
geom->addprimitiveset(new osg:rawArrays(osg:rimitiveset:INES,point_num-2,2));
其中,point_num是用来画线的点的数目,基本的思路是每一帧都画一条线,这条线是倒数第二个点到
最后一个点的连线,第一次运行,画线是对的,但是当我用v->clear()将数组v清空,point_num也初
始化为零之后,将点的数据重新再pushback点进v,然后再画线,问题就出来了,倒数第二个点到最后一个点的线画完之后,总是会将最后一个点再连接到原点画条线,这是为什么呢?像这种连接到默认原点的情况都是在什么情况下会出现呢?

该用户从未签到

发表于 2010-2-5 08:22:43 | 显示全部楼层
我认为您看到的现象是对于数据的更新不当所致,或者这只是您自己的代码编写有问题而已:

绘制动态几何体时,建议关闭显示列表,并启用VBO:
setUseDisplayList(false);
setUseVertexBufferObjects(true);

并且在每次更新顶点列表和图元时(包括修改顶点值以及clear等操作),强制刷新顶点数组和图元信息:
v->dirty();
drawArrays->dirty();

不要每帧都用addPrimitiveSet添加新建图元,那无异于疯狂的行为!

当然您也可以使用默认的显示列表方式,尽管那样会降低性能。此时,每次更新顶点列表时,需要强制重构显示列表:
geom->dirtyDisplayList();

《OpenSceneGraph三维渲染引擎设计与实践》一书的资源网站中有一个专门介绍动态绘制的例子,建议您一看。

该用户从未签到

 楼主| 发表于 2010-2-5 08:59:05 | 显示全部楼层
谢谢指点了,呵呵~不过您说的是哪个网站啊?我没找到啊,能把网址发给我吗?

该用户从未签到

发表于 2010-2-5 09:17:17 | 显示全部楼层
置顶贴

该用户从未签到

 楼主| 发表于 2010-2-5 11:11:52 | 显示全部楼层
我看到了那个例子了,不过它的顶点数目是不变的,我的顶点数目一直在增加,而且我需要保留画图轨迹,就不能把addPrimitiveSet放在主函数里了,这种情况怎么办?

该用户从未签到

发表于 2010-2-5 12:21:14 | 显示全部楼层
直接对您的drawArrays对象进行操作,setCount(),然后dirty()就可以了,不要一直不停地addPrimitiveSet

该用户从未签到

 楼主| 发表于 2010-2-5 12:28:58 | 显示全部楼层
哦,明白了,谢谢啊~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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