OSG VBO的实现与顶点数据的动态更新

#include <osg\Geometry>
#include <osg\Group>
#include <osgViewer\Viewer>
#include <osg\LineWidth>
#include <iostream>
#include <osgViewer/ViewerEventHandlers>
class DynamicLineCallback: public osg::Drawable::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 )
{
if (vertices->size() == 6)
{
for (unsigned int i=0; i<vertices->size(); i++)
{
(*vertices)[i].set( vertices->at(i).x() + 5,  vertices->at(i).y(), vertices->at(i).z() );
}
}


vertices->pop_back();
for (unsigned int i=0; i<vertices->size(); i++)
{
std::cout<<vertices->at(i).x()<<"  "<<vertices->at(i).y()<<"  "<<vertices->at(i).z()<<std::endl;
}
std::cout<<std::endl<<std::endl;
}
}
osg::DrawArrays* da = (osg::DrawArrays*)geom->getPrimitiveSet(0);
da->setCount( vertices->size() );
da->dirty();
}
};
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);
std::cout<<vertices->at(i).x()<<"  "<<vertices->at(i).y()<<"  "<<vertices->at(i).z()<<std::endl;
}


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


lineGeom->setVertexArray( vertices.get() );
lineGeom->addPrimitiveSet( new  osg::DrawArrays(osg::DrawArrays::POINTS,0,vertices->size() ) );
lineGeom->setInitialBound( osg::BoundingBox( osg::Vec3(-20.0f,-20.0f,-20.0f), osg::Vec3(20.0f,20.0f,20.0f)) );

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::LineWidth(4.0f));


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


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


return viewer.run();


}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值