如何围绕y轴旋转进行深度(z)测试?

时间:2013-08-12 21:06:49

标签: java math opengl lwjgl

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

我应该怎么做呢?我需要使用单个“Z”值的最终结果进行排序。 I.E. “如果myZVal小于HisZVal而不是我更接近。”

这是我到目前为止的尝试:虽然我可以检查我的相机和四元组之间的半径长度,但它看起来很柔和,但它似乎不起作用,当我看到differant时,进一步思考会陷入困境角度。

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();
                  }
    }

1 个答案:

答案 0 :(得分:0)

通过无限小的点对四边形进行排序通常是一个坏主意。通常,四边形对于它们来说有两件事情,即屏幕上的像素(深度合适)不会:

  1. 他们有一个面对角正常

    • 如果渲染四边形,根据它们面向的方向,它们甚至可能不可见。

  2. 他们有可变区域,可以重叠范围

    • 如果它们的角度和范围使得两个四边形相交或者如果一个尺寸远大于另一个,则四边形可以被具有更远中心的其他四边形部分遮挡。
  3. 您不能使用单个点来表示四边形,就像屏幕上的像素一样。还有一些必须处理的情况,例如部分遮挡或背面四边形(在渲染的情况下)。当两个四边形相交时,您最终会进行分段评估,以确定哪个四边形在四边形上的特定点处更近。

    如果不是试图将你的四边形视为点,你就会开始将它们视为有限的平面部分,你应该得到更好的结果。使用平面法线以及范围(四边形从其原点沿每个方向跨越的距离)来建立四边形的实际空间属性,然后您可以处理所有不适用于点对点的额外情况排序。


    值得一提的是,四边形不需要共面。与三角形不同,您可以使用一组四个并非全部位于同一平面的点。这是三角形首选渲染的原因之一。假设你在同一平面上有所有4个点的四边形,那么“排序”它们的数学变得简单得多。