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

Depth sorting rectangular polygons, all parts of model axes facing

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

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

我还没有想出一种技术来获得干净的深度排序,这个是基于最远的顶点。我尝试了一些幼稚的技术,它们都有各种各样的人工制品。我注意到二进制 space 分区和 Newell 算法而没有深入研究,但感觉在这种情况下应该有更简单的方法,特别是在所有部分右对齐并平行于轴的情况下。任何有关它的方法的提示表示赞赏

更新

我想到了这个可能有用的想法

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

如果两个多边形共享同一平面,则很容易对它们进行排序,其他 3 种组合如上所示 (xy on xz)、(xy on yz) 和 (xz on 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必须位于前两个平面之一,所以对于问题陈述应该足够了,需要确认这种方法是否有效

更新2

我在上面的想法上取得了一些进展,看起来多边形匹配排序正在做一些有趣的事情,它一直在部分工作,我会说它看起来很简单,但是,......好吧,我希望你认为是并且可以告诉我我需要做什么。

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

无论如何设置一系列条件语句,按照上面的建议,它有一个广泛的"if-else"系列的蛮力味道,我想最终我找到了一个正确的对-明智的多边形与多边形比较,因此在这个概念中,可以肯定地说主题或另一个更接近。

在这里处理模型的单面,设法制作出看起来非常有说服力的东西。总的来说,这个过程感觉接近锁定,但试图摆脱一些最终的错位不知何故挑衅,因为固定一侧的旧物理琐事总是被打破。

解决边通常不平行于轴的一般问题可能更容易。

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

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

对于平行于轴的情况,您可以简化很多(找到 L 和 V 很简单)。

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

对于共面的人脸,没关系,因为一个人永远不会遮住另一个人。

您需要特殊处理平行面的情况。

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

让我补充一些意见:

的条件
  • 所有多边形的边都平行于一个轴并且
  • 多边形不相交

不足以确保多边形的全局深度排序的存在——从这个三个矩形的例子可以看出:

此外,两个对象的相对深度顺序可能取决于其他对象,如这个 2D 示例所示,其中对象 A 和 B 的深度顺序(未相互隐藏)取决于对象的位置对象 C:

因此,对对象进行全局深度排序似乎不是可行的方法。