我有一个开放式镶嵌球体,我想切一个圆柱孔
-
09-10-2019 - |
题
我正在制作一件软件,该软件生成多边形网格以代表球体,我想通过球体切一个孔。该多边形网格只是横跨球体表面的叠加层。我对如何确定哪个多边形将与我的孔相交,我可以从收藏中删除它们,但是在那之后,我感到有些困惑。我想知道是否有人可以帮助我提出高级概念?
基本上,我设想了三种情况:
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。
其他提示
我今年早些时候使用标量字段实施了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
-大的, dev_r
- 孔半径, dev_R
- 孔中心和 qh
是板的厚度。
结果看起来像这样(两个板中的每个板都用此绘制):
这种方法更适合薄物体。如果您的切割导致足够厚的侧面,则需要添加切割的侧面渲染,否则这些零件上的照明可能是错误的。