2013-03-07 24 views
6

試圖得到至少非常簡單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%的時間會「過度剔除」。

我錯過了什麼?

+0

我相信所有_z_座標應該相似。 (例如,v.z也應該被鏡像。) – 2013-03-07 10:39:00

+0

什麼是'cam.Controller.dir' - 視線(攝像機沿着的矢量)?如果是這樣,你不想否定z。假設你的相機和點都在世界座標中(即,對所有變換[例如,平移,縮放等]應用於它們),除了Z否定之外,其餘的數學看起來是合理的。逆向Z會使你的點積產生負面影響,看起來好像它會導致幾乎所有的點都被剔除,如果你的近值和遠值都是正值。 – radical7 2013-03-08 16:48:25

回答

1

已解決。原因是大腦故障...教程明確寫道,首先獲取x/y/z軸來描述截錐體,不知何故,我錯過了...

+0

您可以接受您自己的答案,將此問題標記爲已解決:) – nemo 2013-10-09 22:08:57