【问题标题】:Depth sorting rectangular polygons, all parts of model axes facing深度排序矩形多边形,模型轴的所有部分朝向
【发布时间】:2015-08-24 20:46:35
【问题描述】:

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

所有部分都是矩形多边形或线段。正如在这个模型中发生的那样,所有多边形部分都与 x、y 或 z 平面对齐,xy 原点从图片中模型的前角延伸。 (可以通过仔细观察它们如何拼凑在一起来辨别边的矩形细分 - 但是这里没有解决这个伪影)

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

更新

我想出了这个想法,可能会有用处

给定平面约束,有 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”,我想最终我找到了一个正确的成对多边形到多边形比较,因此在这个概念中,可以肯定地说主体或另一个是否更接近。

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

【问题讨论】:

  • 您是要相对于相机方向还是仅三个轴之一进行排序?
  • 考虑 3 个三角形,每个三角形的顶角都高于另一个三角形的宽部分。易于可视化,但只有深度缓冲区才能将其分类:) 也就是说,对于您的受限情况可能只有一个解决方案。
  • 我想相对于相机,如上图所示,我使用的是焦点 A,通常是原点,以及一个可移动的相机,矢量 C。我在想,但没有t 得出了一种方法,如果相机位于 8 个 xyz 八分圆中,则平面将优先沿 +ive 或 -ive 轴中的每一个轴,对这些轴中的任何一个进行排序通常会给出合理的结果,但并不完全干净,到目前为止
  • 您对深度排序有何期望?你想要一个(排序的)你的对象列表。每个对象都没有被以前的对象隐藏?那么第一个问题是:在你的情况下这在理论上是可能的吗? (见 Jongware 的评论)下一个问题是:全局排序可以在本地决定吗? (即:给定两个对象:你能独立于其他对象来决定它们的关系吗?)如果两个答案都是“是”,那么你需要一个简单的规则/算法来决定两个对象的关系,对吧?
  • @coproc 嗯,是的,我正在寻找一个清晰的视觉排序,我想从某些给定的角度来看,一个明确的交互排序是理想的。如果我理解 Jongware,在我的情况下没有三个多边形是交错的并且无法排序,我认为这个假设适用于所有元素,是否可以定义一个明确的总排序,我不知道,如果你可以证明它不是肯定值得的......

标签: algorithm graphics 3d


【解决方案1】:

让我补充一些意见:

条件

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

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

此外,两个对象的相对深度顺序可以取决于其他对象,如在这个 2D 示例中可以看到的,其中不相互隐藏的对象 A 和 B 的深度顺序取决于对象 C 的位置:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    对于共面的面,这并不重要,因为一个永远不会遮挡另一个。

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2010-10-11
      • 2015-01-09
      • 1970-01-01
      • 2014-12-20
      • 2013-02-24
      • 1970-01-01
      • 2014-09-22
      • 2011-05-18
      相关资源
      最近更新 更多