查看: 2767|回复: 13

有关裁切平面的问题

[复制链接]

该用户从未签到

发表于 2012-8-14 14:20:12 | 显示全部楼层 |阅读模式
  我现在写了个osg::Geode类方法CreatePoly(),创建一个多边形作为裁切面,被裁切的是一个平面模型。尝试CullFace方法失败了,想请问能否通过osg::ClipPlane 或是osg::ClipNode实现这样的效果吗?
   PS:我创建的裁切面是通过鼠标点击几个点->形成面。。。。不是那种setClip

该用户从未签到

 楼主| 发表于 2012-8-14 16:18:36 | 显示全部楼层
自顶,求助高手给予思路

该用户从未签到

发表于 2012-8-14 16:26:51 | 显示全部楼层
请注意OpenGL的clip plane是有数量限制的,不能超过6个

该用户从未签到

 楼主| 发表于 2012-8-14 16:46:48 | 显示全部楼层
array 发表于 2012-8-14 16:26
请注意OpenGL的clip plane是有数量限制的,不能超过6个

恩~我的裁切面就是个四边形,可它是我写好的一个方法而已,并不像setClipPlane()那样输入a,b,c,d四个值就OK了~您看针对我这样的裁切面,如何实现裁切

该用户从未签到

 楼主| 发表于 2012-8-15 09:27:03 | 显示全部楼层
array 发表于 2012-8-14 16:26
请注意OpenGL的clip plane是有数量限制的,不能超过6个

  这是我的部分代码,之后会给您看报错截图。此处一直报错,还望您指点下
case (osgGA::GUIEventAdapter::KEYDOWN):
                        {
                                if (ea.getKey()=='C'||ea.getKey()=='c')
                                {
                                        osg::Geode *geode1=createPoly(pointList);
                                        osg::StateSet *stateset=geode1->getOrCreateStateSet();

                                        osg:olygonMode *polygonmode=new osg::PolygonMode;
                                        polygonmode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode:INE);
                                        stateset->setAttributeAndModes(polygonmode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);

                                        osg::ref_ptr<osg::ClipNode> cn=new osg::ClipNode;
                                        osg::Geode* cut2=createPoly(pointList);
                                        osg::BoundingSphere bs=cut2->getBound();
                                        bs.radius()=5.0f;

                                        osg::BoundingBox bb;
                                        bb.expandBy(bs);

                    cn->addChild(model);
                                        cn->createClipBox(bb,0);
                                       
                                        cn->setCullingActive(false);
                    root->setStateSet((cn->getStateSet()));
                                }
                        }
                        break;

该用户从未签到

 楼主| 发表于 2012-8-15 09:28:22 | 显示全部楼层
array 发表于 2012-8-14 16:26
请注意OpenGL的clip plane是有数量限制的,不能超过6个

问题2.jpg 问题1.jpg

该用户从未签到

发表于 2012-8-15 15:18:40 | 显示全部楼层
顶一下!

该用户从未签到

 楼主| 发表于 2012-8-16 09:35:47 | 显示全部楼层
顶一个,不要沉了~

该用户从未签到

发表于 2012-8-21 09:48:44 | 显示全部楼层
您的这段程序没有明显可能出错的地方,您可以用debug模式来检查一下调用堆栈的信息,看看是哪行语句有问题,我觉得您的错误和ClipNode本身没有关系

该用户从未签到

 楼主| 发表于 2012-8-21 10:08:09 | 显示全部楼层
array 发表于 2012-8-21 09:48
您的这段程序没有明显可能出错的地方,您可以用debug模式来检查一下调用堆栈的信息,看看是哪行语句有问题, ...

不瞒您说,我试过了,还是到处出现异常~我看了网上的资料,说是ClipNode只能保存内部的设置,之外的部分则会改变~现在我试过您以前回复别的帖子的相关方法,比如osgDelaunay的挖洞、模板缓存osg::Stencil类该相机清空模板缓存。但都差强人意,您看根据我鼠标点击生成待裁区域,如何选择更好的办法实现此区域的‘挖掉’??

该用户从未签到

发表于 2012-8-21 10:26:55 | 显示全部楼层
只是生成一个新的实例的话,不会有异常,OSG是Lazy rendering的模式,因此您的设置不会立即生效,因此也就不会立即出现显示参数错误导致程序中断的问题。您还是好好检查一下自己程序的命令堆栈吧

该用户从未签到

发表于 2012-8-21 10:28:22 | 显示全部楼层
此外我不认为ClipNode可以实现挖洞的功能,因为6个裁减面实在是太少了。Stencil的方法是最好的,并且我知道有朋友已经这样实现过了。您的实现过程也许并不完整,因为您只是提到了模板缓存的清空,却没有说自己是如何完成模板生成和Test的

该用户从未签到

 楼主| 发表于 2012-8-21 11:16:51 | 显示全部楼层
array 发表于 2012-8-21 10:28
此外我不认为ClipNode可以实现挖洞的功能,因为6个裁减面实在是太少了。Stencil的方法是最好的,并且我知道 ...

的确如您所说哈~那我是应该参照那个官方源码的osgpackeddepthstencil吧?

该用户从未签到

发表于 2012-8-28 10:30:55 | 显示全部楼层
官方应该没有专门用模板来挖洞的例子,不过我见过有朋友这样做了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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