试图至少使Lighthouse3D 雷达视锥剔除教程的第 1 部分非常简单 ……而且我什至无法在我的渲染器中使该部分工作,这让我感到非常困惑。
所以第一步是:你测试一个点是在近平面前面还是在远平面后面,如果是这种情况,则进行早期剔除。(如果没有,那么您将执行进一步的测试,但我只停留在第一部分。)
我使用 2x2 立方体的世界空间中心 (x1y2z3) 并有一个可以自由移动和旋转的相机。我所有的向量和矩阵的东西都必须相当可靠,因为渲染器否则工作得很好。所以这是我对第一部分的看法(在 Go 中),简单的“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% 的时间它都会“过度剔除”。
我错过了什么?
富国沪深
相关分类