osg::clipNode

该博客探讨了如何使用osg::clipNode来绘制线型节点,并详细解释了在不同变换矩阵和子节点配置下,裁剪效果的变化。在没有特定子节点的情况下,clipNode不会绘制任何内容。通过添加子节点和变换节点,可以实现图形的裁剪和逆变换,以达到预期的裁剪效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 这一段的功能主要是绘制线型的节点
    //创建根节点
    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又被逆变换过来了,保持没动。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值