0

我正在尝试通过相机的深度(Z)对一些四边形进行排序,但是当相机改变它的方向(Y 轴 - 左右)和位置时(相机基本上像 DOOM 一样处理 - 这是一个没有旋转的 FPS X 轴(上下))

我该怎么做呢?我需要一个“Z”值的最终结果来进行排序。IE “如果 myZVal 小于 HisZVal 比我更接近。”

这是我迄今为止的尝试:虽然我可以检查我的相机和四边形之间的半径长度并且通过它来软化,但它似乎没有工作,并且当我看不同的角度时进一步思考会搞砸。

public static Vector<Quad> SortByZ(Vector<Quad> vec, Vector3f pos, Vector3f forward){
        Vector<Quad> sorted = new Vector<Quad>();

        for(int i = 0; i < vec.size(); i++){
            Quad e = vec.get(i);
            e.myDepth = new Vector3f(0,0,0);




            Vector3f ray = new Vector3f(0,0,0);
            Vector3f.sub(pos, e.center, ray);
            e.myDepth.z = ray.lengthSquared();
                  }
    }
4

1 回答 1

0

按无限小的点对四边形进行排序通常是个坏主意。通常,四边形有两件事情要做,而屏幕上的像素(在深度合适的地方)没有:

  1. 他们有一个面角正常

    • 如果渲染四边形,它们甚至可能不可见,具体取决于它们面向的方向。

  2. 它们具有可变面积并且可以重叠范围

    • 如果四边形的角度和范围使得两个四边形相交或者如果一个四边形比另一个大得多,则四边形可以被具有更远中心的其他四边形部分遮挡。

您不能像在屏幕上使用像素一样使用单个点来表示四边形。您必须处理其他情况,例如部分遮挡或背面四边形(在渲染的情况下)。当两个四边形相交时,您最终会进行分段评估,以确定哪个四边形在四边形上的特定点更接近。

如果不尝试将四边形视为点,而是开始将它们视为平面的有限部分,您应该会得到更好的结果。使用平面法线和范围(四边形在每个方向上与其原点的距离)来确定四边形的实际空间属性,然后您可以处理不适用于点与点的所有额外情况排序。


还值得一提的是,四边形不需要共面。与三角形不同,您可以得到一组并不都位于同一平面上的四个点。这就是为什么首选三角形进行渲染的原因之一。假设您的四边形的所有 4 个点都在同一个平面上,那么“排序”它们的数学就会变得简单得多。

于 2013-08-13T18:27:52.907 回答