zoukankan      html  css  js  c++  java
  • OSG:幼儿园篇 第一章 节点类

    一.简介

    二.osg::Node 节点类

    #include <osg/Node>

    typedef std::vector<Node*> NodePath;
    typedef std::vector<NodePath> NodePathList;
    typedef std::vector<Matrix> MatrixList;


    class OSG_EXPORT
    Node : public Object{ public:

    Node();
    Node(const Node&, const CopyOp& copyop = CopyOp::SHALLOW_COPY);

    virtual Object* cloneType() const {return new Node();}

    virtual Object* clone(const CopyOp& copyop) const {return new Node(*this, copyop);}

    virtual bool isSamKindAs(const Object* obj) const {return dynamic_cast<const Node*>(obj) != NULL;}

    virtual const char* libraryName() const {return "osg";}

    virtual const char* className() const {return "Node";}

    virtual Node* asNode() {return this;}

    virtual const Node* asNode() const {return this;}

    virtual Drawable* asDrawable() {return 0;}

    virtual const Drawable* asDrawable() const {return 0;}

    virtual Geometry* asGeometry() {return 0;}

    virtual const Geometry* asGeometry() const {return 0;}

    virtual Group* asGroup() {return 0;}

    virtual const Group* asGroup() const {return 0;}

    virtual Transform* asTransform() {return 0;}

    virtual const Transform* asTransform() const {return 0;}

    virtual Camera* asCamera() {return 0;}

    virtual const Camera* asCamera() const {return 0;}

    virtual Switch* asSwitch() {return 0;}

    virtual cosnt Switch* asSwitch() const {return 0;}

    virtual Geode* asGeode() {return 0;}

    virtual const Geode* asGeode() const {return 0;}

    virtual osgTerrain::Terrain* asTerrain() {return 0;}

    virtual void accept(NodeVisitor& nv);

    virtual void ascend(NodeVisitor& nv);

    virtual void traverse(NodeVisitor& /*nv*/){}

    typedef std::vector<Group*> ParentList;

    inline const ParentList& getParents() const {return _parents;}

    inline ParentList getParents() {return _parents;}

    inline Group* getParent(unsigned int i) {return _parents[i];}

    inline const Group* getParent(unsigned int i) const {return _parents[i];}

    inline unsigned int getNumParents() const {return static_cast<unsigned int> (_parents.size());}

    NodePathList getParentalNodePaths(osg::Node* haltTraversalAtNode = 0) const;

    Matrixlist getWorldMatrices(const osg::Node* haltTraversalAtNode = 0) const;

    void setUpdateCallback(Callback* nc);

    inline Callback* getUpdateCallback() {return _updateCallback.get();}

    inline const Callback* getUpdateCallback() const {return _updateCallback.get();}

    inline void addUpdateCallback(Callback* nc){
    if(nc != NULL){
    if(_updateCallback.valid())
    _updateCallback->addNestedCallback(nc);
    ele
    setUpdateCallback(nc);
    }
    }

    inline void removeUpdateCallback(Callback* nc){
    if(nc != NULL && _updateCallback.valid()){
    if(_updateCallback == nc)
    {
    ref_ptr<osg::Callback> new_nested_callback = nc->getNestedCallback();
    nc->setNestedCallback(0);
    setUpdateCallback(new_nested_callback.get());
    }
    else
    _updateCallback->remvoeNestedCallback(nc);
    }
    }

    inline unsigned int getNumChildrenRequiringUpdateTraversal() const {return _numChildrenRequiringUpdateTraversal;}

    void setEvent
    typedef std::vector
    <Group*> ParentList; // 返回父节点的列表 const ParentList& getParents() const; // 返回指定索引处父节点的指针 Group* getParent(unsigned int I); // 返回父节点的数目 unsigned int getNumParents() const; };

    三.osg::Group 组节点类

    osg::Group 组节点类可以向下继承有多个 osg::Group 子节点 ,也可以有多个 osg::Geode 子节点

    #include <osg/Group>

    class OSG_EXPORT Group : public Node{
    
    public:

    Group();
    Group(const Group&, const CopyOp& copyop = CopyOp::SHALLOW_COPY)

    META_Node(osg, Group);

    virtual Group* asGroup()
    virtual const Group* asGroup() consst

    virtual void traverse(NodeVisitor& nv)
    // 添加一个子节点 bool addChild(Node* child);
    //向指定索引位置插入一个子节点
    virtual bool insertChild(unsigned int index, Node* child)

      // 删除一个子节点
    virtual bool removeChild(Node* child);

    //从指定索引位置开始删除指定数目子节点
    inline bool removeChild(unsigned int pos, unsigned int numChildrenToRemove = 1)

    virtual bool removeChildren(unsigned int pos, unsigned int numChildrenToRemove)

      // 用新的子节点替换一个子节点
    virtual bool replaceChild(Node* origChild, Node* newChild)

    // 返回子节点的数目
    virtual unsigned int getNumChildren() const

    virtual bool setChild(unsigned int i, Node* node)

    //获取一个指定位置的子节点
    inline Node* getChild(unsigned int i)
    inline const Node* getChild(unsigned int i) const

    // 如果指定节点是一个子节点,返回true
    inline bool containsNode(const Node* node) const

    //获取一个子节点索引位置
    inline unsigned int getChildIndex(const Node* node) const

    virtual void setThreadSafeRefUnref(bool threadSafe)

    virtual void resizeGLObjectBuffers(unsigned int maxSize)

    virtual void releaseGLObjects(osg::State* = 0) const
    virtual BoundingSphere computeBound() const

    protected:

    virtual ~Group()

    virtual void childRemoved(unsigne int /*pos*/, unsigne int /*numChildrenToRemove*/)
    virtual void childInserted(unsigned int /*pos*/)

    NodeList _children;
    };

    三.osg::Geode 叶节点类

     osg::Geode 叶节点类用于保存几何信息以便渲染

    osg::Geode 叶节点无法向下继承子节点,只能向上继承 osg::Group 父节点

    #include <osg/Geode>

     

    class OSG_EXPORT Geode : public Group
    {
    public:

    //构造函数
    Geode();
    Geode(const Geode&, const CopyOp& copyop = CopyOp::SHALLOW_COPY);


    virtual Geode* asGeode()
    virtual const Geode* asGeode() const

      //从叶节点追加一个可绘制体对象
    virtual bool addDrawable(Drawable* drawable);

    //从叶节点删除一个可绘制体对象
    virtual bool removeDrawable(Drawable* drawable);
    virtual bool removeDrawables(unsigned int i, unsigned int numDrawablesToRemove = 1)

      //将当前节点中包含的一个可绘制体替换为新的可绘制体
    virtual bool replaceDrawable(Drawable* origDraw, Drawable* newDraw);

    virtual bool setDrawable(unsigned int i, Drawable* drawable);

    //获取可绘制体的数目
    inline unsigned int getNumDrawables() const

    //获取一个指定位置的可绘制体
    inline Drawable* getDrawable(unsigned int i)
    inline const Drawable* getDrawable(unsigned int i) const

    inline bool constainsDrawable(const Drawable* drawable) const

      //获取一个可绘制体在叶节点的索引位置
    inline unsigned int getDrawableIndex(const Drawable* drawable) const

    void compileDrawables(RenderInfo& renderInfo)
    inline const BoundingBox& getBoundingBox() const
    virtual BoundingSphere computeBound() const;

    protected:
    virtual ~Geode();
    mutable osg::BoundingBox _bbox;

    };

    四.osg::Geometry 绘图基元类

    在osg中,通常有三种生成几何体的方法:1.用封装的OpenGL绘图基元osg::Geometry,2.是用OSG中预定义的基本几何体,3.是从文件中导入场景模型

    osg::Geometry 几何体类可以通过指定顶点 颜色和法线的方式,绘制简单的线段 三角形 多边形并将绘图的结果添加到场景的叶节点Geode中

    osg::Group* root = new osg::Group();            //组节点
    osg::Geode* geode = new osg::Geode();           //叶节点
    osg::Geometry* geometry = new osg::Geometry();  //几何图元
    
    root->addChild(geode);
    geode->addDrawable(geometry);

    五.osg::LOD 细节层次节点类

     osg::LOD节点可以实现不同细节层次下物体的渲染。通过指定各个子节点的有效范围,该范围包含了最大和最小值。当子节点与观察者的距离在这个节点的有效范围之内时,LOD将显示这个节点。

    基本实现方法:在不影响渲染外观的前提下,根据场景对象与观察者的距离,从多个预置方案中选择一种更为简单的方法来表达要渲染的物体,减轻系统绘制场景的负担,模型越靠近观察者时越精细。

    LOD()
    bool addChild(Node* child, float min, float max)    //添加一个子节点,并设置对应的观察距离
    
    //设置指定位置的子节点对应的观察范围,或者获取某个子节点对应的观察最小值/最大值
    void setRange(unsigned int childNo, float min, float max)
    float getMinRange(unsigned int childNo) const
    float getMaxRange(unsigned int childNo) const
    
    const RangeList& getRangeList() const    //获取所有子节点观察范围的列表

    六.osg::Switch 开关节点类

    osg::Switch开关节点类可以渲染或者跳过指定的子节点。根据当前渲染的负荷有选择地渲染子图形以实现渲染性能的均衡,或者在界面和层级进行有选择地切换

  • 相关阅读:
    反射和内置方法重写
    封装
    接口与抽象类 、多态
    面向对象--继承和组合
    python对象
    模块导入
    python序列化模块
    time random sys os 模块
    python re模块和collections
    python各种推导式
  • 原文地址:https://www.cnblogs.com/k5bg/p/11451443.html
Copyright © 2011-2022 走看看