尝试至少让非常简单 part 1 of the Lighthouse3D Radar Frustum Culling tutorial正常工作......我绝对感到困惑的是,我甚至无法在渲染器中使用该部分。
所以第一步是:你测试一个点是在近平面前面还是在远平面后面,如果是这样的话就进行早期剔除。 (如果不是,那么你会进行进一步的测试,但我只是坚持第一部分。)
我使用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%的时间都会“过度剔除”..
我错过了什么?
答案 0 :(得分:1)
解决。原因是大脑出现故障......教程清楚地写了关于首先用x / y / z轴来描述截头锥,不知何故我错过了..