2013-03-07 25 views
6

Versuchen, zumindest die sehr einfachpart 1 of the Lighthouse3D Radar Frustum Culling tutorial zu arbeiten ... und bin absolut verblüfft, dass ich nicht einmal diesen Teil in meinem Renderer arbeiten kann."Radar Ansatz" zu Frustum Culling: Scheitern auf den ersten einfachen Test?

Also der erste Schritt ist: Sie testen, ob ein Punkt vor der nahen Ebene oder hinter der fernen Ebene ist, und früh-cull, wenn das der Fall ist. (Wenn nicht, würden Sie dann weitere Tests durchführen, aber ich stecke gerade mit diesem ersten Teil fest.)

Ich benutze das Welt-Raum-Zentrum (x1y2z3) eines 2x2 Würfels und habe eine Kamera, die ich bewegen kann und frei drehen. Alle meine Vektor- und Matrix-Sachen müssen ziemlich solide sein, da der Renderer ansonsten gut funktioniert. Also hier ist mein nehmen (in Go) dieses ersten Teils, die einfach "Z vs in der Nähe von-or-far" Test:

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 
} 

Nun, warum ich die Z ref umkehren? Weil im Tutorial geschrieben wird: "Beachten Sie, dass das Referenzelement in der Abbildung kein Rechtssystem ist (wie in OpenGL), da die Ausrichtung von Z umgekehrt wurde, um das Tutorial intuitiver zu gestalten" - nun, in einem GL-Tutorial natürlich hat das den gegenteiligen Effekt ...

Nun, wenn Z wie oben beschrieben umkehren, wird es in etwa 50% der Zeit mehr als es sollte; wenn ich es nicht tue, dann übersteuert es ungefähr 98% der Zeit.

W Was vermisse ich?

+0

Ich glaube, alle _z_ Koordinaten sollten sich ähnlich verhalten. (z. B. sollte v.z gespiegelt werden.) –

+0

Was ist 'cam.Controller.dir' - die Sichtlinie (der Vektor, entlang dem die Kamera ausgerichtet ist)? Wenn ja, möchten Sie z nicht negieren. Unter der Annahme, dass sowohl Ihre Kamera als auch Ihr Punkt in Weltkoordinaten sind (d. H. Mit allen Transformationen [z. B. Translationen, Skalen usw.), die auf sie angewendet werden), erscheint der Rest Ihrer Mathematik vernünftig, abgesehen von der Z-Negation. Durch die Umkehrung von Z wird Ihr Skalarprodukt negativ, was so aussieht, als würden fast alle Ihre Punkte gelöscht, wenn Ihre Nah- und Fernwerte positiv sind. – radical7

Antwort

1

Gelöst. Ursache war eine Fehlfunktion des Gehirns ... das Tutorial schreibt klar, dass man zuerst die x/y/z-Achsen zum Beschreiben des Kegelstumpfes bekommen soll, irgendwie habe ich das vermisst.

+0

Sie können Ihre eigene Antwort akzeptieren, um diese Frage als gelöst zu markieren :) – nemo