Graphics 如何使用painters算法对这些线进行排序?

Graphics 如何使用painters算法对这些线进行排序?,graphics,3d,Graphics,3d,假设我得到了以下图表,并且位于eye1 使用painters算法,我们从后向前绘制。因此,如果我必须使用painters算法(例如,从第一次绘制到最后一次)对以下线条进行排序,我会认为它是C、A、e、D、B。让我们绊倒的是线条D和B的表面法线。因为B的法线背对眼睛1,而D的法线不是,这是否意味着我们在D之前绘制B? 谢谢大家 如果背面剔除是相关的(即已知曲面是闭合的),则根本不绘制B 否则法线的方向将不起作用。正如@Yves Daoust所指出的,如果启用背面消隐,您可能会放弃“B”,但是,鉴

假设我得到了以下图表,并且位于eye1

使用painters算法,我们从后向前绘制。因此,如果我必须使用painters算法(例如,从第一次绘制到最后一次)对以下线条进行排序,我会认为它是C、A、e、D、B。让我们绊倒的是线条D和B的表面法线。因为B的法线背对眼睛1,而D的法线不是,这是否意味着我们在D之前绘制B?

谢谢大家

如果背面剔除是相关的(即已知曲面是闭合的),则根本不绘制B


否则法线的方向将不起作用。

正如@Yves Daoust所指出的,如果启用背面消隐,您可能会放弃“B”,但是,鉴于您的示例没有闭合几何体,我们将假定它将被绘制

旁白:顺便问一句,你知道SE上有一个网站可以解答这类问题吗

我研究这个已经有几十年了,但是如果你打算用它来为画家排序,那么你将从一个初始的对象列表开始,按最大深度排序,从“最远到最近”,即[C,a,e,D,B],但是这个列表需要重新排序

Newell、Newell和Sancha实际上是两个嵌套循环,用于修改列表。它首先将外循环中的“P”设置为列表中最远的项,然后在内循环中通过每个较近的对象执行步骤Q,以确保“P不会遮挡Q”。它还维护每个对象的“已移动”标志,以处理棘手的情况

“p不模糊Q”测试由一组逐渐昂贵的子测试组成:

  • 如果P&Q在Z中完全不重叠,P不会模糊Q。(注意,由于列表应该排序,所以您不必测试后面的对象)
  • 在屏幕空间X和Y上进行边界框测试。如果没有重叠,P不能掩盖Q
  • P对Q的平面测试(这就是法线的来源)。如果P的所有顶点都位于Q平面的后面,它就不能模糊。基本上,这是一组点积计算
  • 同样,如果Q的所有顶点都位于P平面的前面,它就不能模糊
  • 做一个完整的P vs Q,屏幕X Y重叠测试。这是有点贵,但如果你知道有共享的边缘等,你可以采取一些捷径。否则,可能需要使用分离平面/直线算法。如果没有重叠,P就不能掩盖Q
  • 如果p没有模糊(所有)Qs,那么您可以绘制p并移动到下一个最远的位置,然后重新启动流程

    如果,OTOH,p确实模糊了Q,则需要将其移动到列表中Q之后。您还可以标记它已被移动。您可以从(新的)“最远”项重新开始

    在您的示例中,D&B最终将被交换


    更复杂的是,如果你发现你要移动一个已经移动过的对象,那么你有一个循环,你需要细分一个对象(使用其中一个涉及的三角形平面-类似于构建BSP时产生的平面),但这是另一个主题。

    不完全确定你的意思“法线的方向”,但如果您使用Newell、Newell和Sancha的方法来执行Painter算法的排序,那么法线确实起到了作用,因为您需要知道三角形/曲面的平面。这些构成了“P不模糊Q”(对于多边形P&Q)的一部分在NNS算法中进行测试。@SimonF:OP的问题是关于面对面的一面。孤立的面对这两个面都是不透明的。