-
创建几何体
程序所用类的介绍
Geode
类
Geode
类派生自
Node
节点类。
节点类
(包
括
Geode
)
可以作为场景图形的叶
节点添加。
Geode
类的实例可以与任意多个可绘制对象<
/p>
Drawable
类相关联。
Drawable
类
作为可绘制对象基类的
Drawab
le
类是一个纯虚类,
它有六个派生类。
其中
Geometry
类中可
p>
以直接指定顶点数据,或者指定任意数目的几何基元
Primiti
veSet
类与其关联。
顶点和顶点属性数据(颜色,法线,纹理坐标)是保存在数组中的。多个顶点可以共享同一
种颜色,
法线和纹理坐标,
同时我们还可以使
用索引将顶点数组映射给颜色,
法线或纹理坐
标的数组。
PrimitiveSet
类
这个类松散地封装了
OpenGL<
/p>
的绘图基元,包括点(
POINTS
)<
/p>
,线(
LINES
)
,多段线
(
LINE_STRI
P
)
,封闭线(
LINE_LOOP<
/p>
)
,四边形(
QUADS
)
,多边形(
POL
YGON
)等。
#include
#include
#include
#include
#include
#include
#include
int
main()
{
osgViewer::Viewer viewer;
osg::Group*
root =
new
osg::Group();
osg::Geode* pyramidGeode =
new
osg::Geode();
osg::Geometry* pyramidGeometry =
new
osg::Geometry();
osg::Geode* crossGeode =
new
osg::Geode();
osg::Geometry* crossGeometry =
new
osg::Geometry();
p>
//
将金字塔几何体
(pyramidGe
ometry)
与金字塔节点(
pyramidGeode
)关联
//
将
G
eode
叶节点(
pyramidGeode
)添加到场景图形的根节点
pyramidGeode->a
ddDrawable(pyramidGeometry);
root->addChild(pyramidGeode);
crossGeode->addDrawable(crossGeometry);
root->addChild(crossGeode);
/*
声明一个顶点数组。每个顶点有三个坐标值,也就是一个<
/p>
Vec3
类的实例。
osg::Vec3
Array
类的实例可以用来保存顶点数组。它派生自
STL
库的
vector
模板,因此我们可以
使用
push_back
方法向其中
追加数组元素。该方法的作用是在向量数组的末尾添加一个元素,因此
数组中第一个元素的索引值为
0
,紧随其后的第二个元
素为
1
,以此类推。
我们使用
Z
轴向上的右手坐标系作为参照,数组元素<
/p>
0-4
用于表达金字塔形体的五个顶点。
*/
osg::Vec3Array*
pyramidVertices =
new
osg::Vec3Array;
pyramidVertices->push_back(
osg::Vec3(
0
,
0
,
0
)
);
// front left
pyramidVertices->push_back(
osg::Vec3(
10
,
0
,
0
)
);
// front right
pyramidVertices->push_back( osg::Vec3(<
/p>
10
,
10
,
0
) );
// back
right
pyramidVertices->push_back(
osg::Vec3(
0
,
10
,
0
) );
// back
left
pyramidVertices->push_back(
osg::Vec3(
5
,
5
,
10
)
);
// peak
/*
交叉十字坐标
*/
float
clen;
clen =
12.0
;
osg::Vec3Array*
crossVertices =
new
osg::Vec3Array;
crossVertices->push_back
(osg::Vec3(-clen,
0.0
,
0.0
));
crossVertices->push_back (osg::Vec3(
clen,
0.0
,
0.0
));
crossVertices->push_back (osg::Vec3(
0.0
,
0.0
, -clen));
crossVertices->push_back (osg::Vec3(
0.0
,
0.0
,
clen));
//
将这顶点集合关联到
Geometry
实例上
pyramidGeometry->setVertexArray(
pyramidVertices );
crossGeometry->setVertexArray
(crossVertices);
/*
创建几何基元类
p>
PrimitiveSet
的实例并添加到金字塔几何体上。金字塔
底部的四个点
组成一个基面,可以使用
DrawElementsUint
类来实现。这个类同样继承自
STL
库的
vector
模板,
可以使用
push_back
顺序向其中添加元素。为了保证背
面剔除(
backface
cullling
)
的正确,需要按
照逆时针的顺序添加顶点数据。类的构造函数使用几何基元枚举类型(与
OpenGL
的几何基元枚举类型相同)作为输入参数,另一个输入参数是作
为起始点的顶点索引
值。
*/
/*
四棱锥的底面
*/
osg::DrawElementsUInt* pyramidBase =
new
osg::DrawElementsUInt(osg::PrimitiveSet::QUADS,
0
);
pyramidBase->push_back(
3
);
pyramidBase->push_back(
2
);
pyramidBase->push_back(
1
);
pyramidBase->push_back(
0
);
pyramidGeometry->addPrimiti
veSet(pyramidBase);
/*
交叉十字坐标的线
*/
osg::DrawElementsUInt* cross =
new
osg::DrawElementsUInt(osg::PrimitiveSet::LINES,
0
);
cross->push_back(
3
);
cross->push_back(
2
);
cross->push_back(
1
);
cross->push_back(
0
);
crossGeometry->addPrimitiveSet(cross);
//
重复
这一过程,添加金字塔的每个面
.
注意,顶点是以逆时针为顺序添加的。
/*
四棱锥的四个侧面
*/
osg::DrawElementsUInt* pyramidFaceOne =
new
osg::DrawElementsUInt(os
g::PrimitiveSet::TRIANGLES,
0
);
pyramidFaceOne->push_back(<
/p>
0
);
pyramidFaceOne->push_back(<
/p>
1
);
pyramidFaceOne->push_back(<
/p>
4
);
pyramidGeometry->addPrimiti
veSet(pyramidFaceOne);
osg::DrawElementsUInt* pyramidFaceTwo =
new
osg::DrawElementsUInt(os
g::PrimitiveSet::TRIANGLES,
0
);
pyramidFaceTwo->push_back(<
/p>
1
);
pyramidFaceTwo->push_back(<
/p>
2
);
pyramidFaceTwo->push_back(<
/p>
4
);
pyramidGeometry->addPrimiti
veSet(pyramidFaceTwo);
osg::DrawElementsUInt* pyramidFaceThree
=
new
osg::DrawElementsUInt(os
g::PrimitiveSet::TRIANGLES,
0
);
pyramidFaceThree->push_back
(
2
);
pyramidFaceThree->push_back
(
3
);
pyramidFaceThree->push_back
(
4
);
pyramidGeometry->addPrimiti
veSet(pyramidFaceThree);
osg::DrawElementsUInt* pyramidFaceFour
=
new
osg::DrawElementsUInt(os
g::PrimitiveSet::TRIANGLES,
0
);
pyramidFaceFour->push_back(
3
);
pyramidFaceFour->push_back(
0
);
pyramidFaceFour->push_back(
4
);
pyramidGeometry->addPrimiti
veSet(pyramidFaceFour);