1.osgSim扩展库
osgSim是0SG的一个工具箱(NodeKit),提供了仿真系统中以及染OpenFlight 数据库所需的特殊渲染功能,如地形高程图、光点节点和 DOF 变换节点等。
下面对一些可能会用到的类进行简单介绍。
1.1 DOFTransform类
osgSim::DOFTransform类是对 Multigen 中 DOF 操作的一个封装,主要用于机械仿真中的机械运动控制,如履带的运动和机器手臂的运动等。
osgSim::DOFTransform 的继承关系图如图12-12 所示。
图12-12 osgSim::DOFTransform 的继承关系图
从继承关系图中可以看出,它继承自osg::Transform,具备一般的变换操作,如平移、旋转。同时它也是一个组节点,可以添加自己的子节点。
下面介绍 osgSim::DOFTransform的主要成员函数:
- void setMinHPR(const osg::Vec3 &hpr) // 设置最小HPR
- const osg::Vec3 & getMinHPR()const// 得到最小HPR
- void setMaxHPR(const osg::Vec3 &hpr) // 设置最大HPR
- const osg::Vec3& getMaxHPR()const// 得到最大HPR
- void setIncrementHPR(const osg::Vec3 &hpr) // 设置HPR增量
- const osg::Vec3 & getIncrementHPR()const // 得到HPR增量
- void setCurrentHPR(const osg::Vec3 &hpr) //设置当前HPR
- const osg::Vec3 & getCurrentHPR()const//得到当前HPR
- void updateCurrentHPR(const osg::Vec3 &hpr) //更新当前HPR
- void setMinTranslate(const osg::Vec3 &translate) //设置最小平移
- const osg::Vec3& getMinTranslate()const//得到最小平移
- void setMaxTranslate(const osg::Vec3 &translate) //设置最大平移
- const osg::Vec3 & getMaxTranslate()const//得到最大平移
- void setIncrementTranslate(const osg::Vec3 &translate) //设置平移增量
- const osg::Vec3 & getIncrementTranslate() const//得到平移增量
- void setCurrentTranslate(const osg::Vec3 &translate) // 设置当前平移
- const osg::Vec3 & getCurrentTranslate()const//得到当前平移
- void updateCurrentTranslate(const osg::Vee3 &translate) //更新当前平移
- void setMinScale(const osg::Vec3 &scale) //设置最小缩放
- const osg::Vec3 & getMinScale()const//得到最小缩放
- void setMaxScale(const osg::Vee3 &scale) //设置最大缩放
- const osg::Vec3 & getMaxScale()const//得到最大缩放
- void setIncrementScale(const osg::Vec3 &scale) //设置缩放增量
- const osg::Vec3 & getIncrementScale()const//得到缩放增量
- void setCurrentScale(const osg::Vec3 &scale) //设置当前缩放
- const osg::Vec3 & getCurrentScale()const//得到当前缩放
- void updateCurrentScale(const osg::Vec3 &scale) //更新当前缩放
- void setPutMatrix(const osg::Matrix &put) //设置放置矩阵
- const osg::Matrix & getPutMatrix()const//得到放置矩阵
- void setInversePutMatrix(const osg::Matrix &inversePut) //设置放置逆矩阵
- const osg::Matrix & getInversePutMatrix()const//得到放置逆矩阵
- void setLimitationFlags(unsigned long flags) //设置限制标志
- unsigned long getLimitationFlngs()const//得到限制标志
- void setHPRMultOrder(const MultOrder order) //设置 HPR 的顺序
- const MultOrdergetHPRMultOrder()const//得到 HPR 的顺序
- void setAnimationOn(bool do_animate) // 设置动面开始控制变量
- bool getAnimationOn()const//得到动面开始控制变量
- void animate(float deltaTime)// DOF 动画
- virtual bool computeLocalToWoridMatrix(osg::Matrix &matrix,osg::NodeVisitor *nv)const//计算局部矩阵到世界矩阵
- 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 所示。
图 12-13 osgSim::Impostor的继承关系图
从继承图中可以看出,osgSim::Impostor继承自osg::LOD,是一个细节变换节点,可以对模型渲染简化。同时,它的父节点中包含 osgGroup 节点,因此,作为一个组节点,它可以添加自己的子节点来设置替代谊染。
下面介绍osgSim::Impostor的主要成员函数
- void setlmpostorThreshold(float distance) // 设置Impostor开始距离
- float getImpostorThreshold()const// 得到Impostor开始距离
- void setlmpostorThresholdToBound(float ratio=1.0f) // 设置Impostor的开始距离相对物体包围球半径的比例
- ImpostorSprite * findBestlmpostorSprite(unsigned int contextlD, const osg.:Vec3 &currLocalEyePoint)const// 查找最佳ImpostorSprite适应当前视点
- void addImpostorSprite(unsigned int contextlD, ImpostorSprite *is) // 在Impostor 中添加ImpostorSprite
- ImpostorSpriteList & getlmpostorSpriteList(unsigned int contexID) //得到ImpostorSprite 列表
- const ImpostorSpriteList & getlmpostorSpriteList(unsigned int contexID)const//得到constImpostorSprite 列表
- virtual osg::BoundingSphere computeBound()const//计算节点的几何体或子节点的包围球
- ImpostorSprite *createlmpostorSprite(osgUtil::CullVisitor *cv) //利用拣选(Cull)创建ImpostorSprite
1.3 osgSim::lmpostorSprite类
一个三维的几何体在渲染时可使用贴图方块来替代,ImpostorSprite 通过将三维几何体渲染到贴图作为图像缓存(image cache),一般ImpostorSprite 通过osgUtil::CullSetting 类自动生成,没有必要直接用它生成。
osgSim::ImpostorSprite 的继承关系图如图12-14 所示。
图12-14 osgSim::ImpostorSprite 的继承关系图
下面介绍osgSim::ImpostorSprite 的主要成员函数:
- void setParent(Impostor *parcnt) //设置父节点,但父节点必须是一个替代节点(Impostor)
- Impostor *getParent()//得到父节点
- const Impostor *getParent()const//得到const父节点
- void setStoredLocalEyePoint(canst osg::Vec3 &v) // 设置视点添加到ImpostorSprite
- const osg::Vec3 & getStoredLocalEyePoint()const// 得到ImpostorSprite的视点
- void setLastFrameUsed(int frameNumber) // 设置使用ImpostorSprite的最后一顿
- int getLastFrameUsed()const// 得到使用ImpostorSprite的最后一顿
- osg::Vec3* getCoords()// 得到匹配ImpostorSprite的四边形的坐标
- const osg::Vec3 * getCoords()const// 得到匹配ImpostorSprite的const四边形的坐标
- osg::Vec2*getTexCoords()// 得到匹配ImpostorSprite的四边形的纹理坐标
- const osg::Vec2* getTexCoords()const// 得到匹配ImpostorSprite的const 四边形的坐标
- osg::Vec3* getControlCoords()// 得到匹配ImpostorSprite的四边形的可控制的坐标
- const osg::Vec3* getControlCoords()const// 得到匹配ImpostorSprite的const四边形的可控制坐标
- float calcPixelError(const osg::Matrix &MVPW)const// 当从局部坐标到屏幕华标转换时,像素计算发生错误
- void setTexture(osg::Texture2D *tex, int s, int t) // 设置纹理贴图
- osg::Texture2D * getTexture()// 得到纹理贴图
- const osg::Texture2D getTexture()const// 得到const纹理贴图
- int s()const//返回s坐标
- int t()const//返回t坐标
- virtual void drawImplementation (osg::RenderInfo &renderInfo) const// 直接绘制ImpostorSprite
- virtual osg::BoundingBoxcomputeBound()const// 计算绘制几何体的包围盒
- void setCamera(osg::Camera *camera) // 设置一个相机,用于ImpostorSprite渲染
- osg::Camera*getCamcra()// 得到用于ImpostorSprite渲染的相机
- const osg::Camera getCamera()const// 得到用于ImpostorSprite渲染的const相机
1.4 osgSim::MultiSwitch类
osgSim::MultiSwitch 类是一个组节点类,它允许同时显示或隐藏多个选中的子节点,MultiSwitch是基于OpenFlight中的switch操作。
osgSim::MultiSwitch的继承关系图如图12-15所示。
图12-15 osgSim::MuliSwitch 的继承关系图
从继承关系图可以看出,osgSim::MultiSwitch 直接继承自 osg::Group 类作为一个组节点,可以添加自己的子节点。同时,它编写了一系列关于 OpenFlight 的节点的操作方法。
下面介绍osgSim::MultiSwitch 的主要成员函数
- void setNewChildDefaultValue(bool value) // 设置新子节点的默认值
- bool getNewChildDefaultValue()const// 得到新子节点的默认值
- virtual bool addChild(osg::Node *child) // 添加子节点
- virtual bool insertChild(unsigned int index, osg::Node *child) // 在特定的位置添加子节点
- virtual bool removeChild(osg::Node *child) // 移除子节点
- void setValue(unsigned int switchSet, unsigned int pos, bool value) // 设置某个特定位置的子节点的值
- bool getValue(unsigned int switchSet, unsigned int pos)const// 得到某个特定位置的子节点的值
- yoid setChildValue(const osg::Node *child, unsigned int switchSet, bool value) // 设置某个特定子节点的值
- bool getChildValue(const osg::Node *child, unsigned int switchSet)const// 得到某个特定const子节点的值
- bool setAllChildrenOff(unsigned int switchSet) // 设置所有子节点的值都为 OFF
- bool setAllChildrenOn(unsigned int switchSet) // 设置所有子节点的值都为ON
- bool setSingleChildOn(unsigned int switchSet, unsigned int pos)// 设置只有一个子节点为ON,其余为OFF
- void setActiveSwitchSet(unsigned int switchSet) // 设置有效的Switch 列表被使用
- unsigned int getActiveSwitchSet()const// 得到使用的有效的Switch 列表
- void setSwitchSetList(const SwitchSetList &switchSetList)// 设置Switch列表
- const SwitchSctList & getSwitchSetList()const//得到Switch列表
- void setValueList(unsigned int switchSet, const ValueList &values) //设置一系列不同的值,用来实现特定的switch
- const ValueList & getValueList(unsigned int switchSet)const//得到一系列不同的switch值
1.5 osgSim::OverlayNode 类
可以在一个场景上创建一个覆盖图,这张覆盖图的生成是通过预渲染一个子场景图形到一张贴图上,最后将生成的结果,即纹理贴图贴到场景上。
osgSim::OverlayNode 的继承关系图如图12-16 所示。
图12-16 osgSim::OverlayNode 的继承关系图
下面介绍osgSim::OverlayNode 的主要成员函数
- // 设置生成覆盖子图的技法
- void setOverlayTechnique(OverlayTechnique technique)
- // 得到生成覆盖子图的技法
- OverlayTechnique getOverlayTechnique()const
- // 设置生成覆盖子图纹理时执行的渲染标志
- void setRenderTargetlmplementation(osg::Camera::RenderTargetImplementation impl)
- // 设置用于生成覆盖子图的节点
- void setOverlaySubgraph(osg::Node *node)
- //得到用于生成覆盖子图的节点
- osg::Node *getOverlaySubgraph()
- //得到用于生成覆盖子图的const节点
- const osg::Node *getOverlaySubgraph()const
- //更新覆盖子图纹理
- void dirtyOverlayTexture()
- //设置覆盖子图持续更新
- void setContinuousUpdate(bool update)
- //得到覆盖子图持续更新的bool值
- bool getContinuousUpdate()const
- //设置覆盖子图基面的高度
- void setOverlayBaseHeight(double baseHeight)
- //得到覆盖子图基面的高度
- double getOverlayBaseHeight()const
- //设置覆盖子图的背景清除色
- void setOverlayClearColor(const osg::Vec4 &color)
- //得到覆盖子图的背景清除色
- const osg::Vec4 & getOverlayClearColor()const
- //设置纹理环境模式
- void setTexEnvMode(GLenum mode)
- //得到纹理环境模式
- GLenum getTexEnvMode()const
- //设置爱盖子图的纹理单元
- void setOverlayTextureUnit(unsigned int unit)
- //得到覆盖子图的纹理单元
- unsigned int getOverlayTextureUnit()const
- //设置覆盖子图纹理的尺寸大小细分度
- void setOverlayTextureSizeHint(unsigned int size)
- //得到覆盖子图纹理的尺寸大小细分度
- unsigned int getOverlayTextureSizeHint()const
1.6 osgSim::VisibilityGroup 类
在一个 Visibility 的盒子中,根据当前的相机的视点,发射一条线段,然后判断在盒子中的物体与这条射线是否有相交,如果相交,将显示次物体(遍历时会遍历到),否则是隐藏的。
osgSim:: VisibilityGroup 的继承关系图如图12-17 所示。
图12-17 osgSim::VisibilityGroup的承关系图
从继承关系图可以看出,osgSim::VisibilityGroup 直接继承自osg::Group 节点。作为一个组节点可以添加自己的子节点。同时,它编写了一系列关于场景中多个物体渲染顺序问题的操作,用于控制多个重合物体渲染时的选择。
下面介绍osgSim::VisibilityGroup的主要成员函数
- //设置子节点的可见度
- void setVisibilityVolume(osg::Node*node)
- //得到子节点的可见度
- osg::Node *getVisibilityVolumc()
- //得到子节点的const可见度
- const osg::Node*getVisibilityVolume()const
- //设置遍历时相交测试的标识
- void setVolumelntersectionMask(osg::Node::NodeMask mask)
- //得到遍历时相交测试的标识
- osg::Node::NodeMask getVolumeIntersectionMask()const
- //设置线段的长度
- void setSegmentLength(float length)
- //得到线段的长度
- float getSegmentlength()const