Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

16.01.2006, 18:25

Sichtbarkeitstest

Hi Leute!

Ich habe jetzt meiner Modellklasse einen Sichtbarkeitstest hinzugefügt. Ganz genau so, wies im Buch von David beschrieben steht, mit dem View-Frustum und so. Jetzt tretet aber beim Rendern ein Problem auf, denn manchmal wird ein Objekt zu früh weggelassen, obwohl es eigentlich noch INNERHALB des Frustums wäre. Regelmäßigkeit konnte ich leider keine feststellen, und die Berechnung der ViewFrustum-Ebenen versteh ich nicht :(
Könnte es sein, dass da ein Fehler unterlaufen ist, welcher die Ebene falsch berechnen lässt? Weil meine Boundingboxen stimmen 100%ig, ich bin bei 2 Würfeln jeden Vertex durchgegangen, und habe ihn kontrolliert! Also von da her stimmt alles. Habt ihr eine Ahnung woran das noch liegen könnte?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

16.01.2006, 18:28

Ich habe ehrlich gesagt kein Code vor mir liegen, aber was wird denn genau geprüft? Ob die beiden Punkte in dem Kegel liegen oder alle 8 Punkte?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

16.01.2006, 18:32

Alles wird so gemacht wies in Davids Buch beschrieben wird, demnach werden 2 Punkte (der der der (3x DER!) Ebene am nächsten ist, und der der der Ebene am weitesten entfernt ist) geprüft: Die Funktion dafür ist:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Testet ob ein Quader vollständig vor (return 1;),

//vollständig hinter (return -1;) einer Ebene ist, oder diese

//schneidet (return 0;)

OMEGA_API int ogUtilsClassifyBox(const og3DVector& vBoxMin, const og3DVector& vBoxMax, const ogMatrix& mTransformation, const ogPlane& Plane)
{
    //Ebene mit InvMatrix transformieren und ins Koordsys vom Quader bringen

    ogPlane TPlane = ogPlaneTransform(Plane, ogMatrixInvert(mTransformation));

    //Nächsten und fernsten Punkt berechnen

    og3DVector vNearest(vBoxMax);
    og3DVector vFarest(vBoxMin);
    if(TPlane.a > 0.0f) {vNearest.x = vBoxMin.x; vFarest.x = vBoxMax.x;}
    if(TPlane.b > 0.0f) {vNearest.y = vBoxMin.y; vFarest.y = vBoxMax.y;}
    if(TPlane.c > 0.0f) {vNearest.z = vBoxMin.z; vFarest.z = vBoxMax.z;}

    //Nächsten-Punkt einsetzten

    if(ogPlaneDotCoords(TPlane, vNearest) > 0.0f) return 1;

    //Entferntesten-Punkt einsetzten

    if(ogPlaneDotCoords(TPlane, vFarest) > 0.0f) return 0;

    //Sonst liegt er vollkommen hinter ihr!

    return -1;
}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

16.01.2006, 19:06

sry, da müsste ich mich erst reindenken, da ich mich damit noch nicht befasst habe.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

17.01.2006, 15:30

Ich bin jetzt draufgekommen, dass ab Anfang alles richtig berechnet wird, dh so lange ich die Startposition der Kamera nicht verlasse (0.0f, 0.0f, 0.0f). Danach wird alles so berechnet, als würde ich mich noch dort befinden. Ich hab außerdem probiert, obs vielleicht am Test mit dem nächsten und entferntesten Punkt liegen könnte, negativ, hat gleich getan, als ich alle 8 Punkte testen ließ. So bin ich zum Schluss gekommen, dass es an der Berechnung der ClippingPlanes liegen muss, nur versteh ich die Berechnung nicht, als dass ich einfach was dazuschreiben könnte, hier die Funktion, wenn sie mir jemand verbessern könnte, wäre ich sehr dankbar.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//Berechnet die Clippingebenen und liefert sie als Array zurück

OMEGA_API ogResult ogUtilsCalcClippingPlanes(const ogMatrix& mView, const ogMatrix& mProjection, ogPlane* pPlanes)
{
    //Array vorhanden?

    if(!pPlanes) OG_ERROR_NULL_POINTER("pPlanes", OG_ERROR);

    //Gesamtmatrix berechnen

    ogMatrix mTemp = mView * mProjection;

    // Linke Clippingebene

    pPlanes[0].a = -(mTemp.m14 + mTemp.m11);
    pPlanes[0].b = -(mTemp.m24 + mTemp.m21);
    pPlanes[0].c = -(mTemp.m34 + mTemp.m31);
    pPlanes[0].d = -(mTemp.m44 + mTemp.m41);
    pPlanes[0] = ogPlaneNormalize(pPlanes[0]);

    // Rechte Clippingebene

    pPlanes[1].a = -(mTemp.m14 - mTemp.m11);
    pPlanes[1].b = -(mTemp.m24 - mTemp.m21);
    pPlanes[1].c = -(mTemp.m34 - mTemp.m31);
    pPlanes[1].d = -(mTemp.m44 - mTemp.m41);
    pPlanes[1] = ogPlaneNormalize(pPlanes[1]);

    // Obere Clippingebene

    pPlanes[2].a = -(mTemp.m14 - mTemp.m12);
    pPlanes[2].b = -(mTemp.m24 - mTemp.m22);
    pPlanes[2].c = -(mTemp.m34 - mTemp.m32);
    pPlanes[2].d = -(mTemp.m44 - mTemp.m42);
    pPlanes[2] = ogPlaneNormalize(pPlanes[2]);

    // Untere Clippingebene

    pPlanes[3].a = -(mTemp.m14 + mTemp.m12);
    pPlanes[3].b = -(mTemp.m24 + mTemp.m22);
    pPlanes[3].c = -(mTemp.m34 + mTemp.m32);
    pPlanes[3].d = -(mTemp.m44 + mTemp.m42);
    pPlanes[3] = ogPlaneNormalize(pPlanes[3]);

    // Nahe Clippingebene

    pPlanes[4].a = -(mTemp.m14 + mTemp.m13);
    pPlanes[4].b = -(mTemp.m24 + mTemp.m23);
    pPlanes[4].c = -(mTemp.m34 + mTemp.m33);
    pPlanes[4].d = -(mTemp.m44 + mTemp.m43);
    pPlanes[4] = ogPlaneNormalize(pPlanes[4]);

    // Ferne Clippingebene

    pPlanes[5].a = -(mTemp.m14 - mTemp.m13);
    pPlanes[5].b = -(mTemp.m24 - mTemp.m23);
    pPlanes[5].c = -(mTemp.m34 - mTemp.m33);
    pPlanes[5].d = -(mTemp.m44 - mTemp.m43);
    pPlanes[5] = ogPlaneNormalize(pPlanes[5]);

    return OG_OK;
}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

6

17.01.2006, 20:54

Jetzt hab ich eine Herleitung der ClippingPlanes aus dem Internet gelesen und eine neue Funktion geschrieben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//Berechnet die Clippingebenen und liefert sie als Array zurück

OMEGA_API ogResult ogUtilsCalcClippingPlanes(const ogMatrix& mWorld, const ogMatrix& mView, const ogMatrix& mProjection, ogPlane* pPlanes)
{
    //Array vorhanden?

    if(!pPlanes) OG_ERROR_NULL_POINTER("pPlanes", OG_ERROR);

    //Gesamtmatrix berechnen

    ogMatrix mTemp = mWorld * mView * mProjection;

    //Left clipping plane

    pPlanes[0].a = -(mTemp.m14 - mTemp.m11);
    pPlanes[0].b = -(mTemp.m24 - mTemp.m21);
    pPlanes[0].c = -(mTemp.m34 - mTemp.m31);
    pPlanes[0].d = -(mTemp.m44 - mTemp.m41);
    //Right clipping plane

    pPlanes[1].a = -(mTemp.m14 + mTemp.m11);
    pPlanes[1].b = -(mTemp.m24 + mTemp.m21);
    pPlanes[1].c = -(mTemp.m34 + mTemp.m31);
    pPlanes[1].d = -(mTemp.m44 + mTemp.m41);
    //Top clipping plane

    pPlanes[2].a = -(mTemp.m14 + mTemp.m12);
    pPlanes[2].b = -(mTemp.m24 + mTemp.m22);
    pPlanes[2].c = -(mTemp.m34 + mTemp.m32);
    pPlanes[2].d = -(mTemp.m44 + mTemp.m42);
    //Bottom clipping plane

    pPlanes[3].a = -(mTemp.m14 - mTemp.m12);
    pPlanes[3].b = -(mTemp.m24 - mTemp.m22);
    pPlanes[3].c = -(mTemp.m34 - mTemp.m32);
    pPlanes[3].d = -(mTemp.m44 - mTemp.m42);
    //Near clipping plane

    pPlanes[4].a = -(mTemp.m13);
    pPlanes[4].b = -(mTemp.m23);
    pPlanes[4].c = -(mTemp.m33);
    pPlanes[4].d = -(mTemp.m43);
    //Far clipping plane

    pPlanes[5].a = -(mTemp.m14 + mTemp.m13);
    pPlanes[5].b = -(mTemp.m24 + mTemp.m23);
    pPlanes[5].c = -(mTemp.m34 + mTemp.m33);
    pPlanes[5].d = -(mTemp.m44 + mTemp.m43);
    
    //Normalisieren der Ebenen

    for(int i = 0; i < 6; i++) ogPlaneNormalize(pPlanes[i]);

    return OG_OK;
}


Leider immer noch das selbe Problem wie vorher :(
Hat wirklich keiner eine Idee wieso das schief läuft??
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

17.01.2006, 21:41

Schonmal Versucht die Ebenen erst in das Kamera Koord system zu transformieren?

P.S: obwohl, die welt matrix ist ja schon drinne...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

8

17.01.2006, 21:55

Habs grad probiert, hilft leider auch nichts, immernoch das gleiche Prob... Habs auch mit der invertierten ViewMatrix probiert, auch nix... Das gibts ja nicht, das das nicht funktioniert! Wieso sollte eine solche Berechnung die Kameraposition missachten??
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

9

19.01.2006, 15:01

So! Hab das Problem endlich gelöst!

Lösung: Man darf die ClippingEbenen nicht mehr mit der Invertierten Weltmatrix transformieren, weil diese ja bei der Berechnung selber schon berücksichtigt wurde!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige