6

尝试至少让Lighthouse3D 雷达截锥体剔除教程的非常简单 的第 1 部分工作......并且我什至无法在我的渲染器中使该部分工作,这让我感到非常困惑。

所以第一步是:你测试一个点是在近平面前面还是在远平面后面,如果是这样,就提前剔除。(如果没有,您将执行进一步的测试,但我只停留在第一部分。)

我使用 2x2 立方体的世界空间中心 (x1y2z3) 并有一个可以自由移动和旋转的相机。我所有的向量和矩阵的东西都必须相当坚固,否则渲染器工作得很好。所以这是我对第一部分的看法(在 Go 中),简单的“Z vs near-or-far”测试:

func (cam *Camera) frustumHasPoint(point *Vec3) bool {
    var pc Vec3
    v := point.Sub(&cam.Controller.Pos)  // point minus camPos
    ref := cam.Controller.dir  // take a copy of camDir
    ref.Z = -ref.Z
    ref.Normalize() // camDir was already normalized but anyway...
    pc.Z = v.Dot(&ref)
    if pc.Z > cam.Perspective.ZFar || pc.Z < cam.Perspective.ZNear {
        return false
    }
    return true
}

现在为什么我要反转 ref 的 Z?因为在教程中他们写道:“请注意,图中的引用不是右手系统(如在 OpenGL 中),因为 Z 的方向已反转以使教程更直观”——嗯,在 GL 教程中当然,这会产生相反的效果......

好吧,如果像上面那样反转 Z,它会在大约 50% 的时间里剔除更多;如果我不这样做,那么它大约有 98% 的时间会“过度剔除”..

我错过了什么?

4

1 回答 1

1

解决。原因是大脑故障......教程清楚地写了关于首先获取 x/y/z 轴来描述截锥体,不知何故我错过了..

于 2013-03-09T02:02:39.790 回答