如何使用Painter的算法获得准确的结果?


14

不久前,我问如何确定一张脸何时与另一张脸重叠。建议是使用Z缓冲区。

但是,我不能在当前项目中使用Z缓冲区,因此我想使用Painter的算法。不过,我不知道何时表面在另一个表面的后面或前面。我尝试了很多方法,但是它们都在极端情况下失败,或者即使在一般情况下也失败。

这是到目前为止我尝试过的排序方法的列表:

  • 到每个面的中点的距离
  • 到每个面的每个顶点的平均距离
  • 每个顶点的平均z值
  • 最大化每个面的顶点的z值并首先绘制这些值
  • 每个面的顶点的最低z值并绘制最后一个顶点

问题在于,人脸可能距离更近,但距离仍然更远。所有这些方法似乎都不可靠。

编辑:例如,在下面的图像中,以蓝点为中点的表面绘制在以红点为中点的表面上,因为蓝点更近。但是,这是因为红点的表面较大,而中点距离较远。带红点的表面应该涂在蓝色的表面上,因为它更近,而中点距离则相反。

在此处输入图片说明

Painter算法中究竟使用什么来确定绘制对象的顺序?


1
画家算法只是从后到前绘制。
乔纳森·康奈尔

1
@ 3nixios:是的,很明显,但是我可以通过什么方式确定“从头到尾”的顺序?
pimvdb

1
开始绘制时,所有对象,三角形或顶点都将与照相机相距一定距离。实施基本算法(您成功了吗?)将是确定每个三角形与相机的距离,并以最远的顺序绘制它们。完成后,您需要开始寻找交点并切出三角形,这是完全不同的球类游戏。为什么不能使用Z-Buffer?:P
乔纳森·康奈尔

@ 3nixios:您完全正确,但是我面临的问题是计算距离。正如我所说,我尝试了几种距离方法,但它们都不是完美的。此顺序来自中点距离排序:i.imgur.com/AcfCm.png
pimvdb

1
这样所有的多边形都在规则的网格上吗?如果是这样,您可能需要做一些特定于网格的事情来改进它。
CiscoIPPhone 2011年

Answers:


14

通常,将多边形中点到相机的距离用于z排序。画家的算法本质上不能做到100%准确。无论您使用什么参考点,总会有排序失败的情况。

如果要使用画家的算法进行正确的z排序,则必须将重叠的多边形切成较小的部分(例如,使用四叉树),然后分别对这些部分进行排序。但是,这在CPU上可能变得很沉重。

找到了可以很好地说明问题的Powerpoint文件PDF版本)。


感谢Powerpoint,它帮助我解决了问题。
pimvdb

链接断开。有人可以找到副本吗?
Keavon

1
@Keavon编辑。我找到了该文件的有效链接。
bummzack 2015年

1

在这种情况下,对我而言,它始终可以使用bsp树来工作。拆分场景,直到在bsp-tree的节点中具有凸集的多边形为止,然后可以轻松地对节点内的多边形进行排序。请注意,通过从bsp-tree节点对多边形进行排序似乎像上述问题一样,但是存在的条件不是很明显-在构造bsp-tree之后,所有有问题的情况都已得到解决-在节点中,您应该结束由必须通过凸度测试的一组多边形组成-如果您从该组中的一个多边形中选取一个平面,则其余多边形全部位于该平面的前面或后面。使用该信息可以使排序变得容易-排序函子使用2个多边形-检查哪个半空间是相对于第二个多边形的第一个多边形,并检查相对于第二个多边形的摄影机位置。

另请注意,在处理正交投影和透视投影时,确定相机放置面相对于多边形和bsp树的遍历的测试略有不同。

如果您不能承受输入多边形的分割,我认为您很不走运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.