osg::Shape类html
继承自osg::Object类;数组
osg::Shape类是各类内嵌几何体的基类,不但能够用于剔除和碰撞检测,还可用于生成预约义的几何体对象;函数
osg::ShapeDrawable类:工具
派生自osg::Drawable类;post
在osg::ShapeDrawable类的构造函数中提供了关联osg::Shape的方法spa
同时,由于它继承自osg::Drawable类,因此它的实例须要被添加到叶节点中才能被实例绘制。code
createTexturedQuadGeometry函数解析
API解释:orm
OSG_EXPORT Geometry* osg::createTexturedQuadGeometry(const Vec3 & corner,const Vec3 & widthVec,const Vec3 & heightVec,float l,float b,float r,float t )
Convenience function to be used for creating quad geometry with texture coords.
Tex coords go from left bottom (l,b) to right top (r,t).
看起来,corner变量是起点,从这个起点按照widthVec和heightVec来画出一个QUAD矩形,至于后面的l,b,r,t,彷佛是和二维贴图有关的,也就是取贴图上的那一部分。htm
根据这一点点说明,彻底不够,各类尝试以后,各参数的功能大体以下。对象
先说l,b,r,t,l,b通常都取0.0,r,t若是不相等,那么二维的贴图会变成长方形。也就是说,个人黑白棋盘格,会变成黑白长方格。相等的话,就会变成黑白正方格。
再说corner,这是从左下角起始的点,是这个起始点的世界坐标。
好比说,我想让生成的正方形地面,面朝上,而且位于世界中心,那么corner,widthVec,heightVec应该这样设置。
corner(-50.0, -50.0, -3.0) widthVec(0.0, 100.0, -3.0) heightVec(100.0, 0.0, 0.0)
也就是说,起点在摄像机的左后方,-3.0是使其略微下沉的意思。而后沿Y方向划出去100,再向X方向画100。注意,-3.0在widht和height二者之一进行指定就好了,若是两个向量的Z值都是-3.0,画出来的平面是斜的。
OSG--Geometry
在OpenSceneGraph的建模和绘图工具中,osg::Geometry类有着十分重要的地位。使用Geometry类,用户能够经过指定顶点,颜色和法线的方式,绘制简单的线段,三角形,多边形。并将绘图的结果添加到场景的叶结点Geode中。
使用Gemetry类进行简单图形的绘制,通常能够分为这样几个步骤:
一、 创建新的Geometry实例,用于输入顶点,颜色等数据的osg::Vec3Array,osg::Vec4Array变量数组,以及用于创建点索引的osg::UByteArray,osg:: IntArray等。示例代码以下:
osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
osg::Vec3Array* vecarray = new osg::Vec3Array; //顶点坐标数组
osg::UByteArray* vecindex = new osg::UByteArray; //顶点索引数组
osg::Vec4Array* colarray = new osg::Vec4Array; //颜色RGB值数组
osg::UByteArray* colindex = new osg::UByteArray; //颜色索引数组
osg::Vec3Array* norarray = new osg::Vec3Array; //法线坐标数组
osg::UByteArray* norindex = new osg::UByteArray; //法线索引数组
二、 向顶点坐标变量数组中输入顶点数据,osg::Vec3Array是一个模板类,继承自STL的vector,所以可使用push_back方法送入osg::Vec3的坐标数据。颜色数据,法线坐标数据的保存与此相似,不过通常来讲颜色数据使用osg::Vec4Array加以保存,除了RGB值以外,还包括一个Alpha份量。示例代码以下:
vecarray->push_back(osg::Vec3(1.0, 0.0, 1.0));
vecarray->push_back(osg::Vec3(-1.0, 0.0, 1.0));
vecarray->push_back(osg::Vec3(-1.0, 0.0, -1.0));
vecarray->push_back(osg::Vec3(1.0, 0.0, -1.0));
colarray->push_back(osg::Vec4(1.0, 0.0, 0.0, 1.0)); //Red
colarray->push_back(osg::Vec4(0.0, 1.0, 0.0, 1.0)); //Green
colarray->push_back(osg::Vec4(0.0, 0.0, 1.0, 1.0)); //Blue
colarray->push_back(osg::Vec4(1.0, 1.0, 1.0, 1.0)); //White
norarray->push_back(osg::Vec3(0.0, -1.0, 0.0));
三、 设置顶点坐标,颜色和法线坐标的索引值。索引值可使用整数类型的向量组列表来存放,用户使用索引表从顶点坐标的数组中获取指定位置的数据,从而按照指定顺序链接各个顶点,组成指定的图形。用户也能够选择不设置索引数组,此时OSG内部将按照缺省的索引顺序排列。例如上述的坐标和颜色信息,若是按照缺省的索引排列绘制一个四边形,那么获得的结果如左图;而若是使用索引值数组来从新获取和排列坐标或者颜色的数据的的话,那么能够得到与此不一样的结果,例如:
colindex->push_back(3);
colindex->push_back(2);
colindex->push_back(1);
colindex->push_back(0);
注意,能够屡次索引同一个坐标或者颜色数据,可是若是已经指定绘图中将要使用某个索引组,那么该向量组不能为空,不然会引起内存错误。
四、 向Geometry类设置数据。
geo->setVertexArray(vecarray);
geo->setVertexIndices(vecindex);
geo->setColorArray(colarray);
geo->setColorIndices(colindex);
geo->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
geo->setNormalArray(norarray);
geo->setNormalIndices(norindex);
geo->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);
若是要使用缺省的索引顺序,那么便没必要设置顶点、颜色或者法线的索引列表,即,屏蔽setVertexIndices,setColorIndices和setNormalIndices三段。
要注意的是,上一段程序中还设置了颜色数据,法线数据与顶点数据绑定的方式,即setColorBinding和setNormalBinding,绑定数据的方式有如下几种:
BIND_OFF |
取消绑定 |
此时,颜色数据或者法线数据与顶点数据彻底没有关系,顶点数据的颜色和法线方向彻底由缺省值决定。 |
BIND_OVERALL |
绑定所有几何体 |
此时,颜色数组或者法线坐标数组中只须要保存一个数据,该数据将影响此Geometry类的全部顶点坐标。例如,将红色绑定到所有几何体上,则这个类绘制出的全部物体均是红色的。 |
BIND_PER_PRIMITIVE |
绑定逐个几何体 |
此时,颜色数组或者法线坐标数组中保存的数据数量应当与用户将要绘制的几何体数量相同。例如,用户依据8个顶点来绘制两个四边形时,能够分别为它们设置两个法线坐标,并使用此参数进行绑定。 |
BIND_PER_VERTEX |
绑定逐个点 |
逐点绑定。好比上面的例子,将四个颜色数据分别绑定到四个顶点坐标,能够实现顶点颜色之间的过渡效果。 |
转自:https://www.cnblogs.com/xiaocainiao2hao/p/5619905.html
[原创]OSG Discussion–2:Geometry类的基础绘图(2)
五、 向Geometry类添加几何体,并使用Geode类的addDrawable方法将Geometry类加入场景图形的某个叶节点。 geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); 该行代码中,使用DrawArrays类向Geometry类送入了新几何体的信息,即,该几何体是一个QUADS,它的顶点坐标从索引数组中读入,从第1个索引值开始,共读入4个索引值,组成一个四边形图形。 几何体的形状参数除了QUADS以外,还有数种方式,以用于不一样的用户需求,列表以下:
POINTS |
绘制点 |
绘制用户指定的全部顶点。 |
LINES |
绘制直线 |
直线的起点、终点由数组中前后相邻的两个点决定;用户提供的点不止两个时,将尝试继续绘制新的直线。 |
LINE_STRIP |
绘制多段直线 |
多段直线的第一段由数组中的前两个点决定;其他段的起点位置为上一段的终点坐标,而终点位置由数组中随后的点决定。 |
LINE_LOOP |
绘制封闭直线 |
绘图方式与多段直线相同,可是最后将自动封闭该直线。 |
TRIANGLES |
绘制三角形 |
三角形的三个顶点由数组中相邻的三个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止三个时,将尝试继续绘制新的三角形。 |
TRIANGLE_STRIP |
绘制多段三角形 |
第一段三角形的由数组中的前三个点决定;其他段三角形的绘制,起始边由上一段三角形的后两个点决定,第三点由数组中随后的一点决定。 |
TRIANGLE_FAN |
绘制三角扇面 |
第一段三角形的由数组中的前三个点决定;其他段三角形的绘制,起始边由整个数组的第一点和上一段三角形的最后一个点决定,第三点由数组中随后的一点决定。 |
QUADS |
绘制四边形 |
四边形的四个顶点由数组中相邻的四个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止四个时,将尝试继续绘制新的四边形。 |
QUAD_STRIP |
绘制多段四边形 |
第一段四边形的起始边由数组中的前两个点决定,边的矢量方向由这两点的延伸方向决定;起始边的对边由其后的两个点决定,若是起始边和对边的矢量方向不一样,那么四边形将会扭曲;其他段四边形的绘制,起始边由上一段决定,其对边由随后的两点及其延伸方向决定。 |
POLYGON |
绘制任意多边形 |
根据用户提供的顶点的数量,绘制多边形。 |
|
转自:https://www.cnblogs.com/xiaocainiao2hao/p/5619905.html