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

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

11

17.08.2012, 19:59

Zitat

Ich will ja eigentlich mit der Model Matrix arbeiten, kein View ^^
Meine Frustums liegen im Projection*ModelView Space.
Nun ja... wie genau berechnest du die denn?

Die Rotationsmatrix sieht ansonsten richtig aus.
Nein, es können sich alle Ecken der Box außerhalb des Frustum befinden und die Box trotzdem sichtbar sein. Trivialbeispiel: Box größer als Frustum...
Dann liegen doch aber niemals alle Punkte der Box vor bzw hinter einer der Frustum-Planes.
Die Kanten muss man nicht beachten. Sobald alle Punkte der Box vor einer der Frustum-Planes liegen (unter der Bedingung, dass diese alle nach außen zeigen), dann weißt du, dass das Objekt nicht sichtbar ist. Andernfalls ist es sichtbar. Dein Weg, die Box zu transformieren, ist also schon richtig.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

17.08.2012, 19:59

Ich will ja eigentlich mit der Model Matrix arbeiten, kein View ^^
Meine Frustums liegen im Projection*ModelView Space.

Dann musst du aber auch deine Eckpunkte in den Space bringen...

Nein, es können sich alle Ecken der Box außerhalb des Frustum befinden und die Box trotzdem sichtbar sein. Trivialbeispiel: Box größer als Frustum...
Dann liegen doch aber niemals alle Punkte der Box vor bzw hinter einer der Frustum-Planes.
Die Kanten muss man nicht beachten. Sobald alle Punkte der Box vor einer der Frustum-Planes liegen (unter der Bedingung, dass diese alle nach außen zeigen), dann weißt du, dass das Objekt nicht sichtbar ist. Andernfalls ist es sichtbar. Dein Weg, die Box zu transformieren, ist also schon richtig.

Ok, wenn das für deine Anwendung genau genug ist, dann ja...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (17.08.2012, 20:09)


Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

13

17.08.2012, 20:07

Ok, wenn das für deine Anwendung genau genug ist, dann ja...
Na ja für irgendwelche einfachen Hobbyprojekte...^^

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

14

17.08.2012, 20:10

Letzter Beitrag wegen Frustum Planes editiert.

Zitat

Dann musst du aber auch deine Eckpunkte in den Space bringen...


Also quasi folgendes:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
    mat4 p, m, final;

    p.setIdentity();
    p.perspective(45.0f, 800.0f/500.0f, 0.1f, 100.0f);

    m.setIdentity();
    m.lookAt(5, 5, 5,
             0, 0, 0,
             0, 0, 1);
    m.rotate(90, 1, 0, 0);

    final = p*m;



(Link)


Wenn wir davon ausgehen das die Kamera bei 5|5|5 ist und auf 0|0|0 schaut?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

17.08.2012, 20:11

Btw, ich möchts nur mal in die Runde werfen: http://crazyjoke.free.fr/doc/3D/plane%20extraction.pdf
Du kannst nämlich auch z.B. die Worldspace Koeffizienten der Frustum Planes einfach direkt aus der ViewProjection Matrix ablesen und so...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

16

17.08.2012, 20:16

Das tue ich schon lange:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    void getLeft(mat4 &pm){
        n.x = pm[3]+pm[0];
        n.y = pm[7]+pm[4];
        n.z = pm[11]+pm[8];
        d = pm[15]+pm[12];

        normalize();
    }

// [... hier ist Code]

    void getFar(mat4 &pm){
        n.x = pm[3]-pm[2];
        n.y = pm[7]-pm[6];
        n.z = pm[11]-pm[10];
        d = pm[15]-pm[14];

        normalize();
    }


Ich bin zwar kein Mathe Ass aber ganz blöd bin ich nicht... Naja wie gesagt es geht nicht ums Frustum Culling an sich. Es geht um die Bounding Box und was ich machen soll wenn das Objekt mal nicht unrotiert an seinem Platz steht (und zufällig einen Würfel als BB hat).

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

17.08.2012, 21:00

Ok, wenn das für deine Anwendung genau genug ist, dann ja...


Was willst du denn noch genauer haben?
@D13_Dreinig

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

17.08.2012, 22:01

Wenn Du die Worldspace-Koordinaten des Frustums hast und die Worldspace-Koordinaten Deiner Boxen, dann brauchst Du doch auch gar keine Transformation mehr, Kugelschieber. Ich bin verwirrt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

19

18.08.2012, 11:06

Es geht darum dass das Objekt durchaus aus der Bounding Box raus gucken kann wenn es gedreht wurde und die BB nicht.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

20

18.08.2012, 11:22

Du gehst das Problem falsch an.
Du willst deine Bounding-Box immer an den globalen Achsen ausgerichtet haben, aber das ist Unfug. Damit werden sie unnötig groß.
Lass die Boxen so wie sie sind - nämlich im Modellkoordinatensystem - und passe deinen Culling-Test an.
Eine ganz einfache Möglichkeit wäre die 8 Eckpunkte der gedrehten Box gegen die Frustum-Ebenen zu testen. Wenn es mindestens eine Ebene gibt, bei der alle 8 Punkte auf der Rückseite liegen (oder Vorderseite, je nach dem, wohin deine Ebenen zeigen), dann ist das Objekt unsichtbar. Das hat auch Powerpaule schon gesagt.
Es geht aber sicherlich auch noch etwas effizienter.

Werbeanzeige