查看: 4374|回复: 6

多个osg::ClipNode裁剪模型的问题

[复制链接]

该用户从未签到

发表于 2012-7-17 16:01:35 | 显示全部楼层 |阅读模式
如下代码中,只有clipNode2可见,clipNode1被裁减掉了,但是clipNode1应该子被裁减掉一半,是不是osg中osg::ClipNode只对最后一个起作用,前面的osg::ClipNode也受最后一个osg::ClipNode的影响。是否有方法使得osg::ClipNode只对自身起作用,而不影响其他的osg::ClipNode?希望各位看一下,谢谢!


#include "stdafx.h"
#include <osg/ClipNode>
#include <osg/MatrixTransform>
#include <osg/ComputeBoundsVisitor>

#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>

int main(int, char**)
{
        // construct the viewer
        osgViewer::Viewer viewer;

        osg::Node* node = osgDB::readNodeFile("F:/osgModel/cow.osg");
        osg::ComputeBoundsVisitor cbv;
        node->accept( cbv );

        const osg::BoundingBox& bb = cbv.getBoundingBox();

        osg::BoundingBox bb1 = bb;
        bb1.xMin() += (bb.xMax() - bb.xMin()) * 0.5f;

        osg::BoundingBox bb2 = bb;
        bb2.xMax() -= (bb.xMax() - bb.xMin()) * 0.5f;

        osg::ClipNode* clipNode1 = new osg::ClipNode;
        clipNode1->addChild(node);
        clipNode1->createClipBox(bb1);
        clipNode1->setCullingActive(false);

        osg::ClipNode* clipNode2 = new osg::ClipNode;
        clipNode2->addChild(node);
        clipNode2->createClipBox(bb2);
        clipNode2->setCullingActive(false);

        osg::MatrixTransform* mt1 = new osg::MatrixTransform;
        mt1->setMatrix(osg::Matrix::translate(bb._max - bb._min));
        mt1->addChild(clipNode1);
        //mt1->setNodeMask(0);

        osg::MatrixTransform* mt2 = new osg::MatrixTransform;
        //mt2->setMatrix(osg::Matrix::translate(bb._max - bb._min));
        mt2->addChild(clipNode2);
        //mt2->setNodeMask(0);

        osg::Group* root = new osg::Group;
        root->addChild(mt1);
        root->addChild(mt2);

        // set the scene to render
        viewer.setSceneData(root);

        // run the viewers frame loop
        return viewer.run();
}

该用户从未签到

发表于 2012-7-18 09:26:40 | 显示全部楼层
ClipNode,以及ClipPlane,是封装了OpenGL的glClipPlane()方法,这个方法的一个重要限制是最多只能有6个裁切面同时作用。
因此,当您使用了createClipBox()的时候,等于已经同时创建了六个裁切面,再创建新的是不可能的了,只会产生覆盖。

不要抱怨,OpenGL的固定管线就是这个鸟样子,如果想要任意地去裁切,也许您需要考虑一下基于shader的做法

该用户从未签到

发表于 2012-7-18 09:56:41 | 显示全部楼层
这样啊

该用户从未签到

发表于 2012-7-19 09:14:40 | 显示全部楼层
我就说为什么创建了两个clipNode之后并没有达到我想要的效果,谢谢各位了

该用户从未签到

发表于 2013-4-9 16:21:20 | 显示全部楼层
本帖最后由 wulingxia 于 2013-4-9 16:22 编辑

一个clipNode只用了两个面裁剪,为什么两个clipNode也会覆盖呢?

怎样实现显示被clipNode切掉的部分?

该用户从未签到

发表于 2013-12-17 09:37:17 | 显示全部楼层
array 发表于 2012-7-18 09:26
ClipNode,以及ClipPlane,是封装了OpenGL的glClipPlane()方法,这个方法的一个重要限制是最多只能有6个裁 ...

请问基于shader的方法是什么意思呢

该用户从未签到

发表于 2013-12-17 13:39:20 | 显示全部楼层
请问你最后怎样实现的多面裁剪呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表