矩形的渲染与绘制:
代码如下:
osg::ref_ptr<osg::Node> createRec(osg::Vec3vec3, float length, floatwidth, float height)
{
osg::ref_ptr<osg::Geometry>geom =newosg::Geometry;//创建几何对象
osg::ref_ptr<osg::Vec3Array>v =newosg::Vec3Array;
v->push_back(vec3);
v->push_back(osg::Vec3(vec3.x()+length,vec3.y(),vec3.z()));
v->push_back(osg::Vec3(vec3.x()+length,vec3.y(),vec3.z()+height));
v->push_back(osg::Vec3(vec3.x(),vec3.y(),vec3.z()+height));
geom->setVertexArray(v.get());//设置顶点数组
osg::ref_ptr<osg::Vec2Array>t =newosg::Vec2Array;
t->push_back(osg::Vec2(0.0f,0.0f));
t->push_back(osg::Vec2(1.0f,0.0f));
t->push_back(osg::Vec2(1.0f,1.0f));
t->push_back(osg::Vec2(0.0f,1.0f));
geom->setTexCoordArray(0,t);//设置纹理数组
//设置点的颜色,可以BIND_ALL或BIND_PER_VERTEX
osg::ref_ptr<osg::Vec4Array>c =newosg::Vec4Array;
c->push_back(osg::Vec4(1.0f,1.0f,0.0f,1.0f));
geom->setColorArray(c.get());
geom->setColorBinding(osg::Geometry::BIND_OVERALL);
//设置各点法向量
osg::ref_ptr<osg::Vec3Array>n =newosg::Vec3Array;
n->push_back(osg::Vec3(0.0f,-1.0f,0.0f));
geom->setNormalArray(n.get());
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
//设置geom类型,此处为四边形,从第一个节点开始画到v的最后一个节点结束
geom->addPrimitiveSet(newosg::DrawArrays(osg::PrimitiveSet::QUADS,0,v->size()));//使
//创建一个几何节点对象
osg::ref_ptr<osg::Geode>geode =newosg::Geode;
//读取图片,设置纹理
osg::ref_ptr<osg::Texture2D>texture = newosg::Texture2D;
texture->setDataVariance(osg::Object::DYNAMIC);
osg::ref_ptr<osg::Image>image = osgDB::readImageFile("Tulips.jpg");
texture->setImage(image);
osg::ref_ptr<osg::TexEnv>texEnv = newosg::TexEnv;
texEnv->setMode(osg::TexEnv::DECAL);//设置贴纹理的类型
//设置几何节点对象的状态集,将纹理加入状态集中
osg::ref_ptr<osg::StateSet>stateSet = newosg::StateSet;
stateSet->setAttribute(texEnv.get());
stateSet->setAttributeAndModes(texture.get());
geode->setStateSet(stateSet);
//将几何对象加入几何节点对象中
geode->addDrawable(geom.get());
return geode.get();
}
osg::Node* createModel()
{
float length = 4.0;
float width = 3.0;
float height = 2.0;
osg::Vec3 v(0.0,0.0,0.0);
osg::Group* root = new osg::Group();//根节点
root->addChild(createRec(v,length,width,height));
return root;
}
int main(int,char**)
{
//osg一般的显示方法,从建立osg::Viewer对象开始
osgViewer::Viewer viewer;
//w s f三个键盘操作
viewer.addEventHandler(newosgViewer::WindowSizeHandler);
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
viewer.addEventHandler(newosgViewer::StatsHandler);
viewer.setSceneData(createModel());
viewer.realize();
return viewer.run();
}
贴纹理的类型有DECAL(光照效果无效,依据纹理颜色)、MODULATE(与当前光照系统相关)、BLEND(混合原来的颜色与纹理颜色)