1.osgSim扩展库

        osgSim是0SG的一个工具箱(NodeKit),提供了仿真系统中以及染OpenFlight 数据库所需的特殊渲染功能,如地形高程图、光点节点和 DOF 变换节点等。

        下面对一些可能会用到的类进行简单介绍。

1.1 DOFTransform

        osgSim::DOFTransform类是对 Multigen 中 DOF 操作的一个封装,主要用于机械仿真中的机械运动控制,如履带的运动和机器手臂的运动等。

        osgSim::DOFTransform 的继承关系图如图12-12 所示。

osgSim扩展库-LMLPHP

图12-12 osgSim::DOFTransform 的继承关系图

        从继承关系图中可以看出,它继承自osg::Transform,具备一般的变换操作,如平移、旋转。同时它也是一个组节点,可以添加自己的子节点。

        下面介绍 osgSim::DOFTransform的主要成员函数:

  1. void setMinHPR(const osg::Vec3 &hpr) // 设置最小HPR  
  2. const osg::Vec3 & getMinHPR()const// 得到最小HPR  
  3. void setMaxHPR(const osg::Vec3 &hpr) // 设置最大HPR  
  4. const osg::Vec3& getMaxHPR()const// 得到最大HPR  
  5. void setIncrementHPR(const osg::Vec3 &hpr) // 设置HPR增量  
  6. const osg::Vec3 & getIncrementHPR()const // 得到HPR增量  
  7. void setCurrentHPR(const osg::Vec3 &hpr) //设置当前HPR  
  8. const osg::Vec3 & getCurrentHPR()const//得到当前HPR  
  9. void updateCurrentHPR(const osg::Vec3 &hpr) //更新当前HPR  
  10. void setMinTranslate(const osg::Vec3 &translate) //设置最小平移  
  11. const osg::Vec3& getMinTranslate()const//得到最小平移  
  12. void setMaxTranslate(const osg::Vec3 &translate) //设置最大平移  
  13. const osg::Vec3 & getMaxTranslate()const//得到最大平移  
  14. void setIncrementTranslate(const osg::Vec3 &translate) //设置平移增量  
  15. const osg::Vec3 & getIncrementTranslate() const//得到平移增量  
  16. void setCurrentTranslate(const osg::Vec3 &translate) // 设置当前平移  
  17. const osg::Vec3 & getCurrentTranslate()const//得到当前平移  
  18. void updateCurrentTranslate(const osg::Vee3 &translate) //更新当前平移  
  19. void setMinScale(const osg::Vec3 &scale) //设置最小缩放  
  20. const osg::Vec3 & getMinScale()const//得到最小缩放  
  21. void setMaxScale(const osg::Vee3 &scale) //设置最大缩放  
  22. const osg::Vec3 & getMaxScale()const//得到最大缩放  
  23. void setIncrementScale(const osg::Vec3 &scale) //设置缩放增量  
  24. const osg::Vec3 & getIncrementScale()const//得到缩放增量  
  25. void setCurrentScale(const osg::Vec3 &scale) //设置当前缩放  
  26. const osg::Vec3 & getCurrentScale()const//得到当前缩放  
  27. void updateCurrentScale(const osg::Vec3 &scale) //更新当前缩放  
  28. void setPutMatrix(const osg::Matrix &put) //设置放置矩阵  
  29. const osg::Matrix & getPutMatrix()const//得到放置矩阵  
  30. void setInversePutMatrix(const osg::Matrix &inversePut) //设置放置逆矩阵  
  31. const osg::Matrix & getInversePutMatrix()const//得到放置逆矩阵  
  32. void setLimitationFlags(unsigned long flags) //设置限制标志  
  33. unsigned long getLimitationFlngs()const//得到限制标志  
  34. void setHPRMultOrder(const MultOrder order) //设置 HPR 的顺序  
  35. const MultOrdergetHPRMultOrder()const//得到 HPR 的顺序  
  36. void setAnimationOn(bool do_animate) // 设置动面开始控制变量  
  37. bool getAnimationOn()const//得到动面开始控制变量  
  38. void animate(float deltaTime)// DOF 动画  
  39. virtual bool computeLocalToWoridMatrix(osg::Matrix &matrix,osg::NodeVisitor *nv)const//计算局部矩阵到世界矩阵  
  40. virtual bool computeWorldToLocalMatrix(osg::Matrix &matrix,osg::NodeVisitor *nv)const //计算世界矩阵到局部矩阵  

