[GELÖST]Problem mit Frustum Culling

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Skabus

Betreff: [GELÖST]Problem mit Frustum Culling

BeitragDo, Jul 08, 2010 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich versuche immernoch per OpenGL ein einfaches Frustum Culling zu implementieren...

Ich hab jetzt schon 3 Versuche implementiert die aber alle nicht funktionieren...

Hier mein Code:

BlitzMax: [AUSKLAPPEN]
		

Function PointInView:Int(point:TVector)

'local variables
Local ProjM:Float[16]
Local ModM:Float[16]
Local Clip:Float[16]

'get model and projection matrix
glGetFloatv(GL_PROJECTION_MATRIX, ProjM);
glGetFloatv(GL_MODELVIEW_MATRIX, ModM);

'extract view frustum
Clip[0] = ModM[0]*ProjM[0] + ModM[1]*ProjM[4] + ModM[2]*ProjM[8] + ModM[3]*ProjM[12]

Clip[1] = ModM[0]*ProjM[1] + ModM[1]*ProjM[5] + ModM[2]*ProjM[9] + ModM[3]*ProjM[13]

Clip[2] = ModM[0]*ProjM[2] + ModM[1]*ProjM[6] + ModM[2]*ProjM[10] + ModM[3]*ProjM[14]

Clip[3] = ModM[0]*ProjM[3] + ModM[1]*ProjM[7] + ModM[2]*ProjM[11] + ModM[3]*ProjM[15]

Clip[4] = ModM[4]*ProjM[0] + ModM[5]*ProjM[4] + ModM[6]*ProjM[8] + ModM[7]*ProjM[12]

Clip[5] = ModM[4]*ProjM[ 1] + ModM[5]*ProjM[5] + ModM[6]*ProjM[9] + ModM[7]*ProjM[13]

Clip[6] = ModM[4]*ProjM[2] + ModM[5]*ProjM[ 6] + ModM[6]*ProjM[10] + ModM[7]*ProjM[14]

Clip[7] = ModM[4]*ProjM[3] + ModM[5]*ProjM[ 7] + ModM[6]*ProjM[11] + ModM[7]*ProjM[15]

Clip[8] = ModM[8]*ProjM[0] + ModM[9]*ProjM[ 4] + ModM[10]*ProjM[ 8] + ModM[11]*ProjM[12]

Clip[9] = ModM[8]*ProjM[1] + ModM[9]*ProjM[ 5] + ModM[10]*ProjM[ 9] + ModM[11]*ProjM[13]

Clip[10] = ModM[8]*ProjM[2] + ModM[9]*ProjM[ 6] + ModM[10]*ProjM[10] + ModM[11]*ProjM[14]

Clip[11] = ModM[8]*ProjM[3] + ModM[9]*ProjM[ 7] + ModM[10]*ProjM[11] + ModM[11]*ProjM[15]

Clip[12] = ModM[12]*ProjM[0] + ModM[13]*ProjM[ 4] + ModM[14]*ProjM[ 8] + ModM[15]*ProjM[12]

Clip[13] = ModM[12]*ProjM[1] + ModM[13]*ProjM[ 5] + ModM[14]*ProjM[ 9] + ModM[15]*ProjM[13]

Clip[14] = ModM[12]*ProjM[2] + ModM[13]*ProjM[ 6] + ModM[14]*ProjM[10] + ModM[15]*ProjM[14]

Clip[15] = ModM[12]*ProjM[3] + ModM[13]*ProjM[ 7] + ModM[14]*ProjM[11] + ModM[15]*ProjM[15]


'compute all six planes

'right plane
Frustum[0,0] = clip[3] - clip[0]
Frustum[0,1] = clip[7] - clip[4]
Frustum[0,2] = clip[11] - clip[ 8]
Frustum[0,3] = clip[15] - clip[12]
NormalizePlane( 0)


