查看: 3077|回复: 6

关于动态更新顶点的问题

[复制链接]

该用户从未签到

发表于 2013-6-24 18:50:05 | 显示全部楼层 |阅读模式
#include <osg\Geometry>
#include <osg\Group>
#include <osgViewer\Viewer>
#include <osg\LineWidth>
#include <iostream>
#include <osgViewer/ViewerEventHandlers>
class DynamicLineCallback: public osg:rawable::UpdateCallback
{
public:
        DynamicLineCallback()
        {

        }
        virtual void update(osg::NodeVisitor* nv, osg::Drawable* drawable)
        {
                osg::Geometry* geom = dynamic_cast<osg::Geometry*>(drawable);
                if (!geom) return;
                osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray() );
                if (vertices)
                {
                        if ( vertices->size() > 5 )
                        {
                                vertices->pop_back();
                                std::cout<< vertices->size()<<std::endl;
                        }
                }
                vertices->dirty();
                geom->setVertexArray( vertices );
                geom->dirtyBound();
        }
};
int main()
{
        osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(10);
        for (unsigned int i=0; i<10; i++)
                (*vertices)[i].set(float(i), 0.0f,0.0f);

        osg::ref_ptr<osg::Geometry> lineGeom = new osg::Geometry;
        lineGeom->setDataVariance( osg::Object::DYNAMIC );

        lineGeom->setVertexArray( vertices.get() );
        lineGeom->addPrimitiveSet( new  osg::DrawArrays(osg::DrawArrays:OINTS,0,vertices->size() ) );

        lineGeom->setInitialBound( osg::BoundingBox( osg::Vec3(-20.0f,-20.0f,-20.0f), osg::Vec3(20.0f,20.0f,20.0f)) );
        lineGeom->setUseDisplayList( false );
        lineGeom->setUseVertexBufferObjects( true );
        lineGeom->setUpdateCallback( new DynamicLineCallback());

        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF);
        geode->getOrCreateStateSet()->setAttribute( new osg:ineWidth(4.0f));

        geode->addDrawable( lineGeom.get() );

        osgViewer::Viewer viewer;
        viewer.setSceneData( geode.get() );
        viewer.addEventHandler( new osgViewer::WindowSizeHandler);

        return viewer.run();

}


我在屏幕上画了10个点,给该Geometry设置了一个更新回调,想在回调里面删除5个点。但是无论怎么设置,屏幕上仍然显示有9个点。请问一下是什么原因?哪里没有设置好???

该用户从未签到

发表于 2013-6-24 19:45:10 | 显示全部楼层
您没有启用Geometry的VBO模式,那么默认用的是DisplayList,那么您更新的时候就必须dirtyDisplayList()来销毁和重建显示列表,这样的效率显然比较低。请启用了VBO之后再用va->dirty()来随时更新动态数据

该用户从未签到

 楼主| 发表于 2013-6-26 19:19:40 | 显示全部楼层
lineGeom->setUseVertexBufferObjects( true );
这句话不是用来启用Geometry的VBO模式的????

该用户从未签到

发表于 2013-6-27 09:06:30 | 显示全部楼层

该用户从未签到

 楼主| 发表于 2013-6-27 09:43:38 | 显示全部楼层
那我的设置应该是对的,难道我的显卡不支持VBO????

该用户从未签到

发表于 2013-6-28 09:36:45 | 显示全部楼层
。请启用了VBO之后再用va->dirty()来随时更新动态数据

该用户从未签到

发表于 2013-7-1 08:39:51 | 显示全部楼层
您删除顶点之后,记得还要更新您的PrimitiveSet信息,可以直接得到DrawArrays,重新设置setCount()然后dirty()
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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