1.2 osgSim::lmpostor

        osgSim::Impostor从osg::LOD类派生出来,继承了osg::LOD的接口,使用这个功能,可以不绘制远处的几何体,只需要将6个面使用贴图来表示,目的是使用假象的方法来提高渲染效率。

        osgSim::Impostor 的继承关系图如图12-13 所示。

osgSim扩展库-LMLPHP

图 12-13 osgSim::Impostor的继承关系图

        从继承图中可以看出,osgSim::Impostor继承自osg::LOD,是一个细节变换节点,可以对模型渲染简化。同时,它的父节点中包含 osgGroup 节点,因此,作为一个组节点,它可以添加自己的子节点来设置替代谊染。

        下面介绍osgSim::Impostor的主要成员函数

  1. void setlmpostorThreshold(float distance) // 设置Impostor开始距离  
  2. float getImpostorThreshold()const// 得到Impostor开始距离  
  3. void setlmpostorThresholdToBound(float ratio=1.0f) // 设置Impostor的开始距离相对物体包围球半径的比例  
  4. ImpostorSprite * findBestlmpostorSprite(unsigned int contextlD, const osg.:Vec3 &currLocalEyePoint)const// 查找最佳ImpostorSprite适应当前视点  
  5.   
  6. void addImpostorSprite(unsigned int contextlD, ImpostorSprite *is) // Impostor 中添加ImpostorSprite  
  7. ImpostorSpriteList & getlmpostorSpriteList(unsigned int contexID) //得到ImpostorSprite 列表  
  8. const ImpostorSpriteList & getlmpostorSpriteList(unsigned int contexID)const//得到constImpostorSprite 列表  
  9. virtual osg::BoundingSphere computeBound()const//计算节点的几何体或子节点的包围球  
  10. ImpostorSprite *createlmpostorSprite(osgUtil::CullVisitor *cv) //利用拣选(Cull)创建ImpostorSprite  

1.3  osgSim::lmpostorSprite

        一个三维的几何体在渲染时可使用贴图方块来替代,ImpostorSprite 通过将三维几何体渲染到贴图作为图像缓存(image cache),一般ImpostorSprite 通过osgUtil::CullSetting 类自动生成,没有必要直接用它生成。

        osgSim::ImpostorSprite 的继承关系图如图12-14 所示。

osgSim扩展库-LMLPHP

