如何确定等轴测视图Flash游戏中的绘制顺序?


12

这是用于Flash游戏的等轴测视图。我需要知道如何对对象进行排序,以便在绘制时无需进行z缓冲区检查。这似乎很容易,但是还有一个限制,一个场景可以有10,000+个对象,因此算法需要以小于O(n ^ 2)的速度运行。所有对象都是矩形框,场景中移动了3-4个对象。最好的方法是什么?

更新

在每个图块中只有一个对象(我的意思是对象不能彼此堆叠)。并且我们访问的对象图和对象图都有自己的位置。

更新2

看到这些数字:

在此处输入图片说明 在此处输入图片说明

首先应先绘制蓝色对象,然后绘制绿色,然后绘制红色。而在第二个中,您必须以相反的顺序绘制它们。您需要先绘制红色,然后绘制绿色,最后绘制蓝色的对象。如您所见,蓝色和红色物体的位置没有差异,它们与相机的距离都不同,依此类推。但是由于它们相对于绿色框的相对位置,您需要在两个图像之间更改其绘制顺序。这就是使这个问题变得一团糟的原因。

旁注:由于所有对象都是直角棱镜,因此在数学上可以证明至少有一个绘制顺序可以满足问题的需要。


2
您应该发布更多信息。对象可以堆叠(3d)吗?对象有位置还是地图有对象?等
kaoD 2012年


@Tetrad是的,但是我们放在场景中的对象之间几乎没有什么区别。
Ali1S232'3

@Gajet(更新后)对象只能是1 * X和X * 1,也可以是X * Y?您能承受将对象分成几个子对象吗?(例如,绿色是4个子绿色对象)对象的方向是否固定?
kaoD 2012年

另外:对象的高度会遮挡多少个相邻的图块?
kaoD 2012年

Answers:


8

如果您的对象与等距图块匹配,这实际上非常简单。看一下这张图片:

等轴测图顺序

您应该首先在红色位置绘制对象,然后在蓝色,绿色,黄色,洋红色等对象上绘制对象,依此类推...如果板上有对象而不是对象,则如何实现此目的应该很明显将位置作为属性。如果不是这种情况,则应保留一个单独的数据结构,并在对象移动时对其进行更新(这也应该很容易)。

这有一个新问题:您可以轻松地看到它的复杂度现在是O(N),其中N是您的电路板尺寸(N=W*H)。要解决此问题,只需创建一个新的线性数据结构,其中结构中的每个索引都与给定深度匹配,并在对象更改深度时对其进行更新。

对象与单个图块不匹配的情况要难一些,因此如果您在更新问题时需要它,我将把它发布。


该算法也是我想到的第一个算法,但是请参阅我的更新,这就是为什么您不能不做任何更改就使用它的原因。
Ali1S232'3

1
@Gajet,这是您必须首先在问题中发布的内容:P
kaoD 2012年

3
这是走了,分手的大部件在“砖” +1的方式
Valmond

2

我对此主题没有特别的知识,但这是一个想法。

首先将每个单元格标记为“未绘制”。(或者,等效地,使用数组表示单元格的每个“近线”或一组单元上最接近的“绘制”事物的位置。)然后,对于每个单元格(我可能会遍历它们描述的顺序):检查是否已绘制该单元格;如果尚未绘制并包含对象,请检查是否已绘制了该对象遮盖的每个单元格,如果不是,则以递归方式绘制它;如有必要,绘制该单元格包含的对象;并将该单元格及其对象占用的所有单元格标记为“绘制”。

我假设您可以快速将单元格映射到其中的对象(如果有)。我相信这是O(n)时间,尽管它最终可能会建立一个大堆栈(如果您担心堆栈空间用完,则可能希望将其变成一个链表)。

如果您确实需要一个列表,则可以将其附加到列表中而不是绘图。我怀疑从排序最多的列表开始并没有帮助。


我认为该算法可以看作是适应该问题的一种拓扑排序形式。我本人正要模糊地指向这个方向。拓扑排序是大多数排序/依赖性问题的解决方案。
凯文·里德

1

我会使用画家的算法,并在距相机最远的单元格距离出租车的距离处,先绘制最靠近相机的像素,然后再向外移动。

编辑:除非您可以分别绘制每个单元格的内容,否则此方法不起作用。


这可能有效,但我无法确定它与byte56或kaoD建议的算法有何不同。在我看来,它仍然有与我的第二次编辑中所述相同的问题。
Ali1S232'3

1

是什么使您认为“从数学上证明至少有一个抽签顺序可以满足问题需求”?这是一个琐碎的反例,其中您不能依赖z排序对象:

在此处输入图片说明


出于好奇...您能否详细说明反例?那不是网格。
kaoD 2012年

请注意,每个图块上只有一个对象,并且对象可能会占据一个或多个图块,但它们在平面上始终具有矩形投影。这两个条件足以证明该陈述。
Ali1S232'3

好的,有了这些限制以及网格平坦的事实,就可以找到解决方案。我会在以后发布。
sam hocevar
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.