|
今天遇到一个问题 我用下面的一个函数 给一个节点添加纹理坐标后 再保存出去.结果发现新输出的ive文件比原来的要小 打开一看 非常的模糊.原有的地形起伏基本都消失了.
如果不调用这个函数 直接保存的话 .则不会出项这种情况.
- ref_ptr<Node> data=osgDB::readNodeFile (file);
- applyTexture(data,txt_width,txt_height);
- osgDB::writeNodeFile (*(data.get()),output);
复制代码 其中调用的applyTexture方法 作用是递归找 直到找到下面的所有的Geode节点为止.- void applyTexture(Node* root,float width,float height){
- Geode* gn=root->asGeode ();
- if(gn)applyGeode(gn,width,height);
- Group* gp=root->asGroup ();
- if(gp){
- for(unsigned int i=0;i<gp->getNumChildren ();i++)
- {
- Node* child=gp->getChild(i);
- applyTexture(child,width,height);
- }
- }
- }
复制代码 最后实际写纹理坐标的代码:- void applyGeode(Geode* root,float width,float height)
- {
- if(root==NULL) return;
- //获取x,y范围
- BoundingBox box=root->getBoundingBox ();
- float dx=box.xMax ()-box.xMin ();
- float dy=box.yMax ()-box.yMin();
- for(unsigned int i=0;i<root->getNumDrawables ();i++)
- {
- Drawable* draw=root->getDrawable (i);
- Geometry* geom=draw->asGeometry ();
- if(geom)
- {
- Vec3Array* va=dynamic_cast<Vec3Array*>(geom->getVertexArray ());
- Vec2Array* txtCoord=new Vec2Array();
- Vec3Array::iterator it=va->begin ();
- while(it!=va->end()){
- float px=(*it).x();
- float py=(*it).y();
- float tx=(px-box.xMin())*width/dx;
- float ty=(py-box.yMin())*height/dy;
- txtCoord->push_back (Vec2(tx,ty));
-
- it++;
- }
- geom->setTexCoordArray (0,txtCoord);
- //set normal data
- Vec3Array* nc=new Vec3Array;
- nc->push_back(Vec3(0.f,-1.f,0.f));
- geom->setNormalArray(nc);
- geom->setNormalBinding(Geometry::BIND_OVERALL );
- }
- }
- }
复制代码 我觉得文件应该变大才对.
而且地形起伏也不会收到影响啊. |
|