試圖得到至少非常簡單part 1 of the Lighthouse3D Radar Frustum Culling tutorial工作...我絕對困惑,我甚至不能讓我的渲染器中的那部分工作。Frustum Culling的「雷達方法」:首先進行簡單測試失敗?
所以第一步是:你測試一個點是在近平面的前面還是在遠平面的後面,如果是這樣的話,則是早期剔除。 (如果沒有,那麼你會進行進一步的測試,但我堅持只是與第一部分。)
我使用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
}
現在爲什麼會逆轉裁判的Z?因爲在本教程中他們寫道:「注意圖中的參考不是右手系統(如在OpenGL中),因爲Z的方向已經顛倒過來,使得教程更直觀」 - 好的,在GL教程中當然這有相反的效果......
那麼如果做倒Z如上所述,它的剔除時間應該大於它應該的50%的時間;如果我不這樣做,那麼98%的時間會「過度剔除」。
我錯過了什麼?
我相信所有_z_座標應該相似。 (例如,v.z也應該被鏡像。) – 2013-03-07 10:39:00
什麼是'cam.Controller.dir' - 視線(攝像機沿着的矢量)?如果是這樣,你不想否定z。假設你的相機和點都在世界座標中(即,對所有變換[例如,平移,縮放等]應用於它們),除了Z否定之外,其餘的數學看起來是合理的。逆向Z會使你的點積產生負面影響,看起來好像它會導致幾乎所有的點都被剔除,如果你的近值和遠值都是正值。 – radical7 2013-03-08 16:48:25