查看: 2269|回复: 6

请教osgmodeling中如何修剪表面

[复制链接]

该用户从未签到

发表于 2011-2-25 22:20:26 | 显示全部楼层 |阅读模式

我现在用王锐版主的osgmodeling工程生成了一个NURBS曲面,现在想修剪掉一部分,就像下图(从OPengl编程指南上裁剪下来的),在opengl中用函数gluBeginTrim()任意组合修剪曲线在曲面上修剪掉一个区域,现在我用osg来实现修剪NURBS曲面,如何实现?请各位高手指点。

1.osgosgmodeling中有没有类似的修剪功能的函数

2.或者用opengl中的gluBeginTrim()实现,但是怎样修剪用osgmodeling生成的曲面,就是opengl的这个函数怎么和osg结合在一起编程实现,是不是osg有扩展接口,我可以继承写一个类封装opengl中的gluBeginTrim(),还是能写一个插件,还是要改动osg底层代码

针对这两个思路请大侠们给点意见

[img]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/Users/770247350/QQ/WinTemp/RichOle/Q9[B4E6D{JX}@]W`YQI4IS6.jpg[/img]

该用户从未签到

发表于 2011-2-28 08:22:26 | 显示全部楼层
恐怕没有希望,osgModeling没有这个功能,并且也没有添加进来的打算。OpenGL与osg结合的方法请参看osg源代码中的osgteapot例子

该用户从未签到

 楼主| 发表于 2011-3-1 17:03:33 | 显示全部楼层
首先感谢王锐版主的指点,三十多人看过这个问题,没有人回答,我都快绝望,终于看到了您的指点,感谢!
我看了osgteapot的例子,可以派生一个osg:rawable的子类,重载drawImplementation(osg::RenderInfo&)这个函数,在这个函数里面写Opengl曲面函数和裁剪函数
gluBeginSurface(theNurb);
        gluNurbsSurface(theNurb, 8, knots, 8,knots,4*3, 3, &ctlpoints[0][0][0],        4,    4,GL_MAP2_VERTEX_3);
        gluBeginTrim(theNurb);
                gluPwlCurve(theNurb, 5, &edgePt[0][0],2, GLU_MAP1_TRIM_2);
        gluEndTrim(theNurb);
        gluBeginTrim(theNurb);
                gluNurbsCurve(theNurb, 8, curveKnots, 2, &curvePt[0][0], 4, GLU_MAP1_TRIM_2);
                gluPwlCurve(theNurb, 3, &pwlPt[0][0], 2,GLU_MAP1_TRIM_2);
        gluEndTrim(theNurb);
        gluEndSurface(theNurb);
就生成了OPengl编程指南上351页那个中间被剪掉一部分的曲面(剪掉了三条修剪曲线围成的环路)

现在问题如下:
我想用您的osgModeling::NurbsSurface类生成曲面
osg::ref_ptr<osgModeling::NurbsSurface> nurbsSurface = new osgModeling::NurbsSurface
代替gluNurbsSurface(theNurb, 8, knots.....)
然后用gluBeginTrim(theNurb)....一系列opengl修剪函数修剪这个曲面
就是先osgModeling::NurbsSurface生成曲面
下面用opengl的修剪函数gluBeginTrim(theNurb);
                         gluPwlCurve(theNurb, 5, &edgePt[0][0],2, GLU_MAP1_TRIM_2);
                           gluEndTrim(theNurb);

如何组织在一起,能不能办到?
我觉得好像不能,opengl的绘制函数只能写在gluBegin和gluEnd之间才能发挥作用,这样osg和opengl掺着写好像不行。而且osgModeling::NurbsSurface自己就是个Drawable节点。
我该怎么做?可以全部用opengl画曲面再裁剪,但是我发现渲染很慢,没有osgModeling画曲面快。
另外,我发现您的osgModeling中osgmodelingboolean的例子中,一个立方体被挖去了一块(一个半圆),这一块是用什么函数挖去的,可不可以用这个挖去方法来裁剪我的曲面?

还有,我在osg编译的源码里能找到里面封装的opengl函数如glNormal3sv、glcolor(在Geometry.cpp)
但为什么您的osgModeling中我找不到一个opengl函数,如gluNurbsSurface(),您封装到哪了呢?

该用户从未签到

 楼主| 发表于 2011-3-2 08:41:59 | 显示全部楼层
看沉了,自己顶一下

该用户从未签到

发表于 2011-3-2 08:43:26 | 显示全部楼层
恐怕不可能办到!因为osgModeling中使用纯粹的数学来计算并生成真实的顶点数据,不需要任何OpenGL函数的辅助;而glu库则是在内部进行运算的,得不到它的顶点信息。

OpenGL的NURBS功能本来就很不实用,速度慢,效率低,没有实际应用的意义。我建议您评估一下其它出色的NURBS库,例如openNURBS

osgModeling中的布尔运算功能并不实用,它是使用构建BSP树然后进行纯数学的运算来实现差运算的,很不稳定,用在您的程序中多半会立即出错

该用户从未签到

 楼主| 发表于 2011-3-3 22:26:01 | 显示全部楼层
NURBS库我在网上下到了,但他好像是把曲线存成或读取3dm格式,不是用于渲染显示的,osg能和NURBS库结合编程吗,就是osg程序中能调用NURBS库的曲线函数吗,像调用opengl的函数那样,我试了试,把NURBS库的曲线函数放在drawImplementation(osg::RenderInfo&)这个函数中好像行不通

该用户从未签到

发表于 2011-3-4 08:43:18 | 显示全部楼层
但他好像是把曲线存成或读取3dm格式,不是用于渲染显示的
您的理解是错误的

osg能和NURBS库结合编程吗
这在第三方工程osgXI中已经初步实现了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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