图12-14 osgSim::ImpostorSprite 的继承关系图

        下面介绍osgSim::ImpostorSprite 的主要成员函数:

  1. void setParent(Impostor *parcnt) //设置父节点,但父节点必须是一个替代节点(Impostor)  
  2. Impostor *getParent()//得到父节点  
  3. const Impostor *getParent()const//得到const父节点  
  4. void setStoredLocalEyePoint(canst osg::Vec3 &v) // 设置视点添加到ImpostorSprite  
  5. const osg::Vec3 & getStoredLocalEyePoint()const// 得到ImpostorSprite的视点  
  6. void setLastFrameUsed(int frameNumber) // 设置使用ImpostorSprite的最后一顿  
  7. int getLastFrameUsed()const// 得到使用ImpostorSprite的最后一顿  
  8. osg::Vec3* getCoords()// 得到匹配ImpostorSprite的四边形的坐标  
  9. const osg::Vec3 * getCoords()const// 得到匹配ImpostorSpriteconst四边形的坐标  
  10. osg::Vec2*getTexCoords()// 得到匹配ImpostorSprite的四边形的纹理坐标  
  11. const osg::Vec2* getTexCoords()const// 得到匹配ImpostorSpriteconst 四边形的坐标  
  12. osg::Vec3* getControlCoords()// 得到匹配ImpostorSprite的四边形的可控制的坐标  
  13. const osg::Vec3* getControlCoords()const// 得到匹配ImpostorSpriteconst四边形的可控制坐标  
  14. float calcPixelError(const osg::Matrix &MVPW)const// 当从局部坐标到屏幕华标转换时,像素计算发生错误  
  15. void setTexture(osg::Texture2D *tex, int s, int t) // 设置纹理贴图  
  16. osg::Texture2D * getTexture()// 得到纹理贴图  
  17. const osg::Texture2D  getTexture()const// 得到const纹理贴图  
  18. int s()const//返回s坐标  
  19. int t()const//返回t坐标  
  20. virtual void drawImplementation (osg::RenderInfo &renderInfo) const// 直接绘制ImpostorSprite  
  21. virtual osg::BoundingBoxcomputeBound()const// 计算绘制几何体的包围盒  
  22. void setCamera(osg::Camera *camera) // 设置一个相机,用于ImpostorSprite渲染  
  23. osg::Camera*getCamcra()// 得到用于ImpostorSprite渲染的相机  
  24. const osg::Camera getCamera()const// 得到用于ImpostorSprite渲染的const相机  

​​​​​​​1.4 osgSim::MultiSwitch

        osgSim::MultiSwitch 类是一个组节点类,它允许同时显示或隐藏多个选中的子节点,MultiSwitch是基于OpenFlight中的switch操作。

        osgSim::MultiSwitch的继承关系图如图12-15所示。

osgSim扩展库-LMLPHP

图12-15 osgSim::MuliSwitch 的继承关系图

        从继承关系图可以看出,osgSim::MultiSwitch 直接继承自 osg::Group 类作为一个组节点,可以添加自己的子节点。同时,它编写了一系列关于 OpenFlight 的节点的操作方法。

        下面介绍osgSim::MultiSwitch 的主要成员函数

  1. void setNewChildDefaultValue(bool value) // 设置新子节点的默认值  
  2. bool getNewChildDefaultValue()const// 得到新子节点的默认值  
  3. virtual bool addChild(osg::Node *child) // 添加子节点  
  4. virtual bool insertChild(unsigned int index, osg::Node *child) // 在特定的位置添加子节点  
  5. virtual bool removeChild(osg::Node *child) // 移除子节点  
  6. void setValue(unsigned int switchSet, unsigned int pos, bool value) // 设置某个特定位置的子节点的值  
  7. bool getValue(unsigned int switchSet, unsigned int pos)const// 得到某个特定位置的子节点的值  
  8. yoid setChildValue(const osg::Node *child, unsigned int switchSet, bool value) // 设置某个特定子节点的值  
  9. bool getChildValue(const osg::Node *child, unsigned int switchSet)const// 得到某个特定const子节点的值  
  10. bool setAllChildrenOff(unsigned int switchSet) // 设置所有子节点的值都为 OFF  
  11. bool setAllChildrenOn(unsigned int switchSet) // 设置所有子节点的值都为ON   
  12. bool setSingleChildOn(unsigned int switchSet, unsigned int pos)// 设置只有一个子节点为ON,其余为OFF  
  13. void setActiveSwitchSet(unsigned int switchSet) // 设置有效的Switch 列表被使用  
  14. unsigned int getActiveSwitchSet()const// 得到使用的有效的Switch 列表  
  15. void setSwitchSetList(const SwitchSetList &switchSetList)// 设置Switch列表  
  16. const SwitchSctList & getSwitchSetList()const//得到Switch列表  
  17. void setValueList(unsigned int switchSet, const ValueList &values) //设置一系列不同的值,用来实现特定的switch   
  18. const ValueList & getValueList(unsigned int switchSet)const//得到一系列不同的switch  

