Java 如何防止三维图形中的多边形重叠

Java 如何防止三维图形中的多边形重叠,java,swing,opengl,graphics,3d,Java,Swing,Opengl,Graphics,3d,我一直在使用Java中的graphics.fillPolygon()方法绘制3D图形。到目前为止,它对我很有效。我可以通过在屏幕上拖动鼠标来旋转图形,并且可以放大和缩小图形 不过,我的一个问题是找到一种方法,以正确的顺序绘制多边形,这样背景多边形就不会绘制在前景多边形的顶部。我知道我的问题的答案是3D图形程序员的常识;有些人告诉我要使用OpenGL,但这对我来说太多了,我现在无法学习;我只想创建基本的3D图形。我正在寻找一个数学程序来组织我的多边形的顺序,他们应该画,(从后面到前面) 我曾考虑过

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

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


我曾考虑过只计算每个多边形所有点的平均距离,但这是一种不可靠的方法。我所有的方法都使用了三角学,但我开始学习一些线性代数的概念;向量的使用可能有助于找到前面的多边形。

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

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

这种方法已经被诸如《地震》这样的视频游戏所采用。你们可以在这里找到更多关于它的信息,他解释了他们如何在Quake中使用BSP树来确定Quake的可见表面


我希望这会有所帮助

是的,我同意,OpenGL非常复杂,尤其是现代OpenGL,它迫使您使用着色器,这样做总是比实际帮助您得到更多。但是openGl为您解决了这个问题。它使用多边形的深度值绘制多边形的每个像素。绘制第二个多边形时,仅当像素的深度值比旧多边形更接近摄影机时,像素才会更新。你也可以这样做,你会有一个像素完美的结果

旁注:现代游戏引擎甚至更喜欢从前到后渲染,因为这样一来,对于无论如何都会被过度渲染的像素,可以跳过片段着色器中昂贵的像素计算


旁注2:实际上,您必须启用深度测试,并明确告知您需要最接近的像素

我不知道你有多愿意深入这一点,但是,你可以从BSP树中得到很多关于你要求的东西。我喜欢这种方法!但是,通过只使用Java一次绘制一个像素,我将使处理器陷入困境,对吗?即使在Java中,只要没有太多的几何图形,您也可以编写一个合理快速的软件光栅化器。但这不是一件容易的事,尤其是因为相互接触的多边形可能不会重叠或留下间隙。如果你想使用Java,在3d中尝试多边形最简单的方法可能是processing(processing.org)好吧,同时考虑到我在这个项目上的主要重点是制作颜色动画(不是运动,除了少数情况),我认为在每次旋转显示时创建一个可见像素的贴图应该非常有效。然后,我可以在动画期间重用该贴图来更新这些像素的颜色。好的,我一直在阅读您发布的文章。这对我来说是令人兴奋的;我知道我需要从后到前(或从前到后)排列多边形,但我永远无法计算出哪些多边形在前面,哪些在后面。我想我现在看到了,如何使用超平面来排列我的几何体。其思想是用超平面分割每个多边形,这些超平面设置在每个多边形的每一条边上,与观察者的平面正交。这是正确的吗?通过与观察者的平面正交,我的意思是几何体已经是静态的(距离缩放已经执行,因此观察者的点可以被视为一个平面)。从那里(一旦多边形被分割),我想我可以取到新多边形点的平均距离。