03使用内嵌几何形状对象并改变渲染状态.doc

上传人:工**** 文档编号:547591450 上传时间:2023-05-29 格式:DOC 页数:7 大小:102KB
返回 下载 相关 举报
03使用内嵌几何形状对象并改变渲染状态.doc_第1页
第1页 / 共7页
03使用内嵌几何形状对象并改变渲染状态.doc_第2页
第2页 / 共7页
03使用内嵌几何形状对象并改变渲染状态.doc_第3页
第3页 / 共7页
03使用内嵌几何形状对象并改变渲染状态.doc_第4页
第4页 / 共7页
03使用内嵌几何形状对象并改变渲染状态.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《03使用内嵌几何形状对象并改变渲染状态.doc》由会员分享,可在线阅读,更多相关《03使用内嵌几何形状对象并改变渲染状态.doc(7页珍藏版)》请在金锄头文库上搜索。

1、使用osg基本几何图形,用transform节点定位物体并改变它们的状态用osg:Shape 建立一场景,用osg:StateSet控制图形渲染Shape类是所以图形类的基类。Shapes被用于精选和碰撞检测,或者定义几何形状来生成几何体。以下的类由Shape类继承而来:TriangleMeshSphereInfinitePlaneHeightFieldCylinderConeCompositeShape如果要渲染这些内嵌形体,我们需要首先将其与Drawable类的实例相关联。我们可以使用ShapeDrawable类来完成这一功能。它派生自Drawable类,并提供了关联Shape实例的方法。

2、正因为ShapeDrawable是继承自Drawable的,它的实例因而可以被添加到Geode实例中。#include #include #include #include #include #include #include #include #include #include #include #include #include #include osg:Geode* createPyramid() osg:Geode* pyramidGeode = new osg:Geode(); osg:Geometry* pyramidGeometry = new osg:Geometry(); p

3、yramidGeode-addDrawable(pyramidGeometry); / 指定金字塔的五个顶点 osg:Vec3Array* pyramidVertices = new osg:Vec3Array; pyramidVertices-push_back( osg:Vec3(0, 0, 0) ); / 左前 pyramidVertices-push_back( osg:Vec3(2, 0, 0) ); / 右前 pyramidVertices-push_back( osg:Vec3(2, 2, 0) ); / 右后 pyramidVertices-push_back( osg:Vec

4、3( 0,2, 0) ); / 右前 pyramidVertices-push_back( osg:Vec3( 1, 1,2) ); / 尖顶 pyramidGeometry-setVertexArray( pyramidVertices ); / 定义金字塔五个面的顶点索引,底面为四边形,侧面为三角形 / 顶点的排列按照逆时针的顺序 osg:DrawElementsUInt* pyramidBase = new osg:DrawElementsUInt(osg:PrimitiveSet:QUADS, 0); pyramidBase-push_back(3); pyramidBase-push

5、_back(2); pyramidBase-push_back(1); pyramidBase-push_back(0); /将顶点数组关联给几何体 pyramidGeometry-addPrimitiveSet(pyramidBase); /以下是金字塔的四个面(三角形),push_back后为索引数字 osg:DrawElementsUInt* pyramidFaceOne = new osg:DrawElementsUInt(osg:PrimitiveSet:TRIANGLES, 0); pyramidFaceOne-push_back(0); pyramidFaceOne-push_b

6、ack(1); pyramidFaceOne-push_back(4); pyramidGeometry-addPrimitiveSet(pyramidFaceOne); osg:DrawElementsUInt* pyramidFaceTwo = new osg:DrawElementsUInt(osg:PrimitiveSet:TRIANGLES, 0); pyramidFaceTwo-push_back(1); pyramidFaceTwo-push_back(2); pyramidFaceTwo-push_back(4); pyramidGeometry-addPrimitiveSet

7、(pyramidFaceTwo); osg:DrawElementsUInt* pyramidFaceThree = new osg:DrawElementsUInt(osg:PrimitiveSet:TRIANGLES, 0); pyramidFaceThree-push_back(2); pyramidFaceThree-push_back(3); pyramidFaceThree-push_back(4); pyramidGeometry-addPrimitiveSet(pyramidFaceThree); osg:DrawElementsUInt* pyramidFaceFour =

8、new osg:DrawElementsUInt(osg:PrimitiveSet:TRIANGLES, 0); pyramidFaceFour-push_back(3); pyramidFaceFour-push_back(0); pyramidFaceFour-push_back(4); pyramidGeometry-addPrimitiveSet(pyramidFaceFour); /建立颜色数组,存储四种颜色 osg:Vec4Array* colors = new osg:Vec4Array; colors-push_back(osg:Vec4(1.0f, 0.0f, 0.0f, 1

9、.0f) ); / 红色索引 colors-push_back(osg:Vec4(0.0f, 1.0f, 0.0f, 1.0f) ); / 绿色索引 colors-push_back(osg:Vec4(0.0f, 0.0f, 1.0f, 1.0f) ); / 蓝色索引 colors-push_back(osg:Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); / 白色索引 osg:TemplateIndexArray *colorIndexArray; colorIndexArray = new osg:TemplateIndexArray; colorIndexArray-pu

10、sh_back(0); / 顶点对应颜色元素 colorIndexArray-push_back(1); / 顶点对应颜色元素 colorIndexArray-push_back(2); / 顶点对应颜色元素 colorIndexArray-push_back(3); / 顶点对应颜色元素 colorIndexArray-push_back(0); / 顶点对应颜色元素 pyramidGeometry-setColorArray(colors); pyramidGeometry-setColorIndices(colorIndexArray); pyramidGeometry-setColor

11、Binding(osg:Geometry:BIND_PER_VERTEX);/*由于纹理坐标与顶点是一一对应的,因此不需要使用索引数组来进行映射。我们只需要直接使用setTexCoordArray方法即可. setTexCoordArray方法传递osg:Vec2的二维坐标数组作为参数,传递的二维坐标数与顶点数相同。数组中元素的位置与顶点数组中顶点的位置一一对应。*/ osg:Vec2Array* texcoords = new osg:Vec2Array(5); (*texcoords)0.set(0.00f,0.0f); / 顶点的纹理坐标 (*texcoords)1.set(0.25f,

12、0.0f); / 顶点的纹理坐标 (*texcoords)2.set(0.50f,0.0f); / 顶点的纹理坐标 (*texcoords)3.set(0.75f,0.0f); / 顶点的纹理坐标 (*texcoords)4.set(0.50f,1.0f); / 顶点的纹理坐标 pyramidGeometry-setTexCoordArray(0,texcoords); return pyramidGeode;int main() osgViewer:Viewer viewer; /创建场景的根节点 osg:Group* root = new osg:Group();/*声明Box类(派生自S

13、hape)的实例。构造函数的参数为:osg:Vec3的中心位置,以浮点数定义统一的高/宽/深度。也可以分别输入不同的高度、宽度、深度值.*/ osg:Box* unitCube = new osg:Box( osg:Vec3(0,0,0), 1.0f);/*声明ShapeDrawable类的实例,使用刚才创建的unitCube作为传递参数。这个类派生自Drawable类,因此可以直接添加到Geode实例中*/ osg:ShapeDrawable* unitCubeDrawable = new osg:ShapeDrawable(unitCube); / 声明Geode类的实例(立方体) osg:Geode* basicShapesGeode = new osg:Geode(); / 将Geode节点添加到场景中 root-addChild(basicShapesGeode); / 将单位立方体添加到Geode中 basicShapesGeode-addDrawable(unitCubeDrawable);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号