1. 矩形的渲染与绘制

矩形的渲染与绘制:

代码如下:

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(混合原来的颜色与纹理颜色)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值