"Radar approach" 视锥剔除:在第一次简单的测试中失败?



试图获得至少非常简单的第1部分的灯塔3d雷达截锥体剔除教程的工作…我非常困惑,我甚至不能使这部分在我的渲染器中工作。

所以第一步是:你测试一个点是在近平面的前面还是在远平面的后面,如果是这种情况,那么就进行早期剔除。(如果没有,您可以执行进一步的测试,但我只能执行第一部分。)

我使用2x2立方体的世界空间中心(x1y2z3),并拥有一个可以自由移动和旋转的相机。我所有的矢量和矩阵的东西必须是相当坚实的,否则渲染器工作得很好。以下是我对第一部分的理解,即简单的"Z vs近或远"测试:

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%的情况下"过度剔除"。

我错过了什么?

已解析。原因是大脑功能失常…教程清楚地写了关于首先获得x/y/z轴来描述截锥体,不知怎么的,我错过了…

最新更新