1. 程式人生 > >兩種提取OSG中紋理座標的方法

兩種提取OSG中紋理座標的方法

OSG中提到的visitor通常都是使用NodeVisitor,在畢設論文中做場景重構的時候需要獲取三角面片的紋理座標時,用到了getTexCoorArray()函式,對他們的讀取要用到ArrayVisitor。但是網上有關ArrayVisitor的資料相當少,可能是因為ArrayVisitor的處理相對比較簡單的原因?

1.使用ArrayVisitor的方法獲取。

類似於NodeVisitor一樣,需要定義Visitor類:

#include <iostream>
#include <osgDB/ReadFile>
#include <osg/Node>
#include <osg/Group> #include <osg/Geode> #include <osgViewer/Viewer> #include <osg/Array> class TexCoorVisitor : public osg::ArrayVisitor { public: TexCoorVisitor(): osg::ArrayVisitor() { mTexCoorArray = new osg::Vec2Array; } virtual void apply(osg::Vec2Array
&array) { mTexCoorArray = &array; } osg::Vec2Array* GetTexCoorArray() { return mTexCoorArray; } private: osg::Vec2Array* mTexCoorArray; }; void main(int argc, char* argv[]) { osg::Node* node = osgDB::readNodeFile("cow.osg"); osgViewer::Viewer*
view = new osgViewer::Viewer; osg::ref_ptr<osg::Group> group = new osg::Group; group->addChild(node); //view->setSceneData(group.get()); //view->run(); osg::Geometry* geom = node->asGroup()->getChild(0)->asGeode()->getDrawable(0)->asGeometry(); osg::Array* tmp = geom->getTexCoordArray(0); TexCoorVisitor* tcv = new TexCoorVisitor; tmp->accept(*tcv); osg::Vec2Array* res = tcv->GetTexCoorArray(); std::cout<<res->size()<<std::endl; auto it = res->begin(); for(; it<res->end(); it++) { std::cout<<(*it).x()<<" "<<(*it).y()<<std::endl; } system("pause"); }

2.使用地址強轉的方法來獲取紋理座標陣列

如果明白ArrayVisitor的原理的話,其實還可以用地址強轉這種比較簡單的方法來獲取紋理座標。

osg::Vec2Array* coorArray = (osg::Vec2Array*) tmp;
    auto it = coorArray->begin();
//  for(; it<tmp2->end(); it++)
//  {
//  std::cout<<it->x()<<std::endl;
//  std::cout<<count++<<std::endl;
//  }