查看: 3051|回复: 9

关于shape类及其子类

[复制链接]

该用户从未签到

发表于 2008-9-10 10:35:56 | 显示全部楼层 |阅读模式
我们知道,shape类是用来产生几何体的。shape类产生的几何体能不能像Geometry类那样操作呢?比如说用Cylinder产生一个圆柱体,怎样才能只在上底帖纹理呢?

该用户从未签到

发表于 2008-9-10 12:20:56 | 显示全部楼层
遍历一下得到这个面,,然后再贴纹理吧~~~~~~~~

该用户从未签到

发表于 2008-9-10 14:03:07 | 显示全部楼层
Shape类的基本几何体在实际应用中的意义恐怕不是很大,事实上我记得它们中有些甚至是用glBegin/glEnd生成的。这样没办法用OSG的常规方法贴纹理的,纯粹作演示用~~

该用户从未签到

 楼主| 发表于 2008-9-10 14:28:46 | 显示全部楼层
原帖由 array 于 2008-9-10 14:03 发表
Shape类的基本几何体在实际应用中的意义恐怕不是很大,事实上我记得它们中有些甚至是用glBegin/glEnd生成的。这样没办法用OSG的常规方法贴纹理的,纯粹作演示用~~

那要画一个可以帖纹理的圆柱体应该怎么做呀?

该用户从未签到

发表于 2008-9-10 14:33:41 | 显示全部楼层
原帖由 Sailent 于 2008-9-10 14:28 发表

那要画一个可以帖纹理的圆柱体应该怎么做呀?


比如自己动手用Geometry类画一个,或者从模型文件读入。
OSG的建模能力一直比较薄弱,这个也是不争的事实。况且Robert似乎对此不太关注,记得osg-users有一些提议,不过好像也没怎么响应~~也许以后会改善的,至少我想针对这方面做一做工作(不过也得转过年再说了^_^)

该用户从未签到

 楼主| 发表于 2008-9-10 16:40:36 | 显示全部楼层
原帖由 array 于 2008-9-10 14:33 发表


比如自己动手用Geometry类画一个,或者从模型文件读入。
OSG的建模能力一直比较薄弱,这个也是不争的事实。况且Robert似乎对此不太关注,记得osg-users有一些提议,不过好像也没怎么响应~~也许以后会改善的,至 ...

我用Geometry类画了一个圆,但还是载入不了纹理啊:
  1. osg::ref_ptr<osg::Node> CreateSphere()
  2. {
  3. //画表达式为x*x+z*z=1,y=0的圆
  4.         osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  5.         for (float a=-1.0;a<=1.0;a+=0.04)
  6.         {
  7.                 v->push_back(osg::Vec3(a,0.0f,sqrt(1-pow(a,2))+5.0));
  8. //                v->push_back(osg::Vec3(a,0.0f,-1*sqrt(1-pow(a,2))+5.0));
  9.         }
  10.         for (float a=1.0;a>=-1.0;a-=0.04)
  11.         {
  12. //                v->push_back(osg::Vec3(a,0.0f,sqrt(1-pow(a,2))+5.0));
  13.                 v->push_back(osg::Vec3(a,0.0f,-1*sqrt(1-pow(a,2))+5.0));
  14.         }

  15. //纹理坐标
  16.         osg::ref_ptr<osg::Vec2Array> tc = new osg::Vec2Array;
  17.         tc->push_back( osg::Vec2( 0.0f, 0.0f ) );
  18.         tc->push_back( osg::Vec2(0.0f, 1.0f ) );
  19.         tc->push_back( osg::Vec2( 1.0f, 0.0f ) );
  20.         tc->push_back( osg::Vec2( 1.0f, 1.0f ) );

  21.         osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
  22.         c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );

  23.         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
  24.         geom->setVertexArray( v.get() );
  25.         geom->setTexCoordArray( 0, tc.get() );
  26.         geom->setColorArray( c.get() );
  27.         geom->setColorBinding( osg::Geometry::BIND_OVERALL );

  28.         geom->addPrimitiveSet(new osg::DrawArrays( osg::PrimitiveSet::POLYGON, 0,100) );
  29.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  30.         geode->addDrawable( geom.get() );

  31.         // set up the texture state.   
  32.         osg::Texture2D* texture = new osg::Texture2D;
  33.         texture->setDataVariance(osg::Object::DYNAMIC); // protect from being optimized away as static state.
  34. //        texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
  35. //        texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
  36.         texture->setImage(osgDB::readImageFile("instrument2.gif"));

  37.         osg::StateSet* stateset = geode->getOrCreateStateSet();
  38.         stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);
  39.         stateset->setMode( GL_LIGHTING, osg::StateAttribute::OFF |
  40.                 osg::StateAttribute::PROTECTED );

  41.         return geode.get();
  42. }
复制代码
我想载入的纹理:
instrument2.gif

该用户从未签到

发表于 2008-9-10 17:15:54 | 显示全部楼层
纹理坐标要点对点的,您定义了多少个顶点,就要相应地定义多少个纹理坐标。

该用户从未签到

 楼主| 发表于 2008-9-10 17:50:29 | 显示全部楼层
谢谢了,纹理已经帖上去了。不过这样很麻烦呀,帖个纹理要定义那么多坐标……有没有办法只定义少数几个坐标就可以把一个纹理帖到一个圆形的平面上的呢?

该用户从未签到

 楼主| 发表于 2008-9-10 18:09:14 | 显示全部楼层
还有,假如遇到这种情况:用Geometry类画一个长方体(需要8个顶点),然而只需要为这个长方体的一个面贴上纹理,该怎么做呢?纹理坐标该取几个点呢?

该用户从未签到

发表于 2008-9-10 19:50:27 | 显示全部楼层
原帖由 Sailent 于 2008-9-10 17:50 发表
谢谢了,纹理已经帖上去了。不过这样很麻烦呀,帖个纹理要定义那么多坐标……有没有办法只定义少数几个坐标就可以把一个纹理帖到一个圆形的平面上的呢?


可以使用TexGen渲染属性,等同于OpenGL的glTexGen,有很多官方例子可以参考的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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