osg入门系列7- 一个小房子
2014-09-19 06:12
288 查看
#include <iostream>
#include <osg/Texture2D>
#include <osg/Geometry>
#include <osg/Geode>
#include <osgDB/ReadFile>
#include <osgUtil/SmoothingVisitor>
#include <osgViewer/Viewer>
using namespace std;
osg::Drawable* createHouseWall()
{
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array();
vertices->push_back(osg::Vec3(0.0, 0.0, 4.0)); //0
vertices->push_back(osg::Vec3(0.0, 0.0, 0.0)); //1
vertices->push_back(osg::Vec3(6.0, 0.0, 4.0)); //2
vertices->push_back(osg::Vec3(6.0, 0.0, 0.0)); //3
vertices->push_back(osg::Vec3(6.0, 4.0, 4.0)); //4
vertices->push_back(osg::Vec3(6.0, 4.0, 0.0)); //5
vertices->push_back(osg::Vec3(0.0, 4.0, 4.0)); //6
vertices->push_back(osg::Vec3(0.0, 4.0, 0.0)); //7
vertices->push_back(osg::Vec3(0.0, 0.0, 4.0)); //8
vertices->push_back(osg::Vec3(0.0, 0.0, 0.0)); //9
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array(10);
(*normals)[0].set(-0.707, -0.707, 0.0);
(*normals)[1].set(-0.707, -0.707, 0.0);
(*normals)[2].set(0.707, -0.707, 0.0);
(*normals)[3].set(0.707, -0.707, 0.0);
(*normals)[4].set(0.707, 0.707, 0.0);
(*normals)[5].set(0.707, 0.707, 0.0);
(*normals)[6].set(-0.707, 0.707, 0.0);
(*normals)[7].set(-0.707, 0.707, 0.0);
(*normals)[8].set(-0.707, -0.707, 0.0);
(*normals)[9].set(-0.707, -0.707, 0.0);
osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array(10);
(*texcoords)[0].set(0.0, 1.0);
(*texcoords)[1].set(0.0, 0.0);
(*texcoords)[2].set(0.3, 1.0);
(*texcoords)[3].set(0.3, 0.0);
(*texcoords)[4].set(0.5, 1.0);
(*texcoords)[5].set(0.5, 0.0);
(*texcoords)[6].set(0.8, 1.0);
(*texcoords)[7].set(0.8, 0.0);
(*texcoords)[8].set(1.0, 1.0);
(*texcoords)[9].set(1.0, 0.0);
osg::ref_ptr<osg::Geometry> houseWall = new osg::Geometry;
houseWall->setVertexArray(vertices.get());
houseWall->setTexCoordArray(0, texcoords.get());
houseWall->setNormalArray(normals.get());
houseWall->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
houseWall->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::QUAD_STRIP, 0, 10));
houseWall->getOrCreateStateSet()->setTextureAttributeAndModes(0,
new osg::Texture2D(osgDB::readImageFile("wall.png")));
return houseWall.release();
}
osg::Drawable* createHouseRoof()
{
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-0.2, -0.5, 3.5));
vertices->push_back(osg::Vec3(6.2, -0.5, 3.5));
vertices->push_back(osg::Vec3(0.8, 2.0, 6.0));
vertices->push_back(osg::Vec3(5.2, 2.0, 6.0));
vertices->push_back(osg::Vec3(-0.2, 4.5, 3.5));
vertices->push_back(osg::Vec3(6.2, 4.5, 3.5));
osg::ref_ptr<osg::DrawArrays> roof =
new osg::DrawArrays(osg::DrawArrays::QUAD_STRIP, 0, 6);
osg::ref_ptr<osg::DrawElementsUInt> roofSide =
new osg::DrawElementsUInt(osg::DrawElementsUInt::TRIANGLES, 6);
(*roofSide)[0] = 0;
(*roofSide)[1] = 2;
(*roofSide)[2] = 4;
(*roofSide)[3] = 5;
(*roofSide)[4] = 3;
(*roofSide)[5] = 1;
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(0.25, 0.0, 0.0, 1.0));
osg::ref_ptr<osg::Geometry> houseRoof = new osg::Geometry;
houseRoof->setVertexArray(vertices.get());
houseRoof->setColorArray(colors.get());
houseRoof->setColorBinding(osg::Geometry::BIND_OVERALL);
houseRoof->addPrimitiveSet(roof.get());
houseRoof->addPrimitiveSet(roofSide.get());
osgUtil::SmoothingVisitor smv;
smv.smooth(*houseRoof);
return houseRoof.release();
}
int main()
{
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(createHouseWall());
geode->addDrawable(createHouseRoof());
osgViewer::Viewer viewer;
viewer.setSceneData(geode.get());
return viewer.run();
return 0;
}
----
TEMPLATE = app
CONFIG += console
CONFIG -= qt
SOURCES += main.cpp
LIBS += -L/usr/local/lib/
LIBS += -lOpenThreads
LIBS += -losg
LIBS += -losgDB
LIBS += -losgFX
LIBS += -losgGA
LIBS += -losgManipulator
LIBS += -losgParticle
LIBS += -losgShadow
LIBS += -losgSim
LIBS += -losgTerrain
LIBS += -losgText
LIBS += -losgUtil
LIBS += -losgViewer
---
#include <osg/Texture2D>
#include <osg/Geometry>
#include <osg/Geode>
#include <osgDB/ReadFile>
#include <osgUtil/SmoothingVisitor>
#include <osgViewer/Viewer>
using namespace std;
osg::Drawable* createHouseWall()
{
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array();
vertices->push_back(osg::Vec3(0.0, 0.0, 4.0)); //0
vertices->push_back(osg::Vec3(0.0, 0.0, 0.0)); //1
vertices->push_back(osg::Vec3(6.0, 0.0, 4.0)); //2
vertices->push_back(osg::Vec3(6.0, 0.0, 0.0)); //3
vertices->push_back(osg::Vec3(6.0, 4.0, 4.0)); //4
vertices->push_back(osg::Vec3(6.0, 4.0, 0.0)); //5
vertices->push_back(osg::Vec3(0.0, 4.0, 4.0)); //6
vertices->push_back(osg::Vec3(0.0, 4.0, 0.0)); //7
vertices->push_back(osg::Vec3(0.0, 0.0, 4.0)); //8
vertices->push_back(osg::Vec3(0.0, 0.0, 0.0)); //9
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array(10);
(*normals)[0].set(-0.707, -0.707, 0.0);
(*normals)[1].set(-0.707, -0.707, 0.0);
(*normals)[2].set(0.707, -0.707, 0.0);
(*normals)[3].set(0.707, -0.707, 0.0);
(*normals)[4].set(0.707, 0.707, 0.0);
(*normals)[5].set(0.707, 0.707, 0.0);
(*normals)[6].set(-0.707, 0.707, 0.0);
(*normals)[7].set(-0.707, 0.707, 0.0);
(*normals)[8].set(-0.707, -0.707, 0.0);
(*normals)[9].set(-0.707, -0.707, 0.0);
osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array(10);
(*texcoords)[0].set(0.0, 1.0);
(*texcoords)[1].set(0.0, 0.0);
(*texcoords)[2].set(0.3, 1.0);
(*texcoords)[3].set(0.3, 0.0);
(*texcoords)[4].set(0.5, 1.0);
(*texcoords)[5].set(0.5, 0.0);
(*texcoords)[6].set(0.8, 1.0);
(*texcoords)[7].set(0.8, 0.0);
(*texcoords)[8].set(1.0, 1.0);
(*texcoords)[9].set(1.0, 0.0);
osg::ref_ptr<osg::Geometry> houseWall = new osg::Geometry;
houseWall->setVertexArray(vertices.get());
houseWall->setTexCoordArray(0, texcoords.get());
houseWall->setNormalArray(normals.get());
houseWall->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
houseWall->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::QUAD_STRIP, 0, 10));
houseWall->getOrCreateStateSet()->setTextureAttributeAndModes(0,
new osg::Texture2D(osgDB::readImageFile("wall.png")));
return houseWall.release();
}
osg::Drawable* createHouseRoof()
{
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-0.2, -0.5, 3.5));
vertices->push_back(osg::Vec3(6.2, -0.5, 3.5));
vertices->push_back(osg::Vec3(0.8, 2.0, 6.0));
vertices->push_back(osg::Vec3(5.2, 2.0, 6.0));
vertices->push_back(osg::Vec3(-0.2, 4.5, 3.5));
vertices->push_back(osg::Vec3(6.2, 4.5, 3.5));
osg::ref_ptr<osg::DrawArrays> roof =
new osg::DrawArrays(osg::DrawArrays::QUAD_STRIP, 0, 6);
osg::ref_ptr<osg::DrawElementsUInt> roofSide =
new osg::DrawElementsUInt(osg::DrawElementsUInt::TRIANGLES, 6);
(*roofSide)[0] = 0;
(*roofSide)[1] = 2;
(*roofSide)[2] = 4;
(*roofSide)[3] = 5;
(*roofSide)[4] = 3;
(*roofSide)[5] = 1;
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(0.25, 0.0, 0.0, 1.0));
osg::ref_ptr<osg::Geometry> houseRoof = new osg::Geometry;
houseRoof->setVertexArray(vertices.get());
houseRoof->setColorArray(colors.get());
houseRoof->setColorBinding(osg::Geometry::BIND_OVERALL);
houseRoof->addPrimitiveSet(roof.get());
houseRoof->addPrimitiveSet(roofSide.get());
osgUtil::SmoothingVisitor smv;
smv.smooth(*houseRoof);
return houseRoof.release();
}
int main()
{
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(createHouseWall());
geode->addDrawable(createHouseRoof());
osgViewer::Viewer viewer;
viewer.setSceneData(geode.get());
return viewer.run();
return 0;
}
----
TEMPLATE = app
CONFIG += console
CONFIG -= qt
SOURCES += main.cpp
LIBS += -L/usr/local/lib/
LIBS += -lOpenThreads
LIBS += -losg
LIBS += -losgDB
LIBS += -losgFX
LIBS += -losgGA
LIBS += -losgManipulator
LIBS += -losgParticle
LIBS += -losgShadow
LIBS += -losgSim
LIBS += -losgTerrain
LIBS += -losgText
LIBS += -losgUtil
LIBS += -losgViewer
---
相关文章推荐
- osg入门系列8-一个地球
- osg入门系列9-一个正方形
- 准备写一个ASP.NET2.0入门的系列
- 控件开发之入门系列(1):建立一个简单控件
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
- PHP on Windows Azure 入门教学系列(2) ——利用SQL Azure做一个简单的访问计数器
- PHP on Windows Azure 入门教学系列(2) ——利用SQL Azure做一个简单的访问计数器
- [Eclipse]GEF入门系列(十、表格的一个实现)
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。 .
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
- API入门系列之五 -一个正儿八经的SDK程序
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
- API入门系列之四 -一个相当简单的SDK程序
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子
- [转]Ultra Fractal教程系列04——快速入门教程01——创建一个分形图像
- ruby on rails入门系列--一个简单的HelloWorld程序
- Windows Azure AppFabric 入门教学系列 (二):一个简单的Service Bus例子
- PHP on Windows Azure 入门教学系列(2) ——利用SQL Azure做一个简单的访问计数器
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。