我工作的一个软件,其生成的多边形网格来表示一个球,我想划破球的孔。 这个多边形网格是仅横跨球体的表面的覆盖层。 我有一个如何确定哪些多边形相交我的洞是个好主意,我可以从我的收藏中删除,但在那之后,我开始有点糊涂了。 我想知道是否有人能帮助我与高层次的概念?
基本上,我设想三种情况:
1.) The cylindrical hole does not intersect my sphere.
2.) The cylindrical hole partially goes through my sphere.
3.) The cylindrical hole goes all the way through my sphere.
对于#1,我可以测试这个(没有多边形删除),并采取相应的行动(什么都不做)。 对于#2,#3,我不知道如何重新镶嵌了我的范畴占孔。 对于#3,我的有些想法,基本上是大致如下:
a.) Find your entry point (a circle)
b.) Find your exit point (a circle)
c.) Remove the necessary polygons
d.) Make new polygons along the 4* 'sides' of the hole to keep my
sphere a manifold.
这种极其简单的算法有一定的“洞”我想填例如,我真的不希望有4个侧面,以我的洞 - 它应该是一个圆柱体,或者在租赁圆柱体的镶嵌表示。 我也不能确定如何使这些新的多边形,以保持我的球在镶嵌表面的孔。
我不知道如何处理场景#2。
听起来像是你想有建设性的立体几何 。
凯特可能会做你想要什么。 如果你只是想运行时呈现OpenCSG会工作。
我使用标量场在今年早些时候实施的CSG操作。 它运作良好,如果性能并不重要。 也就是说,计算不是实时的。 问题是,衍生没有定义无处不在,所以你可以约廉价的计算顶点的法线这样算了。 它要做的后续步骤。 看到这里我用(在第一个答案)的纸,一些截图我做:
与移动立方体隐式曲面CSG操作
此外,CSG这种方式需要使用隐式曲面来表示初始网格。 虽然任何几何网可以分成飞机,就不会得到好的结果。 所以球会必须由具有半径和原点来表示,和气瓶将由半径,起源和基础的高度来表示。
那么,如果你只想渲染这个(想象),那么可能是你并不需要在所有的改变产生的网格。 而是使用模板缓冲区渲染与孔的球体。 例如我呈现与固体和透明的对象的组合邻近其外边缘圆形孔(作为一个基板,用于机械)盘(薄筒)周围,所以我需要的孔是真正的孔。 正如懒在运行时被生成以三角形状我选择模版此。
创建模板缓冲区OpenGL上下文
我使用8位的模板,但这种技术只使用单个位。
与清除模板0
和关闭深度和颜色口罩
这与模板渲染你的网前完成。 所以,如果你有这样渲染更多的对象,你需要他们每个人面前做到这一点。
设置模板与1
固体目
- 与清除模版
0
为网眼孔 - 打开深度和颜色面具,呈现实体网格,其中模板是
1
在代码中,它看起来是这样的:
// [stencil]
glEnable(GL_STENCIL_TEST);
// whole stencil=0
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
// turn off color,depth
glStencilMask(0xFF);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
// stencil=1 for solid mesh
glStencilFunc(GL_ALWAYS,1,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glCylinderxz(0.0,y,0.0,r,qh);
// stencil=0 for hole meshes
glStencilFunc(GL_ALWAYS,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
for(b=0.0,j=0;j<12;j++,b+=db)
{
x=dev_R*cos(b);
z=dev_R*sin(b);
glCylinderxz(x,y-0.1,z,dev_r,qh+0.2);
}
// turn on color,depth
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
// render solid mesh the holes will be created by the stencil test
glStencilFunc(GL_NOTEQUAL,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColor3f(0.1,0.3,0.4);
glCylinderxz(0.0,y,0.0,r,qh);
glDisable(GL_STENCIL_TEST);
其中glCylinderxz(x,y,z,r,h)
是在渲染气缸只是函数(x,y,z)
与半径r
与y
-轴作为它的旋转轴线。 的db
是角度步骤(2*Pi/12)
半径是r
-Big, dev_r
-空穴半径, dev_R
-空穴中心和qh
是板的厚度。
结果如下所示(各2块板的呈现与此):
该方法更适合薄的物体。 如果您的削减导致足够厚边,那么你需要添加一个切端呈现否则照明可能是错上这些部件。
文章来源: I have an OpenGL Tessellated Sphere and I want to cut a cylindrical hole in it