《场景的组织结构》由会员分享,可在线阅读,更多相关《场景的组织结构(23页珍藏版)》请在金锄头文库上搜索。
1、4.1节点的定义与种类1 1场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提升渲染的效率。下图描述了一个场景图形,其中包含了地形,奶牛和卡车的模型。1.场景图的空间数据组织形式2 22.节点类型OSG包括了多种类型的节点,以执行各种各样的用户功能。面向对象的场景图形使用继承的机制来提供节点的这种多样性,所有的节点类都有一个共有的基类Node。3 32.节点类型(1)osg:Node类是所有节点的基类,包含了一个是所有节点的基类,包含了一个BoundingSphereBoundingSphere类描述其类描述其包围球。相关函数:包围球。相关函数:/提示更新包围体提示更新包围体
2、void dirtyBound();void dirtyBound();/重新计算并获取包围体重新计算并获取包围体const BoundingSphere& getBound()const;const BoundingSphere& getBound()const;/维护了一个父节点列表维护了一个父节点列表ParentList,ParentList,获取父节点列表获取父节点列表const ParentList getParents()const;const ParentList getParents()const;/获取指定的父节点获取指定的父节点const Group* getParent(
3、unsigned int i)const;const Group* getParent(unsigned int i)const;4 4/为当前节点添加一个父节点void addParent(Group* node);/删除当前节点的某个父节点void removeParent(Group* node);还有一些成员函数在后续进行介绍,比如处理回调函数、访问器等的相关成员函数。5 5(2 2)osg:Geodeosg:Geode类类叶节点,树结构的最底部,各个叶节点包含了构成叶节点,树结构的最底部,各个叶节点包含了构成场景中物体的实际几何信息。有一个或多个场景中物体的实际几何信息。有一个或多个
4、DrawableDrawable对对象。所有相关的可绘制体必须与象。所有相关的可绘制体必须与GeodeGeode节点关联。节点关联。/向叶节点添加一个可绘制体向叶节点添加一个可绘制体bool addDrawable(Drawable*);bool addDrawable(Drawable*);/移除一个给定的可绘制体移除一个给定的可绘制体bool removeDrawable(Drawable*);bool removeDrawable(Drawable*);/获取可绘制体的数目获取可绘制体的数目unsigned int getNumDrawables()const;unsigned int
5、getNumDrawables()const;6 6代码举例:向叶节点添加两个代码举例:向叶节点添加两个DrawableDrawableosg:ref_ptr geode=new osg:ref_ptr geode=new osg:Geode;osg:Geode;geode-addDrawable(drawable1);geode-addDrawable(drawable1);geode-addDrawable(drawable2);geode-addDrawable(drawable2);*Billboard*Billboard节点是一种特殊的叶节点,有三节点是一种特殊的叶节点,有三种形式的
6、广告板:种形式的广告板:面向视点面向视点(POINT_ROT_EYE):(POINT_ROT_EYE):相对眼睛旋转相对眼睛旋转相对世界一点旋转相对世界一点旋转(POINT_ROT_WORLD)(POINT_ROT_WORLD)轴向布告板轴向布告板(AXIAL_ROT)(AXIAL_ROT)7 7(3 3)osg:Grouposg:Group类类组节点(组节点(group nodegroup node):场景树的枝节节点):场景树的枝节节点或中间节点,包含了几何信息和控制其外观或中间节点,包含了几何信息和控制其外观的渲染状态信息。的渲染状态信息。/添加一个子节点添加一个子节点bool addC
7、hild(Node* node);bool addChild(Node* node);/移除一个子节点移除一个子节点bool removeChild(Node* node);bool removeChild(Node* node);/获取子节点的数目获取子节点的数目unsigned int getNumChildren()constunsigned int getNumChildren()const8 8osgosg提供了非常丰富的提供了非常丰富的GroupGroup节点,实现某些特定节点,实现某些特定功能,下面分别介绍:功能,下面分别介绍:(3.1)(3.1)空间变换节点空间变换节点osg:
8、Transformosg:Transform通过改变自身在三维空间的位置和姿态,进而影响通过改变自身在三维空间的位置和姿态,进而影响其子节点的空间位置变化。为了正确使用该节点,其子节点的空间位置变化。为了正确使用该节点,需要用到需要用到绝对参考系绝对参考系(absolute reference frame):(absolute reference frame):只是作用于绝对坐标系。只是作用于绝对坐标系。相对参考系相对参考系(relative reference frame)(relative reference frame):只是作用于给定对象的局部坐标系。只是作用于给定对象的局部坐标系。/
9、设置节点的参考坐标系设置节点的参考坐标系void setReferenceFrame(ReferenceFrame rf)void setReferenceFrame(ReferenceFrame rf)9 9osg:MatrixTransform类:直接设置空间变换矩阵/设置空间变换矩阵void setMatrix(const Matrix& mat);/获取空间变换矩阵const Matrix& getMatrix()const;1010osg:MatrixModel-view transformations can be done with osg:Matrix, so osg:Matr
10、ix is a very kind of important data type.osg:Matrix is 4*4.n nmakeTranslate(),makeRotate(),makeScale() reset the current matrix and create a 4*4 translation, rotation, and scale matrix. n nStatic method can create a new matrix:translate(), rotate(),scale().1111osg:Matrixosg:Matrix mat1=osg:Matrix:sc
11、ale(sx,sy,sz);osg:Matrix mat2=osg:Matrix:translate(tx,ty,tz);osg:Matrix resultMat=mat1*mat2;1212osg:MatrixTransformosg:MatrixTransform is also a node in scene. It can manipulate the position and attitude of a model by internally applied 4*4 matrix.two member functions:void setMatrix();osg:Matrix get
12、Matrix();1313osg:PositionAttitudeTransform类:直接设置平移、旋转和缩放值,比较直观。/设置和获取平移的距离void setPosition(const Vec3&);const Vec3& getPosition()const;/设置和获取旋转的四元数void setAttitude(const Quat& quat);const Quat& getAttitude()const; 1414osg:PositoinAttitudein the development practice, osg:MatrixTransform is not easy t
13、o use. So we have osg:PositionAttitude. this class provides several public member funcitons:void setPosition();void setScale();void setAttitude();the first two require osg:Vec3 as input value.1515osg:PositoinAttitudesetAttitude() uses osg:Quat variable as the parameter.setAttitude() uses osg:Quat va
14、riable as the parameter.osg:Quat is a quaternion, which is used to represent an osg:Quat is a quaternion, which is used to represent an orientation. we can define a quaternion instance as orientation. we can define a quaternion instance as follow:follow:osg:Quat quat(xAngle,osg:X_AXIS,osg:Quat quat(
15、xAngle,osg:X_AXIS, yAngle,osg:Y_AXIS, yAngle,osg:Y_AXIS, zAngle,osg:z_AXIS); zAngle,osg:z_AXIS);/ / 创建一个四元数,实现围绕创建一个四元数,实现围绕axis axis 旋转旋转theta theta 弧度。弧度。 Float theta( M_PI * .5f );Float theta( M_PI * .5f ); osg:Vec3 axis( .707f, .707f, 0.f ); osg:Vec3 axis( .707f, .707f, 0.f ); osg:Quat q0( theta
16、, axis ); osg:Quat q0( theta, axis );1616/获取节点的参考坐标系获取节点的参考坐标系ReferenceFrame getReferenceFrame()const;ReferenceFrame getReferenceFrame()const;/计算从局部坐标系到世界坐标系的级联矩阵,计算从局部坐标系到世界坐标系的级联矩阵,bool computeLocalToWorldMatrix(Matrix& m,bool computeLocalToWorldMatrix(Matrix& m, NodeVisitor* nv)const; NodeVisitor
17、* nv)const;/计算从世界坐标系到局部坐标系的级联矩阵计算从世界坐标系到局部坐标系的级联矩阵bool computeWorldToLocalMatrix(Matrix& m,bool computeWorldToLocalMatrix(Matrix& m, NodeVisitor* nv)const NodeVisitor* nv)const在实际开发中,常用在实际开发中,常用osg:Transformosg:Transform的派生类:的派生类:osg:MatrixTransformosg:MatrixTransform类类osg:PositionAttitudeTransformo
18、sg:PositionAttitudeTransform类类osg:DOFTransformosg:DOFTransform类类1717/设置和获取缩放的倍数设置和获取缩放的倍数void setScale(const Vec3&);void setScale(const Vec3&);const Vec3& getScale()const;const Vec3& getScale()const;/设置和获取缩放与旋转的轴心位置设置和获取缩放与旋转的轴心位置void setPivotPoint(const Vec3&);void setPivotPoint(const Vec3&);const
19、Vec3& getPivotPoint()const;const Vec3& getPivotPoint()const;osg:DOFTransformosg:DOFTransform类:即自由度节点,通过对三种基类:即自由度节点,通过对三种基本旋转量,即航偏角度本旋转量,即航偏角度(Heading/Yaw,(Heading/Yaw,沿沿Z Z轴旋转轴旋转) )、摇摆角度摇摆角度(pitch,(pitch,沿沿Y Y轴旋转轴旋转) )、横滚角度、横滚角度(Roll,(Roll,沿沿X X轴旋轴旋转转) )的复合运算,得到以旋转为主的空间变换结果。的复合运算,得到以旋转为主的空间变换结果。181
20、8(3.2)开关节点osg:Switch类其作用是隐藏和显示某些节点,即控制节点的显示。其作用是隐藏和显示某些节点,即控制节点的显示。/添加一个子节点并设置其开关值添加一个子节点并设置其开关值bool addChild(Node* child,bool);bool addChild(Node* child,bool);/设置给定子节点的开关值设置给定子节点的开关值void setValue(unsigned int pos,bool);void setValue(unsigned int pos,bool);/获取给定位置的子节点的开关值获取给定位置的子节点的开关值bool getValue(
21、unsigned int pos)const;bool getValue(unsigned int pos)const;19192020(3.3)细节层次节点osg:LOD类(3.4)相机节点osg:CameraNode类(3.5)渲染属性节点2121代码举例osg:ref_ptr geode;osg:ref_ptr geode;osg:ref_ptr lod = new osg:LOD;osg:ref_ptr lod = new osg:LOD;/ / 当距离在当距离在0.f 0.f 与与1000.f 1000.f 之间时,显示之间时,显示geodegeode。lod-addChild( g
22、eode.get(), 0.f, 1000.f );lod-addChild( geode.get(), 0.f, 1000.f );如果子节点的范围有交叠,如果子节点的范围有交叠,LOD LOD 将同时显示多个子节点。将同时显示多个子节点。osg:ref_ptr geode0, geode1;osg:ref_ptr geode0, geode1;osg:ref_ptr lod = new osg:LOD;osg:ref_ptr lod = new osg:LOD;/ / 当距离在当距离在0.f 0.f 与与1050.f 1050.f 之间时,显示之间时,显示geode0geode0。lod-
23、addChild( geode0.get(), 0.f, 1050.f );lod-addChild( geode0.get(), 0.f, 1050.f );/ / 当距离在当距离在950.f 950.f 与与2000.f 2000.f 之间时,显示之间时,显示geode1geode1。lod-addChild( geode1.get(), 950.f, 2000.f );lod-addChild( geode1.get(), 950.f, 2000.f );/ / 因此,当距离在因此,当距离在950.f 950.f 到到1050.f 1050.f 之间时,将同时显示之间时,将同时显示/ge
24、ode0 /geode0 和和geode1geode1。2222LOD的自定义中心点n n缺省条件下,缺省条件下,LOD LOD 计算视点到物体包络体中心点的距离。计算视点到物体包络体中心点的距离。如果这样并不符合渲染要求,那么用户可以指定一个自定如果这样并不符合渲染要求,那么用户可以指定一个自定义的中心点。义的中心点。n n代码举例:代码举例:osg:ref_ptr lod = new osg:LOD;osg:ref_ptr lod = new osg:LOD;/ / 使用用户定义的中心点来计算距离使用用户定义的中心点来计算距离。lod-setCenterMode(lod-setCenter
25、Mode( osg:LOD:USER_DEFINED_CENTER ); osg:LOD:USER_DEFINED_CENTER );/ / 设置自定义中心点的设置自定义中心点的X X 坐标坐标1010,Y Y 坐标坐标100100。Lod-setCenter( osg:Vec3( 10.f, 100.f, 0.f ) );Lod-setCenter( osg:Vec3( 10.f, 100.f, 0.f ) );n n如果要重新设置距离计算的缺省特性为物体的包络球,如果要重新设置距离计算的缺省特性为物体的包络球, 可以调用可以调用osg:LOD:setCenterMode(osg:LOD:USE_BOUNDIosg:LOD:setCenterMode(osg:LOD:USE_BOUNDING_SPHERE_CENTER )NG_SPHERE_CENTER );2323