osg::Shape类

继承自osg::Object类;

osg::Shape类是各种内嵌几何体的基类,不但可以用于剔除和碰撞检测,还可用于生成预定义的几何体对象;

常见的内嵌几何体包括:

osg::ShapeDrawable类:

派生自osg::Drawable类;

在osg::ShapeDrawable类的构造函数中提供了关联osg::Shape的方法;

同时,因为它继承自osg::Drawable类,所以它的实例需要被添加到叶节点中才能被实例绘制。

createTexturedQuadGeometry函数解析

API解释:

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,似乎是和二维贴图有关的,也就是取贴图上的那一部分。

根据这一点点说明,完全不够,各种尝试之后,各参数的功能大致如下。

先说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类进行简单图形的绘制,一般可以分为这样几个步骤:

1、    建立新的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; //法线索引数组

2、    向顶点坐标变量数组中输入顶点数据,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));

3、    设置顶点坐标,颜色和法线坐标的索引值。索引值可以使用整数类型的向量组列表来存放,用户使用索引表从顶点坐标的数组中获取指定位置的数据,从而按照指定顺序连接各个顶点,组成指定的图形。用户也可以选择不设置索引数组,此时OSG内部将按照缺省的索引顺序排列。例如上述的坐标和颜色信息,如果按照缺省的索引排列绘制一个四边形,那么得到的结果如左图;而如果使用索引值数组来重新获取和排列坐标或者颜色的数据的的话,那么可以获得与此不同的结果,例如:

colindex->push_back();
colindex->push_back();
colindex->push_back();
colindex->push_back();

注意,可以多次索引同一个坐标或者颜色数据,但是如果已经指定绘图中将要使用某个索引组,那么该向量组不能为空,否则会引发内存错误。

4、    向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 绑定逐个点 逐点绑定。比如上面的例子,将四个颜色数据分别绑定到四个顶点坐标,可以实现顶点颜色之间的过渡效果。

转载自:http://hi.baidu.com/wangr02/blog/item/78924216e871bd4b20a4e9db.html

[原创]OSG Discussion–2:Geometry类的基础绘图(2)

5、    向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 绘制任意多边形 根据用户提供的顶点的数量,绘制多边形。

OSG中的几何体的更多相关文章

  1. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  2. OSG中的示例程序简介(转)

    OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...

  3. OSG中的智能指针

    在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用 ...

  4. OSG中找到特定节点的方法

    OSG中找到特定节点的方法 转自:http://38288890.blog.163.com/blog/static/19612845320072721549504/ 为了在OSG中找到需要的节点并对节 ...

  5. osg中遇到的问题

    osg中遇到的问题 今天写程序的时候, 需要把键盘和鼠标消息转发出来, 就直接写了接口用signal丢出来了. 程序写的很多, 测试的时候却崩溃了.... 在场景中拖拽鼠标左键的时候, 会发现在扔出鼠 ...

  6. osg中的视点控制

    osg中的视点控制 osg的视点控制基类是CameraManipulator, 它是一个虚基类, 有用的方法都跟home有关. 在这个类里面有三个重要的成员变量: osg::Vec3d _homeEy ...

  7. OSG中的HUD

    OSG中的HUD 所谓HUD节点,说白了就是无论三维场景中的内容怎么改变,它都能在屏幕上固定位置显示的节点. 实现要点: 关闭光照,不受场景光照影响,所有内容以同一亮度显示 关闭深度测试 调整渲染顺序 ...

  8. osg中使用MatrixTransform来实现模型的平移/旋转/缩放

    osg中使用MatrixTransform来实现模型的平移/旋转/缩放 转自:http://www.cnblogs.com/kekec/archive/2011/08/15/2139893.html# ...

  9. OSG中找到特定节点的方法(转)

    OSG中找到特定节点的方法 为了在OSG中找到需要的节点并对节点做出相应的操作,可以从NodeVisitor类中继承一个类,NPS的教程 [download id="14"] 阐述 ...

随机推荐

  1. winow.open打开窗口被拦截的解决方法

    自己遇到的使用window.open打开新窗口被拦截的几种情况(使用的chrome浏览器,其他浏览器未测): 第一次:window.open("www.baidu.com"),打开 ...

  2. windows系统——mysql自动定时备份数据库的最佳方法

    网上有很多关于window下Mysql自动备份的方法,可是真的能用的也没有几个,有些说的还非常的复杂,难以操作. 我们都知道mssql本身就自带了计划任务可以用来自动备份,可是mysql咱们要怎么样自 ...

  3. fastjson的常用使用方法

    package Demo; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import ...

  4. Android之修改部分字体颜色

    #01# 方法一: TextView textView = (TextView) view.findViewById(R.id.text); SpannableString ss = new Span ...

  5. redhat系列yum本地源配置

    1.挂载光盘,本示例挂载在/mnt下. 2.清除系统带的.repo文件,rm -f /etc/yum.repos.d/* 3.编辑自己的repo文件,内容如下: [local_server]   (库 ...

  6. 常用在线工具及API网址总结

    1.小图标在线查找 https://www.iconfinder.com/ 2.在线做图,Flowchart流程图,BPMN图,Org组织结构图等 http://www.processon.com/ ...

  7. C语言单片和C#语言服务器端DES及3DES加密的实现

    原文:C语言单片和C#语言服务器端DES及3DES加密的实现 公司最近在做单片机和C#语言的通信.用的是Socket通信.传输的数据是明文,后来 在会上讨论准备用DES加密(对称加密)来做. 双方约定 ...

  8. android PopupWindow显示位置

    PopupWindow的显示及位置设置 window.showAtLocation(parent, Gravity.RIGHT | Gravity.BOTTOM, 10,10); 第一个参数指定Pop ...

  9. (译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0)

    (译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0) 更新:ios4.1现在已经将这个做到SDK了.你可以设置键盘类型为UIKeyboardTypeDecimal ...

  10. MYSQLinsert速度过慢

    MYSQLinsert速度过慢最近在用MySQL做存储,测试中发现插入数据太慢了,插入速度只有20 MY SQL insert 速度过慢最近在用MySQL做存储,测试中发现插入数据太慢了,插入速度只有 ...