'left plane
Frustum[1,0] = clip[3] + clip[0]
Frustum[1,1] = clip[7] + clip[4]
Frustum[1,2] = clip[11] + clip[8]
Frustum[1,3] = clip[15] + clip[12]
NormalizePlane(1)


'bottom plane
Frustum[2,0] = clip[3] + clip[1]
Frustum[2,1] = clip[7] + clip[5]
Frustum[2,2] = clip[11] + clip[9]
Frustum[2,3] = clip[15] + clip[13]
NormalizePlane(2)

Print "--bottom--"
Print "A: " + Frustum[2,0]
Print "B: " + Frustum[2,1]
Print "C: " + Frustum[2,2]
Print "D: " + Frustum[2,3]

'top plane
Frustum[3,0] = clip[3] - clip[1]
Frustum[3,1] = clip[7] - clip[5]
Frustum[3,2] = clip[11] - clip[9]
Frustum[3,3] = clip[15] - clip[13]
NormalizePlane(3)

'far plane
Frustum[4,0] = clip[3] - clip[ 2]
Frustum[4,1] = clip[7] - clip[ 6]
Frustum[4,2] = clip[11] - clip[10]
Frustum[4,3] = clip[15] - clip[14]
NormalizePlane(4)

'near plane
Frustum[5,0] = clip[3] + clip[2]
Frustum[5,1] = clip[7] + clip[6]
Frustum[5,2] = clip[11] + clip[10]
Frustum[5,3] = clip[15] + clip[14]
NormalizePlane(5)

'check if point is in view frustum
For Local i:Int = 0 To 5
If (Frustum[i,0]*point.x + Frustum[i,1]*point.y + Frustum[i,2]*point.z + Frustum[i,3] <= 0) Then


Return False

EndIf
Next

'otherwise point is in frustum
Return True
EndIf


Prinzip:

Modelmatrix und Projektionsmatrix holen, multiplizieren, dann einzelne Koeffizienten der multiplizierten Matrix addieren und subtrahieren um die Werte der einzelnen Planes des Frustums zu extrahieren...

Aber!Der Mist funktioniert nicht...

Hier das Ergebnis dieses TOLLEN Tutorials von DGL Wiki...btw.: ein Tut aus Lighthouse und irgendwo anders her hab ich auch schon durchgearbeitet...kA warum aber es will einfach nicht -.-

Naja hier die Werte:

Code: [AUSKLAPPEN]
--right--
A: -1.#IND0000
B: -1.#IND0000
C: -1.#IND0000
D: -1.#IND0000
--left--
A: 0.0132171409
B: 0.000000000
C: 0.000000000
D: 0.000000000
--bottom--
A: -1.#IND0000
B: -1.#IND0000
C: -1.#IND0000
D: -1.#IND0000
--top--
A: 0.000000000
B: 0.0163999144
C: 0.000000000
D: 0.000000000
--far--
A: 0.000000000
B: 0.000000000
C: 1.00000000
D: 1.00000000
--near--
A: -1.#IND0000
B: -1.#IND0000
C: -1.#IND0000
D: -1.#IND0000

-1.#IND0000



Hat jemand ne Idee was da falsch läuft?
Ich bin mal wieder völlig verzweifelt...

Der dritte Ansatz und es funzt trotzdem nicht oO

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu
  • Zuletzt bearbeitet von Skabus am Mi, Jul 14, 2010 2:03, insgesamt 2-mal bearbeitet

Goodjee

BeitragDo, Jul 08, 2010 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
das tutorial hab ich auch mal kopiert mit folgendem resultat:

BlitzMax: [AUSKLAPPEN]

Type GFrustumCuller
Field frustum:Float[6,4]

Method New()
update()
EndMethod

