【问题标题】:How to prevent polygon overlap in 3D graphics如何防止 3D 图形中的多边形重叠
【发布时间】:2015-05-09 17:58:21
【问题描述】:

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

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

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

【问题讨论】:

  • 我不知道您愿意深入研究多少,但是,您可以从 BSP 树中获得很多关于您所要求的内容。

标签: java swing opengl graphics 3d


【解决方案1】:

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

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

Wikipedia article here

Quake 等大型电子游戏管已使用这种方法。您可以在 excellent article by Michael Abrash 中找到更多相关信息,他解释了他们如何在 Quake 中使用 BSP 树来确定 Quake 的可见表面。

希望对你有帮助

【讨论】:

  • 好的,我一直在阅读您发布的文章。这让我很兴奋;我知道我需要从后到前(或从前到后)对多边形进行排序,但我永远无法弄清楚如何计算哪些多边形在前面,哪些在后面。我想我现在看到了,如何使用超平面来订购我的几何图形。这个想法是通过超平面分割每个多边形,这些超平面设置在每个多边形的每个边缘上,与观察者的平面正交。对吗?
  • 和观察者的平面正交,我的意思是几何体已经是静态的,(距离缩放已经执行,所以观察者的点可以被认为是一个平面)。
  • 从那里(一旦多边形被分割),我想我可以取平均距离到新多边形的点。
【解决方案2】:

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

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

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

【讨论】:

  • 我喜欢这种方法!但是,如果只使用 Java 一次绘制一个像素,我会让处理器陷入困境,对吧?
  • 即使在java中你也可以编写一个合理的快速软件光栅化器,只要你没有太多的几何图形。但这并不是一件容易的事,尤其是因为相互接触的多边形可能不会重叠或留下间隙。如果您想使用 Java,在 3d 中尝试使用多边形的最简单方法可能是处理 (processing.org)
  • 好的,好吧,考虑到我在这个项目上的主要重点是动画颜色,(不是运动,除了在少数情况下),我认为创建可见的地图应该很好每次旋转显示器时像素一次。然后我可以重用该贴图来在动画期间更新这些像素的颜色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多