如何防止3D图形中的多边形重叠

时间:2015-05-09 17:58:22

标签: java swing opengl graphics 3d

我一直在使用Java中的graphics.fillPolygon()方法绘制3D图形。到目前为止,它对我来说效果很好。我可以通过在屏幕上拖动鼠标来旋转图形,然后我可以放大和缩小图形。

我的一个问题是找到一种方法以正确的顺序绘制多边形,这样背景多边形就不会在前景多边形的顶部绘制。我知道我的问题的答案是3D图形程序员的常识;有些人告诉我使用OpenGL,但这对我来说现在学得太多了;我只是想创建基本的3D图形。我正在寻找一个数学程序来按照它们应该绘制的顺序组织我的多边形(从后到前)。

我考虑过只取每个多边形的所有点的平均距离,但这是一种不可靠的方法。我一直在为我的所有方法使用三角函数,但我开始学习一些线性代数概念;向量的使用可能有助于找出哪些多边形位于前面。

2 个答案:

答案 0 :(得分:1)

@Raisintoe,在计算机科学中,二进制空间分区(BSP)是一种通过超平面将空间递归细分为凸集的方法。这种细分通过称为BSP树的树数据结构在空间内产生对象的表示。

二进制空间分区是在3D计算机图形1的上下文中开发的,其中BSP树的结构允许有关渲染中有用的场景中的对象的空间信息,,例如它们的排序从前到后相对于给定位置的观察者可以快速访问。其他应用包括在CAD中执行形状(构造实体几何)的几何操作,[3 ]机器人和三维视频游戏中的碰撞检测,光线追踪和涉及处理复杂空间场景的其他计算机应用。

请参阅Wikipedia article here

这种方法已被视频游戏巨型电子管如Quake使用。你可以在excellent article by Michael Abrash中找到更多关于它的信息,在那里他解释了他们如何在Quake中使用BSP树来确定Quake的可见表面。

我希望这有帮助

答案 1 :(得分:1)

是的我同意,OpenGL非常复杂,特别是现代的openGL迫使你使用着色器总能比你真正帮助你更多地完成任务。但openGl为您解决了这个问题。它使用深度值绘制多边形的每个像素。绘制第二个多边形时,仅当像素的深度值比旧的更接近相机时才更新像素。你也可以这样做,你将得到一个像素完美的结果。

旁注:现代游戏引擎甚至更喜欢从正面到背面进行渲染,因为无论如何,片段着色器中的昂贵像素计算都可以被跳过,无论如何都会被透支。

旁注2:实际上你必须启用深度测试并明确告诉你,你想要最接近的像素。