兩種提取OSG中紋理座標的方法
阿新 • • 發佈:2019-02-08
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;
// }