Examples osgclip注释

详细源码见osg例子 osgclip,这里只分析decorate_with_clip_node函数

  • 这一段的功能主要是绘制线型的节点
     // 创建根节点
    osg::Group *  rootnode  =   new  osg::Group;

    
// 创建状态集
    osg::StateSet *  stateset  =   new  osg::StateSet;

    
// 设置多边形绘制方式为线型,正反面都绘制
    osg::PolygonMode *  polymode  =   new  osg::PolygonMode;
    polymode
-> setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);

    
// 设置状态覆盖其子节点的状态(子节点设为保护的除外)
    stateset -> setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
    
    osg::Group
*  wireframe_subgraph  =   new  osg::Group;
    wireframe_subgraph
-> setStateSet(stateset);
    wireframe_subgraph
-> addChild(subgraph);
    rootnode
-> addChild(wireframe_subgraph);
  • 这一段虽然设置了变换矩阵,变换矩阵还有孩子裁剪节点,但是裁剪节点并没有设置子节点,实际这一段什么也没有绘制。

 

     // transform围绕一轴旋转
    osg::MatrixTransform *  transform =   new  osg::MatrixTransform;
    osg::NodeCallback
*  nc  =   new  osg::AnimationPathCallback(subgraph -> getBound().center(),osg::Vec3( 0.0f , 0.0f , 1.0f ),osg::inDegrees( 45.0f ));
    transform
-> setUpdateCallback(nc);

    
// 裁剪节点和裁剪盒,盒以外的都将裁剪掉
    osg::ClipNode *  clipnode  =   new  osg::ClipNode;
    osg::BoundingSphere bs 
=  subgraph -> getBound();
    bs.radius()
*=   0.4f ;
    osg::BoundingBox bb;
    bb.expandBy(bs);
    clipnode
-> createClipBox(bb);
    clipnode
-> setCullingActive( false );
    transform
-> addChild(clipnode);
    rootnode
-> addChild(transform);

 

    osg::Group *  clipped_subgraph  =   new  osg::Group;

    
// 设置clipped_subgraph的状态为clipnode的状态,这样clipped_subgraph实际上未裁剪的六面体已经进行了旋转,也就是说这时绘制的结果应该如第一副,牛本身保持不动,而裁剪节点在动
//setStateSet()让clipped_subgraph可以被剪裁
    clipped_subgraph -> setStateSet(clipnode -> getStateSet());
    clipped_subgraph
-> addChild(subgraph);
    rootnode
-> addChild(clipped_subgraph);

想想如果没有第三段代码,而在第二段的最后加上一句

clipnode->addChild(subgraph);则回出现第二副图的情况,那就是牛被裁剪外(保留的区域)脱离了线框牛。但是如果在clipnode加入一个变换节点,但是和刚才那个是反方向的,然后在变换节点后再加入子节点subgraph,也可以实现,因为这事subgraph又被逆变换过来了,保持没动。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Examples osgclip注释)