这是一个闪光灯游戏,具有等距视图。我需要知道如何排序对象,以便在绘图时不需要z缓冲区检查。这似乎很容易,但是还有另一个限制,场景可以有10,000+对象,所以算法需要在小于O(n^2)的范围内运行。所有的物体都是矩形盒子,场景中有3-4个物体在移动.做这件事最好的方法是什么?
在每个瓷砖中,只有对象(我的意思是对象不能相互叠加)。我们访问的对象和对象都有自己的位置。
见以下数字:
首先要画一个蓝色的物体,然后是绿色,然后是红色。在第二种情况下,你必须以相反的顺序画出它们。你需要先画红色,然后画绿色,最后画蓝色物体。正如你所看到的,蓝色和红色物体的位置没有差别,它们与摄像机的距离不同等等。但是,由于它们相对于绿色框的位置,您需要在两个图像之间更改它们的绘制顺序。这就是让这个问题变得一团糟的原因。
边注:由于所有的物体都是矩形棱镜,因此数学证明至少有一个抽签顺序可以满足问题的需要。
发布于 2012-03-21 17:21:01
我对这个问题没有特别的了解,但我有一个想法。
首先,将每个单元格标记为“未绘制”。(或者,等效地,使用数组来表示每个单元格“近-远”线上最接近的“绘制”物的位置,或一组等等)然后,对于每个单元格(我可能会按照kaoD描述的顺序检查它们):检查该单元格是否已绘制;如果未绘制并包含对象,则检查将被该对象遮挡的每个单元格是否已绘制,如果不递归绘制,则检查是否绘制该单元格所包含的对象;如果有必要,将该单元格和其对象占用的任何单元格标记为“绘制”。
我假设您可以快速地将一个单元格映射到其中的对象(如果有的话)。我相信这是O(n)时间,尽管它最终可能会构建一个大堆栈(如果您担心堆栈空间不足,您可能希望将它变成一个链接列表)。
如果你真的需要一个列表,你可以附加到一个列表,而不是绘图。我怀疑从一份排序最多的名单开始是没有用的。
发布于 2012-03-21 21:48:42
我会使用画家算法,出租车距离离相机最远的单元,先画离摄像机最近的,然后向外移动。
编辑:除非您可以单独绘制每个单元格的内容,否则这是行不通的。
发布于 2012-03-22 16:42:17
是什么让你相信这是“数学证明,至少有一个抽签命令,以满足问题的需要”?下面是一个不能依赖z排序对象的简单反例:
https://gamedev.stackexchange.com/questions/25982
复制相似问题