1. 点
用一个球代替
osg::ShapeDrawable* sd = new osg::ShapeDrawable(new osg::Sphere( root->getBound().center(), 2));
osg::Geode* lightNode = new osg::Geode;
lightNode->addDrawable(sd);
lightNode->getOrCreateStateSet()->setTextureAttributeAndModes(0, new osg::Texture2D(osgDB::readImageFile("Images/land_shallow_topo_2048.jpg")));
root->addChild(lightNode);
纹理的使用如下:
我们使用StateSet类来控制几何基元的渲染状态。下面的代码演示了从文件中读取纹理,创建StateSet类并设置纹理,以及关联StateSet到场景节点的方法。代码的前一部分与上一章教程相同。首先我们初始化视窗并创建只有单一金字塔的场景。
int main()
{
// 声明场景的根节点
osg::Group* root = new osg::Group();
osg::Geode* pyramidGeode = createPyramid();
root->addChild(pyramidGeode);
现在我们添加纹理。我们定义一个纹理实例并设置其数据变更类型为“DYNAMIC”(否则的话,OSG的优化过程中可能会自动去除这个纹理)。纹理类封装了OpenGL纹理模式(GL_TEXTURE_WRAP,GL_TEXTURE_FILTER等),以及一个osg::Image对象。下面的代码将演示如何从文件读入osg::Image实例并将其关联到纹理。
osg::Texture2D* KLN89FaceTexture = new osg::Texture2D;
//避免在优化过程中出错
KLN89FaceTexture->setDataVariance(osg::Object::DYNAMIC);
// 从文件读取图片
osg::Image* klnFace = osgDB::readImageFile("KLN89FaceB.tga");
if (!klnFace)
{
std::cout << " couldn't find texture, quiting." << std::endl;
return -1;
}
// 将图片关联到纹理
KLN89FaceTexture->setImage(klnFace);
Texture类可以关联到渲染状态StateSet类。下一步我们将创建一个StateSet,将纹理关联到这个渲染状态实例并允许使用纹理,最后将StateSet关联到几何体节点上。
// 创建StateSet
osg::StateSet* stateOne = new osg::StateSet();
// 将纹理关联给StateSet的纹理单元0
stateOne->setTextureAttributeAndModes
(0,KLN89FaceTexture,osg::StateAttribute::ON);
// 将渲染状态关联给金字塔节点
pyramidGeode->setStateSet(stateOne);
osgViewer::Viewer viewer;
//最后我们进入仿真循环:
viewer.setSceneData( root );
return viewer.run();
}
2. 直线
画坐标轴:
osg::ref_ptr<osg::Geode> makeCoordinate()
{
//创建保存几何信息的对象
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
//创建四个顶点
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();
v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(1000.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(0.0f, 1000.0f, 0.0f));
v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
v->push_back(osg::Vec3(0.0f, 0.0f, 1000.0f));
geom->setVertexArray(v.get());
//为每个顶点指定一种颜色
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array();
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); //坐标原点为红色
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); //x red
c->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f)); //坐标原点为绿色
c->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f)); //y green
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //坐标原点为蓝色
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //z blue
//如果没指定颜色则会变为黑色
geom->setColorArray(c.get());
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
//三个轴
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 2)); //X
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 2, 2)); //Y
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 4, 2)); //Z
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->getOrCreateStateSet()->setMode(GL_LIGHTING,
osg::StateAttribute::OFF);
geode->addDrawable(geom.get());
return geode;
}
3. 面
4. 其他
//创建精细度对象,精细度越高,细分就越多
osg::ref_ptr<osg::TessellationHints> hints = new osg::TessellationHints;
//设置精细度为0.5f
hints->setDetailRatio(0.5f);
以下是转的
一,使用自己建立的几何形状
1,建立叶节点(Geode)
2建立几何体对象(Geometry)
3.顶点,颜色,法线并关联到Geometry
4.设置addPrimitiveSet也就是如何画这些点(想要的图形)
5.在叶节点中addDrawable(Geometry)
//几何体对象
osg::ref_ptr <osg::Geometry> geom( new osg::Geometry);
// Create an array of four vertices.
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
//顶点是三维陈列,顺序是逆时针方向
geom->setVertexArray( v.get() );
v->push_back( osg::Vec3( -1.f, 0.f, -1.f ) );//左下
v->push_back( osg::Vec3( 1.f, 0.f, -1.f ) );//右下
v->push_back( osg::Vec3( 1.f, 0.f, 1.f ) );//右上
v->push_back( osg::Vec3( -1.f, 0.f, 1.f ) );//左上
// Create an array of four colors.
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
geom->setColorArray( c.get() );
//颜色关联方式
//BIND_OFF
//BIND_OVERALL
//BIND_PER_PRIMITIVE_SET
//BIND_PER_PRIMITIVE
//BIND_PER_VERTEX
geom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
/*
颜色的格式是(红,绿,蓝,Alpha)
Alpha 是出现在 32 位位图文件中的一类数据,用于向图像中的像素指定透明度。
24 位真彩文件包含三种颜色信息通道:红、绿和蓝或 RGB。每个通道在各个像素上都拥有具体的强度或值。每个通道的强度决定图像中像素的颜色。通过添加第四种 alpha 通道,文件可以指定每个像素的透明度或不透明度。alpha 的值为 0 表示透明,alpha 的值为 255 则表示不透明,在此范围之间的值表示半透明。
*/
c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 1.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );
c->push_back( osg::Vec4( 1.f, 1.f, 1.f, 1.f ) );
// Create an array for the single normal.
osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
geom->setNormalArray( n.get() );
geom->setNormalBinding( osg::Geometry::BIND_OVERALL );
//osg的坐标系为X向右,Y向里,Z向上
n->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );
// Draw a four-vertex quad from the stored data.
//bool osg::Geometry::addPrimitiveSet ( PrimitiveSet * primitiveset )
//PrimitiveSet (Type primType=PrimitiveType, GLenum mode=0)
enum Type {
PrimitiveType, DrawArraysPrimitiveType, DrawArrayLengthsPrimitiveType, DrawElementsUBytePrimitiveType,
DrawElementsUShortPrimitiveType, DrawElementsUIntPrimitiveType
}
enum mode{
POINTS //点
LINES //两点两点一组
LINE_STRIP //逐个点相联,不闭合
LINE_LOOP //首尾闭合
TRIANGLES //3个点一组,
TRIANGLE_STRIP //每三个点一画,不闭合4个点画两个三角形
TRIANGLE_FAN //同一平面上的图形闭合,不同平面上的只画一个?
QUADS
QUAD_STRIP
POLYGON //全包在一起
}
//DrawArrays (GLenum mode, GLint first, GLsizei count)
画的模式,所用点的数量
geom->addPrimitiveSet(
new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 4 ) );
如果想要画一个四边形的框,
geom->addPrimitiveSet(
new osg::DrawArrays( osg::PrimitiveSet::LINES, 0, 2 ) );
new osg::DrawArrays( osg::PrimitiveSet::LINES, 1, 2 ) );
new osg::DrawArrays( osg::PrimitiveSet::LINES, 2, 2 ) );
//下面的命令会有错误,因为一共有4个点,但是现在要联接0和3, GL不支持的循环,
需要加上第5个点,也就是起始点。
new osg::DrawArrays( osg::PrimitiveSet::LINES, 3, 2 ) );
// Add the Geometry (Drawable) to a Geode and
// return the Geode.返回叶节点
osg::ref_ptr geode = new osg::Geode;
geode->addDrawable( geom.get() );
return geode.get();
二. 使用osg中定义的一些图形
osg::ShapeDrawable* shape = new osg::ShapeDrawable(new osg::Capsule(osg::Vec3(0.f,0.f,0.f),radius, height), hints);
geode->addDrawable(shape);
ShapeDrawable (Shape *shape, TessellationHints *hints=0)
osg::Shape 包括的图形有:box, sphere, capsule, cylinder......
Box () | |
Box (const osg::Vec3 ¢er, float width) | |
Box (const osg::Vec3 ¢er, float lengthX, float lengthY, float lengthZ) | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|