osg绘制立体几何

根据网友的代码,实现了,然后自己画出来立方体什么的,发现并不难。。。加入顶点坐标然后根据坐标数组进行绘制

一、openGL中,定义了10种图元:GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, GL_POLYGON

十种图元的作用比较简单,就不多介绍。

二、OSG中图元的设置是通过

bool addPrimitiveSet(PrimitiveSet* primitiveset);

所有图元类都继承于PrimitiveSet,不同的图元类可以以不同的方式解释顶点数组(不仅仅是OpenGL的那些方式)

四、osg::DrawArrays

五、osg::DrawElementsUInt

此类依赖两个东西解释顶点数组,第一个当然是顶点数组了,第二个是个索引数组。索引数组是什么呢?举个例子。

有如下两个三角形(ABC)(BCD),如果想以GL_TRIANGLES方式绘制,如果用DrawArrays,就要往顶点数组中插6个顶点ABCBCD,如果三角面巨多,有这么多重复顶点是不可接受的。而使用osg::DrawElementsUInt可以解决此问题。

DrawElementsUInt接受一个索引数组IndexArray,是对顶点数组的索引,如此顶点数组中就可以只放ABCD四个顶点,而索引数组为(123234)6个数字,这样存储代价就小了许多。

DrawElemetnsUInt(osg::PrimitiveSet::TRIANGLES, IndexArray->size(), &IndexArray->front())

#include <Windows.h>
#include <osgViewer/Viewer>
#include <osg/Group>
#include <osgDB/ReadFile>

int main(void)
{
osg::ref_ptrosgViewer::Viewer viewer = new osgViewer::Viewer;

osg::ref_ptr<osg::Group> sceneRoot = new osg::Group;

//创建几何体
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
osg::Vec4dArray* color = new osg::Vec4dArray;
color->push_back(osg::Vec4d(0.0, 0.0, 1.0, 1.0));
geometry->setColorArray(color);
osg::Vec3Array* vecArray = new osg::Vec3Array;
vecArray->push_back(osg::Vec3d(0.0,0.0,0.0));
vecArray->push_back(osg::Vec3d(4.0,0.0,0.0));
vecArray->push_back(osg::Vec3d(2.0, 4.0, 0.0));
vecArray->push_back(osg::Vec3d(2.0, 2.0, 4.0));
geometry->setVertexArray(vecArray);

osg::ref_ptr<osg::DrawElementsUInt> drawElemUInt = new osg::DrawElementsUInt(GL_TRIANGLE_FAN);
drawElemUInt->push_back(0);
drawElemUInt->push_back(1);
drawElemUInt->push_back(1);
drawElemUInt->push_back(2);
drawElemUInt->push_back(2);
drawElemUInt->push_back(0);

drawElemUInt->push_back(0);
drawElemUInt->push_back(1);
drawElemUInt->push_back(1);
drawElemUInt->push_back(3);
drawElemUInt->push_back(3);
drawElemUInt->push_back(0);

drawElemUInt->push_back(0);
drawElemUInt->push_back(2);
drawElemUInt->push_back(2);
drawElemUInt->push_back(3);
drawElemUInt->push_back(3);
drawElemUInt->push_back(0);


drawElemUInt->push_back(1);
drawElemUInt->push_back(3);
drawElemUInt->push_back(3);
drawElemUInt->push_back(2);
drawElemUInt->push_back(2);
drawElemUInt->push_back(1);

geometry->addPrimitiveSet(drawElemUInt);
osg::Geode* geode = new osg::Geode;
geode->addDrawable(geometry);

sceneRoot->addChild(geode);

viewer->setSceneData(sceneRoot);
viewer->realize();
return viewer->run();

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 OpenSceneGraph 中,可以使用 `osg::Geometry` 类来绘制曲线。 以下是一个简单的示例代码,用于绘制一条二次贝塞尔曲线: ``` osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; vertices->push_back(osg::Vec3(0, 0, 0)); // 起点 vertices->push_back(osg::Vec3(1, 2, 0)); // 控制点 vertices->push_back(osg::Vec3(2, 0, 0)); // 终点 osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; geom->setVertexArray(vertices); osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array; colors->push_back(osg::Vec4(1.0, 1.0, 1.0, 1.0)); // 曲线颜色 geom->setColorArray(colors); geom->setColorBinding(osg::Geometry::BIND_OVERALL); osg::ref_ptr<osg::DrawArrays> drawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, 100); geom->addPrimitiveSet(drawArrays); osg::ref_ptr<osg::Geode> geode = new osg::Geode; geode->addDrawable(geom); osgViewer::Viewer viewer; viewer.setSceneData(geode); viewer.realize(); viewer.run(); ``` 在这个示例中,我们首先创建了包含曲线顶点的 `osg::Vec3Array` 对象,然后将其设置为几何体的顶点数组。接着,我们创建了一个 `osg::Vec4Array` 对象来设置曲线的颜色,并将其绑定到几何体上。最后,我们创建了一个 `osg::DrawArrays` 对象来设置绘制方式,并将其添加到几何体的原语集合中。最后,我们将几何体添加到 `osg::Geode` 中,并将其设置为场景图的根节点。 你可以根据需要修改这个示例代码来绘制不同类型的曲线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值