试图至少使非常简单的 part 1 of the Lighthouse3D Radar Frustum Culling tutorial能够正常工作...,并且感到困惑,我什至无法在我的渲染器中使该部分正常工作。

因此,第一步是:测试一个点是在近平面的前面还是远平面的后面,如果是,则选择早点。 (如果没有,那么您将执行进一步的测试,但我只停留在第一部分。)

我使用2x2多维数据集的世界空间中心(x1y2z3),并有一个可以自由移动和旋转的相机。我所有的矢量和矩阵素材都必须相当坚固,否则渲染器将无法正常工作。因此,这是我对第一部分的看法(在Go中),即简单的“Z与近或远”测试:

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轴来描述视锥的方法,但我却以某种方式错过了这一点。

10-04 17:23