深度排序矩形多边形,模型轴的所有部分都面向

时间:2015-08-24 20:46:35

标签: algorithm graphics 3d

我正在处理一些渲染图形,我有一个这样的模型,我使用Java画布工具和窗口,否则独立编写。

3d-frame model

所有零件都是矩形多边形或线段。正如在此模型中发生的那样,所有多边形部分都与x,y或z平面对齐,xy原点从图片中模型的前角开始运行。 (可以通过仔细观察它们看起来如何拼接在一起来辨别侧面的矩形细分 - 但是这里没有解决这个神器的问题)

我还没有找到一种技术来获得干净的深度排序,这个技术基于最远的顶点。我尝试了一些天真的技巧,他们都有各种各样的文物。我注意到二进制空间分区和Newell的算法没有钻研,但有一种感觉,在这种情况下应该有一个更简单的方法,特别是在所有部件都是正确对齐并平行于轴的条件下。关于它的方法的任何提示赞赏

更新

我已经提出了这个可能会有所改变的想法

comparison of rectangular polygons

给定平面饰面约束,有6种可能的关系,(x-x平面),(x-y平面),(x-z平面),(y-y平面),(y-z平面)和(z-z平面)。

如果两个多边形共享同一个平面很容易排序,其他3个组合如上图所示(xy在xz上),(xy在yz上)和(xz在yz上),可能出现不同的深度顺序

我认为我的比较条件可能是这样的,给定P1 = polygon1和P2 = polygon2

if (P1 == xy_plane) return min(P1.z, P2.z)
if (P2 == xy_plane) return min(P2.z, P1.z)
if (P1 == xz_plane) return min(P1.y, P2.y)
if (P2 == xz_plane) return min(P2.y, P1.y)

P1或P2必须位于前两个平面之一,因此对于问题陈述应该足够,需要确认这种方法是否有效

UPDATE2

我在上面的想法上取得了一些进展,似乎对多边形匹配进行排序正在做一些有趣的事情,它已经部分工作了,我说它看起来很容易,但是......好吧,我希望你能想到它,并告诉我我需要做什么。

沿着上面的路线,首先与我的假设相反,同一平面上的多边形不是微不足道的,它们可以有几种不同的配置;平行且不共享另一个轴,例如在前两个轴中,或平行且在同一平面上。这有时意味着他们不关心他们排序的轴(用于成对比较),(并说明这种追求的更深层次)。

polygons on the same plane

设置一系列条件语句,不管是什么,与上面的建议一致,哪些具有蛮力的味道与广泛的系列" if-else",我想最终我发现了正确的成对多边形到多边形的比较,所以在这个概念中,如果主体或另一个更接近,可以肯定地说。

在这里模拟模型的一个方面,设法产生看起来非常有说服力的东西。整个过程总体上感觉接近锁定,但试图摆脱一些最终的错位在某种程度上挑衅,因为旧的物理trivias固定一方另一方总是被打破。

enter image description here

2 个答案:

答案 0 :(得分:6)

让我补充一些意见:

的条件
  • 所有多边形边与轴平行,
  • 多边形不相交

不足以确保多边形的全局深度排序的存在 - 正如这个三个矩形的例子所示:

depths interleaving

此对象的相对深度顺序也可以依赖于其他对象,如此2D示例中所示,其中对象A和B的深度顺序(彼此不相互隐藏)取决于对象C的位置:

enter image description here

因此,对对象进行全局深度排序似乎不是最佳选择。

答案 1 :(得分:0)

解决一般问题,即两侧通常不平行于轴,可能更容易。

找出包含2个面的平面的交线(称为L)。现在,假设面部不相交,每个面将完全位于L的一侧。

现在找到一个垂直于L的矢量V,它通过相机。可见面是与V形成较小角度的面。您可以使用一些交叉积和点积来比较角度。

你可以对平行轴的情况进行简化(发现L和V很简单)。

对于线段,使用包含该线的任意平面应该有效。

对于共面的面孔,它并不重要,因为一个人永远不会模糊另一个。

你需要特殊情况下的并行面案例。

这个算法的面数是O(N ^ 2),你需要做成对比较。如果你有很多面孔,使用深度缓冲区可能会更有效。