试图获得至少非常简单的第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轴来描述截锥体,不知怎么的,我错过了…