Method update()
Local projM:Float[16]
Local modM:Float[16]
Local clip:Float[16]
glGetFloatv(GL_PROJECTION_MATRIX, Varptr projM[0])
glGetFloatv(GL_MODELVIEW_MATRIX, Varptr modM[0]);
clip[ 0] = ModM[ 0]*ProjM[ 0] + ModM[ 1]*ProjM[ 4] + ModM[ 2]*ProjM[ 8] + ModM[ 3]*ProjM[12];
clip[ 1] = ModM[ 0]*ProjM[ 1] + ModM[ 1]*ProjM[ 5] + ModM[ 2]*ProjM[ 9] + ModM[ 3]*ProjM[13];
clip[ 2] = ModM[ 0]*ProjM[ 2] + ModM[ 1]*ProjM[ 6] + ModM[ 2]*ProjM[10] + ModM[ 3]*ProjM[14];
clip[ 3] = ModM[ 0]*ProjM[ 3] + ModM[ 1]*ProjM[ 7] + ModM[ 2]*ProjM[11] + ModM[ 3]*ProjM[15];
clip[ 4] = ModM[ 4]*ProjM[ 0] + ModM[ 5]*ProjM[ 4] + ModM[ 6]*ProjM[ 8] + ModM[ 7]*ProjM[12];
clip[ 5] = ModM[ 4]*ProjM[ 1] + ModM[ 5]*ProjM[ 5] + ModM[ 6]*ProjM[ 9] + ModM[ 7]*ProjM[13];
clip[ 6] = ModM[ 4]*ProjM[ 2] + ModM[ 5]*ProjM[ 6] + ModM[ 6]*ProjM[10] + ModM[ 7]*ProjM[14];
clip[ 7] = ModM[ 4]*ProjM[ 3] + ModM[ 5]*ProjM[ 7] + ModM[ 6]*ProjM[11] + ModM[ 7]*ProjM[15];
clip[ 8] = ModM[ 8]*ProjM[ 0] + ModM[ 9]*ProjM[ 4] + ModM[10]*ProjM[ 8] + ModM[11]*ProjM[12];
clip[ 9] = ModM[ 8]*ProjM[ 1] + ModM[ 9]*ProjM[ 5] + ModM[10]*ProjM[ 9] + ModM[11]*ProjM[13];
clip[10] = ModM[ 8]*ProjM[ 2] + ModM[ 9]*ProjM[ 6] + ModM[10]*ProjM[10] + ModM[11]*ProjM[14];
clip[11] = ModM[ 8]*ProjM[ 3] + ModM[ 9]*ProjM[ 7] + ModM[10]*ProjM[11] + ModM[11]*ProjM[15];
clip[12] = ModM[12]*ProjM[ 0] + ModM[13]*ProjM[ 4] + ModM[14]*ProjM[ 8] + ModM[15]*ProjM[12];
clip[13] = ModM[12]*ProjM[ 1] + ModM[13]*ProjM[ 5] + ModM[14]*ProjM[ 9] + ModM[15]*ProjM[13];
clip[14] = ModM[12]*ProjM[ 2] + ModM[13]*ProjM[ 6] + ModM[14]*ProjM[10] + ModM[15]*ProjM[14];
clip[15] = ModM[12]*ProjM[ 3] + ModM[13]*ProjM[ 7] + ModM[14]*ProjM[11] + ModM[15]*ProjM[15];

Frustum[0,0] = clip[ 3] - clip[ 0];
Frustum[0,1] = clip[ 7] - clip[ 4];
Frustum[0,2] = clip[11] - clip[ 8];
Frustum[0,3] = clip[15] - clip[12];
NormalizePlane(0);

Frustum[1,0] = clip[ 3] + clip[ 0];
Frustum[1,1] = clip[ 7] + clip[ 4];
Frustum[1,2] = clip[11] + clip[ 8];
Frustum[1,3] = clip[15] + clip[12];
NormalizePlane(1);

Frustum[2,0] = clip[ 3] + clip[ 1];
Frustum[2,1] = clip[ 7] + clip[ 5];
Frustum[2,2] = clip[11] + clip[ 9];
Frustum[2,3] = clip[15] + clip[13];
NormalizePlane(2);

