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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

17.08.2012, 15:13

Eckpunkte einer Bounding Box mit Model Matrix berechnen

Hallo,

ich versuche die Eckpunkte für eine Bounding Box zu berechnen (die aus 2 Vektoren besteht). Das ganze brauche ich für Frustum Culling und später auch mal Trigger Boxen. Das Problem ist dass ich es nicht verstehe/hinbekomme die Eckpunkte dieser Box anhand der Model Matrix des Models zu errechnen. Eigentlich dachte ich an einfache Matrix multiplikation, also M*v. Doch das scheint nicht zu funktionieren. Erstmal kurz ein Bild, weil ich sie gerne benutze, die grüne Linie ist von Hand eingezeichnet. Sie stellt die im Moment untransformierte Bounding Box dar. Das Fass ist rotiert (hier 45°):


(Link)


Wenn ich z.B. folgende Matrix nehme (das Matrix struct funktioniert! column-major):

Quellcode

1
2
3
mat4 m;
m.setIdentity();
m.rotate(90, 1, 0, 0); // 90° über die x-Achse


Und folgenden Vektor:

Quellcode

1
vec3 v = vec3(0, 0, 1); // z ist "oben", w = 0 weil egal


Und beide online multiplizieren lasse:


(Link)


Ich habe das auch schon von Hand quer und schräg nachgerechnet. Auch mit der Modelview usw. aber nirgendwo kam v_neu = (0|1|0) (oder -1, da bin ich mir nicht sicher) raus.
Was mache ich falsch? Geht das so überhaupt? Oder muss ich doch mit Winkelfunktionen rechnen (bin da nicht so fit)?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

17.08.2012, 15:24

Um Dich gleich mal etwas zu verunsichern: Bei einer Box musst Du nicht nur prüfen, ob sich die Ecken außerhalb des Frustums befinden, sondern auch, ob alle Punkte der Kanten außerhalb liegen, sonst clippst Du eventuell Objekte weg, die sichtbar sind. Von daher ist es eigentlich egal, wie die Boxen liegen, denn Du musst nicht die Eckpunkte testen, sondern die Kanten der Boxen mit den Flächen des Frustums.
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

3

17.08.2012, 17:39

Jau hab ich garnicht bedacht dass ja auch mal ein Objekt "quer schräg rechts oben am Frustum hängen kann".
Wie prüfe ich denn Kanten und meine Punkte muss ich trotzdem noch errechnen oder nicht? Fangen wir doch da erstmal an :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

17.08.2012, 17:46

Wie kommst du eigentlich auf die Matrix A? Die Rotation von 90° um die X-Achse ist das nicht... Ansonsten sollte eine Vektor-Matrix Multiplikation die Punkte korrekt rotieren, nichts anderes passiert ja mit dem Vertices deines Models.

Bei einer Box musst Du nicht nur prüfen, ob sich die Ecken außerhalb des Frustums befinden, sondern auch, ob alle Punkte der Kanten außerhalb liegen, sonst clippst Du eventuell Objekte weg, die sichtbar sind. Von daher ist es eigentlich egal, wie die Boxen liegen, denn Du musst nicht die Eckpunkte testen, sondern die Kanten der Boxen mit den Flächen des Frustums.


Wie meinst du das? Die Box sollte sich schon im selben Space wie das Frustum befinden. Ansonsten genügt die Aussage "alle Punkte der Box befinden sich 'hinter' mindestens einer Frustum-Ebene" als Test.
@D13_Dreinig

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

17.08.2012, 18:01

Ich glaube er meint das (das grüne soll im Frustum sein):


(Link)


Zitat

Wie kommst du eigentlich auf die Matrix A? Die Rotation von 90° um die X-Achse ist das nicht... Ansonsten sollte eine Vektor-Matrix Multiplikation die Punkte korrekt rotieren, nichts anderes passiert ja mit dem Vertices deines Models.


