【发布时间】:2011-09-20 18:41:16
【问题描述】:
我有一组点,每个点都有一个“影响”区域或基本上是一个半径。我希望能够将所有点的这些影响圆中的每一个都绘制为一条简单的圆形线。
它们会重叠,但我希望绘制所形成形状的外部。我知道这可能需要我找出它们相交的地方,并以某种方式形成一个完整的形状来绘制。问题是有些点甚至可能不会触及其他点!所以我也需要能够解决这个问题。
我试图简单地说明我的意思:
请注意,我只想画黑线,没有填充。这是因为我希望背景图像和其他几何图形能够显示出来。
我将在 openGL 中执行此操作,因此可能会使用 GL_LINES 或其他类似的方法制作圆,其中各种顶点形成曲线,但我真的不知道如何计算出这个周长。
如果有人有任何建议或可以指出我如何解决这个问题,将不胜感激!
这可能更像是一个数学问题,我不是在寻找代码,而是实际上如何计算这些形状。我就是想不出怎么做!
*****编辑:我想出的解决方案,希望可以帮助别人!
所以我使用了建议的想法,基本上决定最好的方法是使用模板缓冲区进行绘制。现在这意味着我循环了我的点 3 次,但我需要对它们进行一些仔细的排序,以找到仅可见的点。
所以代码明智我现在有这个:
private void stencilCircleAroundStars()
{
//Lets try and draw something here using stencil
glColorMask(false, false, false, false); //Disable colour mask
glEnable(GL_STENCIL_TEST); // Enable Stencil Buffer For "marking" the outer circle
glDisable(GL_DEPTH_TEST);// Disable Depth Testing
for (Object value : stars.values())
{
Star star = (Star)value;
glStencilFunc(GL_ALWAYS, 1, 1); // Always Passes, 1 Bit Plane, 1 As Mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 1 Where We Draw Any Polygon
//Draw the large circle
starOb.location.copy(star.location);
starOb.setScale(2000);
starOb.draw();
}
for (Object value : stars.values())
{
Star star = (Star)value;
//Now we change the functions and remove a slightly smaller circle from buffer.
glStencilFunc(GL_ALWAYS, 0, 0); // Always passes, 0 bit plane, 0 as mask;
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 0 Where We Draw Any Polygon
starOb.location.copy(star.location);
starOb.setScale(1900);
starOb.draw();
}
//Now we enable the colour
glColorMask(true, true, true, true);
glStencilFunc(GL_EQUAL, 1, 1); // We Draw Only Where The Stencil Is 1
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // Don't Change The Stencil Buffer
glColor4f(0.5f, 1.0f, 0.5f, 0.5f);
for (Object value : stars.values())
{
Star star = (Star)value;
starOb.location.copy(star.location);
starOb.setScale(2000);
starOb.draw();
}
//Now we are done .. disable
glDisable(GL_STENCIL_TEST);
}
对于我的程序而言,我的观点本质上是称为“星”的实体,而 StarOb 是我从文件中加载的四边形集合,它们形成了一个漂亮的平滑圆。
我禁用颜色蒙版并循环一次,将最大的圆圈绘制到模板缓冲区中并将值设置为 1。然后我再次循环将较小的缩放圆圈绘制到模板缓冲区中,但这次设置了一个值0。这应该在任何不接触其他星星的星星周围留下一个边框,并将有效地去除它们重叠的地方。
我终于重新启用了颜色蒙版并实际绘制了彩色圆圈。模板缓冲区阻止内部被渲染,我得到了我想要的!然后我禁用模板缓冲区。
如果你真的想看,这里有一个产生几个越来越多的点的视频:Video of it running
这是它的低质量版本(测试时未绘制背景):
【问题讨论】:
标签: opengl geometry intersection