Frustum[3,0] = clip[ 3] - clip[ 1];
Frustum[3,1] = clip[ 7] - clip[ 5];
Frustum[3,2] = clip[11] - clip[ 9];
Frustum[3,3] = clip[15] - clip[13];
NormalizePlane(3);

Frustum[4,0] = clip[ 3] - clip[ 2];
Frustum[4,1] = clip[ 7] - clip[ 6];
Frustum[4,2] = clip[11] - clip[10];
Frustum[4,3] = clip[15] - clip[14];
NormalizePlane(4);

Frustum[5,0] = clip[ 3] + clip[ 2];
Frustum[5,1] = clip[ 7] + clip[ 6];
Frustum[5,2] = clip[11] + clip[10];
Frustum[5,3] = clip[15] + clip[14];
NormalizePlane(5);
EndMethod

Method normalizePlane(pPlane:Int)
Local magnitude:Float=Sqr(frustum[pPlane,0]^2+frustum[pPlane,1]^2+frustum[pPlane,2]^2+frustum[pPlane,3]^2)
Frustum[pPlane,0]:/magnitude
Frustum[pPlane,1]:/magnitude
Frustum[pPlane,2]:/magnitude
Frustum[pPlane,3]:/magnitude
EndMethod

Method checkPoint:Int(x:Float,y:Float,z:Float)
For Local i:Int=0 To 5
If(frustum[i,0]*x+frustum[i,1]*y+frustum[i,2]*z+frustum[i,3]<=0)
Return False
EndIf
Next
Return True
EndMethod

Method checkSphere:Int(x:Float,y:Float,z:Float,r:Float)
For Local i:Int=0 To 5
If(frustum[i,0]*x+frustum[i,1]*y+frustum[i,2]*z+frustum[i,3]<-r)
Return False
EndIf
Next
Return True
EndMethod

EndType



es scheint also daran zu liegen dass du die arrays nicht als pointer übergibst
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Skabus

BeitragDo, Jul 08, 2010 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank,jetzt gibt er mir wenigstens keine krummen Werte mehr aus...

Allerdings funktioniert das Cuilling immernoch nicht....

Hast du deinen Code mal getestet ob er Punkte und dergleichen korrekt erkennt?



MfG Ska

EDIT: Seltsam ist auch, dass trotz der Kamerabewegung, also der Änderung der Matrizen meine Ergebnisse
konstant bleiben...

Kann es sein, dass das an der Art und Weise liegt wie die Matrizen geholt werden von OpenGL?
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Goodjee

BeitragDo, Jul 08, 2010 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
eher dass du sie an der falshen stelle im code holst
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Skabus

BeitragDo, Jul 08, 2010 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicher?

Ist eigtl. an der richtigen Stelle....wo soll die Zuweisung denn sonst hin? o.O


MfG LordLuparo
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Goodjee

BeitragDo, Jul 08, 2010 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ne, vllt steht irgendwo davor ein loadIdenty() im quellcode oder du stellst erst danach die kamera ein oda so was meine ich
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Skabus

BeitragDo, Jul 08, 2010 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja vielen Dank, der Tipps hats gebracht^^


Einziges Problem ist, dass bei Punkt-Abgleich einige relativ große Ungenauigkeiten entstehen...
Das muss ich wohl noch optimieren...aber ansonten gehts...


Vielen Dank^^


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Goodjee

BeitragDi, Jul 13, 2010 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
probiers mal mit double statt float, vllt gehts dann schon besser
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Skabus

BeitragMi, Jul 14, 2010 2:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, das hat scheinbar geholfen

Mittlerweile funktioniert fast alles wie es soll^^


Werd sobald alles akribisch getestet ist, nen neue Version hochladen.
Danke für die hilfe^^


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group