试图至少使非常简单的 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轴来描述视锥的方法,但我却以某种方式错过了这一点。