1

我正在开发一个软件,它生成一个多边形网格来表示一个球体,我想在球体上切一个洞。这个多边形网格只是球体表面的覆盖。我很清楚如何确定哪些多边形会与我的洞相交,我可以将它们从我的收藏中删除,但在那之后我有点困惑。我想知道是否有人可以帮助我了解高级概念?

基本上,我设想了三种情况:

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。

4

3 回答 3

2

听起来你想要建设性的立体几何

Carve可能会做你想做的事。如果你只是想要运行时渲染,OpenCSG就可以了。

于 2010-10-18T22:57:28.137 回答
1

今年早些时候,我使用标量域实现了 CSG 操作。如果性能不重要,它会很好地工作。也就是说,计算不是实时的。问题是导数并没有在任何地方定义,所以你可以忘记以这种方式计算廉价的顶点法线。它必须作为一个后步骤来完成。请参阅此处查看我使用的论文(在第一个答案中),以及我制作的一些屏幕截图:

带有行进立方体的隐式曲面上的 CSG 操作

此外,这种方式的 CSG 需要使用隐式曲面来表示初始网格。虽然任何几何网格都可以分割成平面,但它不会给出好的结果。因此,球体必须由半径和原点表示,圆柱体将由半径、原点和基高表示。

于 2010-10-19T08:28:39.863 回答
1

好吧,如果您只想渲染(可视化),那么您可能根本不需要更改生成的网格。而是使用模板缓冲区来渲染带有孔的球体。例如,我正在渲染圆盘(薄圆柱体),其外边缘附近有圆形孔(作为机械的基板),周围有固体和透明物体的组合,所以我需要这些孔是真正的孔。由于我懒得对运行时生成的形状进行三角测量,因此我为此选择了模板。

  1. 使用 Stencil 缓冲区创建 OpenGL 上下文

    我使用 8 位的模板,但这种技术只使用一位。

  2. 使用深度和颜色蒙版清除模板0并关闭

    这必须在使用模板渲染网格之前完成。因此,如果您有更多以这种方式呈现的对象,则需要在每个对象之前执行此操作。

  3. 1为实体网格设置模板

  4. 0用于孔网的透明模板

  5. 打开深度和颜色蒙版并在模板所在的位置渲染实体网格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);

whereglCylinderxz(x,y,z,r,h)只是以-axis 作为其旋转轴(x,y,z)的半径渲染圆柱体的函数。是角步。半径分别是-大、-孔半径、- 孔中心 并且是板的厚度。rydb(2*Pi/12)rdev_rdev_Rqh

结果看起来像这样(2 个板中的每一个都用这个渲染):

例子

这种方法更适合薄物体。如果您的切割导致足够厚的侧面,那么您需要添加切割侧面渲染,否则这些部分的照明可能是错误的。

于 2016-09-13T09:04:46.547 回答