Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 23.05.2012, 08:34    Titel: OpenGL Frustum (QuadIn) | 
				     | 
			 
			
				
  | 
			 
			
				Ich habe mich einer fertigen TFrustum Klasse bedient, das ursprüngliche Original ist von "Digiben(Ben Humphrey) of gametutorials.com"
 
 
Ich hab mir die Klasse für meine Zwecke etwas abgespeckt um sie meinem Quadtree hinzuzufügen.
 
 
Mein Problem besteht darin das ich die berechnung nur schwer verstehe,
 
nach dieser Klasse kann ich prüfen ob sich ein Punkt innerhalb des Frustums befindet, oder eben nicht.
 
So kann ich eben problemlos abfragen ob sich auch ein Quad, GANZ oder auch nur ein Punkt meines Quads im Frustum befindet...
 
 
Das Problem: habe ich nun ein recht grosses Quad, das zwar innerhalb des Frustums liegt, dessen eckpunkte aber weit ausserhalb, weiss ich nicht wie ich das richtig prüfe und bräuchte hier etwas hilfe
 
 
Die entscheidene Funktion:
 
 	  | Code: | 	 		  
 
Function Frustum.QuadIn(byval x as single, byval z as single, byval sizex as single, byval sizez as single) as integer
 
    Dim as single xx,yy,zz
 
    For i as integer = 0 to 5
 
          '' E_TOP_RIGHT
 
         xx = x + sizex
 
         yy = 0 
 
         zz = z - sizez
 
         if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then         
 
               continue for
 
         end if
 
         
 
      '' E_TOP_LEFT
 
         xx = x - sizex
 
         yy = 0 
 
         zz = z - sizez
 
         if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then         
 
               continue for
 
           end if
 
 
      '' E_BOTTOM_RIGHT
 
         xx = x + sizex
 
         yy = 0 
 
         zz = z + sizez
 
         if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then         
 
               continue for
 
           end if
 
 
      '' E_BOTTOM_LEFT
 
         xx = x - sizex
 
         yy = 0 
 
         zz = z + sizez
 
         if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then         
 
               continue for
 
         end if
 
         
 
      return false
 
    next i
 
    return TRUE
 
End Function
 
 | 	  
 
 
Visuelles Beispiel (Dieses Quad würde von dieser Funktion nicht berücksichtigt)
 
  _________________
   | 
			 
		  |