尝试至少获得非常简单 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% 的时间内“过度剔除”..
我错过了什么?
最佳答案
已解决。原因是脑部故障...教程清楚地写了关于首先获取 x/y/z 轴来描述平截头体,不知何故我错过了......
关于opengl - "Radar approach"到视锥体剔除 : fail at first simple test?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262048/