Wenn ich die View Matrix nehme und modelview.rotate(90, 1, 0, 0); aufrufe werden mir die vertices schon richtig rotiert doch... Aber wie gesagt ich habe es mit der reinen Model Matrix versucht (so wie oben) und mit der ModelView Matrix. Beides passt nicht. Oder ich rechne falsch...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

17.08.2012, 19:09

Ich glaube er meint das (das grüne soll im Frustum sein):


Den Fall deckt der o.g. Test auch ab.
Wenn ich die View Matrix nehme und modelview.rotate(90, 1, 0, 0); aufrufe werden mir die vertices schon richtig rotiert doch... Aber wie gesagt ich habe es mit der reinen Model Matrix versucht (so wie oben) und mit der ModelView Matrix. Beides passt nicht. Oder ich rechne falsch...


Und wie kommst du jetzt auf das oben gezeigte Beispiel? (Matrix A)
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

17.08.2012, 19:24

Wie meinst du das? Die Box sollte sich schon im selben Space wie das Frustum befinden. Ansonsten genügt die Aussage "alle Punkte der Box befinden sich 'hinter' mindestens einer Frustum-Ebene" als Test.

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...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

17.08.2012, 19:49

Zitat

Und wie kommst du jetzt auf das oben gezeigte Beispiel?


Steht drüber:

Quellcode

1
2
3
mat4 m;
m.setIdentity();
m.rotate(90, 1, 0, 0); // 90° über die x-Achse


Zu beachten: das ist nur die Rotationsmatrix, da ist kein "look at" oder sonst was mit drin. Es geht nur darum den Punk um 90° (in diesem Fall) zu rotieren (natürlich soll er auch verschoben/skaliert werden).
So wird übrigens die Rotationsmatrix erstellt:

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
    void rotate(float angle, float x, float y, float z){
        mat4 m;
        float co, si;
        vec3 axis;
        
        axis = vec3(x, y, z);
        axis.normalize();

        angle = angle*(PI/180);
        co = cos(angle);
        si = sin(angle);
 
        m.values[0] = axis.x*axis.x*(1-co)+co;
        m.values[1] = axis.y*axis.x*(1-co)+axis.z*si;
        m.values[2] = axis.x*axis.z*(1-co)-axis.y*si;
        m.values[3]= 0;
 
        m.values[4] = axis.x*axis.y*(1-co)-axis.z*si;
        m.values[5] = axis.y*axis.y*(1-co)+co;
        m.values[6] = axis.y*axis.z*(1-co)+axis.x*si;
        m.values[7]= 0;
 
        m.values[8] = axis.x*axis.z*(1-co)+axis.y*si;
        m.values[9] = axis.y*axis.z*(1-co)-axis.x*si;
        m.values[10]= axis.z*axis.z*(1-co)+co;
        m.values[11]= 0;
 
        m.values[12] = 0;
        m.values[13] = 0;
        m.values[14]= 0;
        m.values[15]= 1;
        
        *this *= m;
    }

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

17.08.2012, 19:50

Mir ist auch nicht ganz klar, wieso du eigentlich mit der ModelView Matrix arbeiten willst. In welchem Space liegen denn deine Frustum Planes?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

17.08.2012, 19:53

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

Ok nicht dass das jetzt verwirrt, so siehts aus:

Quellcode

1
2
3
4
5
6
7
8
9
mat4 m, p;

m.setIdentity();
m.lookAt(m_position.x, m_position.y, m_position.z, m_lookAt.x, m_lookAt.y, m_lookAt.z, m_up.x, m_up.y, m_up.z); // Position usw. der Kamera

p.setIdentity();
p.perspective(m_fov, m_ratio, m_zNear, m_zFar);

//Frustum Culling dann mit p*m


Darf ich noch anmerken das richtig gecullt wird wenn das Objekt nicht gedreht ist? Es geht darum die Eckpunkte der Bounding Box zu drehen. Das Frustum Culling funktioniert einwandfrei.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (17.08.2012, 20:02)


Werbeanzeige