​​​​​​​1.5 osgSim::OverlayNode

        可以在一个场景上创建一个覆盖图,这张覆盖图的生成是通过预渲染一个子场景图形到一张贴图上,最后将生成的结果,即纹理贴图贴到场景上。

        osgSim::OverlayNode 的继承关系图如图12-16 所示。

osgSim扩展库-LMLPHP

图12-16 osgSim::OverlayNode 的继承关系图

        下面介绍osgSim::OverlayNode 的主要成员函数

  1. // 设置生成覆盖子图的技法  
  2. void setOverlayTechnique(OverlayTechnique technique)  
  3. // 得到生成覆盖子图的技法  
  4. OverlayTechnique getOverlayTechnique()const  
  5. // 设置生成覆盖子图纹理时执行的渲染标志  
  6. void setRenderTargetlmplementation(osg::Camera::RenderTargetImplementation impl)  
  7. // 设置用于生成覆盖子图的节点  
  8. void setOverlaySubgraph(osg::Node *node)  
  9. //得到用于生成覆盖子图的节点  
  10. osg::Node *getOverlaySubgraph()  
  11. //得到用于生成覆盖子图的const节点  
  12. const osg::Node *getOverlaySubgraph()const  
  13. //更新覆盖子图纹理  
  14. void dirtyOverlayTexture()  
  15. //设置覆盖子图持续更新  
  16. void setContinuousUpdate(bool update)  
  17. //得到覆盖子图持续更新的bool  
  18. bool getContinuousUpdate()const  
  19. //设置覆盖子图基面的高度  
  20. void setOverlayBaseHeight(double baseHeight)  
  21. //得到覆盖子图基面的高度  
  22. double getOverlayBaseHeight()const  
  23. //设置覆盖子图的背景清除色  
  24. void setOverlayClearColor(const osg::Vec4 &color)  
  25. //得到覆盖子图的背景清除色  
  26. const osg::Vec4 & getOverlayClearColor()const  
  27. //设置纹理环境模式  
  28. void setTexEnvMode(GLenum mode)  
  29. //得到纹理环境模式  
  30. GLenum getTexEnvMode()const  
  31. //设置爱盖子图的纹理单元  
  32. void setOverlayTextureUnit(unsigned int unit)  
  33. //得到覆盖子图的纹理单元  
  34. unsigned int getOverlayTextureUnit()const  
  35. //设置覆盖子图纹理的尺寸大小细分度
  36. void setOverlayTextureSizeHint(unsigned int size)
  37. //得到覆盖子图纹理的尺寸大小细分度
  38. unsigned int getOverlayTextureSizeHint()const

1.6  osgSim::VisibilityGroup 类

        在一个 Visibility 的盒子中,根据当前的相机的视点,发射一条线段,然后判断在盒子中的物体与这条射线是否有相交,如果相交,将显示次物体(遍历时会遍历到),否则是隐藏的。

        osgSim:: VisibilityGroup 的继承关系图如图12-17 所示。

osgSim扩展库-LMLPHP

图12-17 osgSim::VisibilityGroup的承关系图

        从继承关系图可以看出,osgSim::VisibilityGroup 直接继承自osg::Group 节点。作为一个组节点可以添加自己的子节点。同时,它编写了一系列关于场景中多个物体渲染顺序问题的操作,用于控制多个重合物体渲染时的选择。

        下面介绍osgSim::VisibilityGroup的主要成员函数

  1. //设置子节点的可见度  
  2. void setVisibilityVolume(osg::Node*node)  
  3. //得到子节点的可见度  
  4. osg::Node *getVisibilityVolumc()  
  5. //得到子节点的const可见度  
  6. const osg::Node*getVisibilityVolume()const  
  7. //设置遍历时相交测试的标识  
  8. void setVolumelntersectionMask(osg::Node::NodeMask mask)  
  9. //得到遍历时相交测试的标识  
  10. osg::Node::NodeMask getVolumeIntersectionMask()const  
  11. //设置线段的长度  
  12. void setSegmentLength(float length)  
  13. //得到线段的长度  
  14. float getSegmentlength()const  
12-01 13:58