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

07.12.2011, 20:10

Kurze Frage zu Frustum Culling

Ich hab eben eine kurze Frage zu Frustum Culling: Ich habe nicht bedacht die bounding box mit zu rotieren oder zu skalieren. Skalieren wäre jetzt nicht das Problem, aber wie rotiere ich meine zwei Vektoren? Ich hab schon probiert einfach beide Vektoren mit der Modelview des Modells zu multiplizieren.
Aber entweder ich rechne falsch oder es funktioniert so nicht:

C-/C++-Quelltext

1
2
3
4
5
vec3 multMatVec(const mat4 &m, const vec3 &v){
    return vec3(m.values[0]*v.x+m.values[4]*v.x+m.values[8]*v.x,
                m.values[1]*v.y+m.values[5]*v.y+m.values[9]*v.y,
                m.values[2]*v.z+m.values[6]*v.z+m.values[10]*v.z);
}

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

07.12.2011, 20:17

Wenn du die Matrix Column Major speicherst wäre eine Matrix-Vektor-Multiplikation eher so:

C-/C++-Quelltext

1
2
3
4
5
vec3 multMatVec(const mat4 &m, const vec3 &v){
    return vec3(m.values[0]*v.x+m.values[4]*v.y+m.values[8]*v.z,
                m.values[1]*v.x+m.values[5]*v.y+m.values[9]*v.z,
                m.values[2]*v.x+m.values[6]*v.y+m.values[10]*v.z);
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

07.12.2011, 20:19

v ist wohl eine Position und keine Richtung? Du ignorierst also komplett den Translationsanteil der Matrix. Haben die Typen mat4 und vec3 keinen operator *()?
Abgesehen davon: Fürhst du den Frustum Test auch im Viewspace durch, also hast du die Ebenen deines Frustrum auch tatsächlich im Viewspace vorliegen? Denn ansonsten wird dir die Viewspace Position sowieso nicht viel helfen...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

07.12.2011, 20:24

Doch, aber nur für den eigenen Typen. Also mat4*mat4 und vec3*vec3 geht. Aber nicht mat4*vec3. Den Translationsanteil müsste man doch einfach durch +m.values[12], +...[13], ...14] hinzufügen können oder? Mir geht es erstmal nur darum zu rotieren, aktuell rechne ich nachträglich die Position dann dazu. Aber ich hatte noch vor das in die Multiplikation mit einzubeziehen.

Und ja v ist eine Position, die der unteren linken, bzw. oberen rechten Ecke der bounding box.

Zitat

Fürhst du den Frustum Test auch im Viewspace durch, also hast du die Ebenen deines Frustrum auch tatsächlich im Viewspace vorliegen? Denn ansonsten wird dir die Viewspace Position sowieso nicht viel helfen...


Also ganz so blöd bin ich nicht ;) wenn ich nicht rotiere funktioniert es einwandfrei. Aber bitte sehr:

http://cnp.marvinblum.de/index.php?id=48

[EDIT]

Kommt schon so schwer kann das doch nicht sein... Ich bekomms nicht hin -.-

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (07.12.2011, 21:54)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

08.12.2011, 17:43

Wie rechnet OpenGL denn nachher die tatsächliche Position im Shader aus wenn nicht so?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

08.12.2011, 18:20

Wie rechnet OpenGL denn nachher die tatsächliche Position im Shader aus wenn nicht so?


OpenGL ändert selbstständig gar nichts an der Position.
@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

7

08.12.2011, 18:52

Ähm ja, aber wenn ich Shader dann mit der Modelview multipliziere schon. Also, nur ums nochmal zusammenzufassen was ich will:

1. Einen Punkt im 3D Raum mithilfe der Modelview Matrix, die schon rotiert ist, rotieren.

Das sind ja nicht all zu viele Punkte. Wenn ich also die 3x3 Matrix für die Rotation aus der Modelview ziehe:

0 4 8
1 5 9
2 6 10

Und dann mit irgendeinem Punkt multipliziere, sollte ich doch den rotierten Punkt bekommen oder? Außerdem: kann man das scaling wieder rausrechnen? Sonst werden 0, 5 und 10 ja größer wenn man die Modelview z.B. mit 3 skaliert.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

08.12.2011, 18:54

Was mir immer noch nicht klar ist: Warum willst du ihn nur rotieren!?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

08.12.2011, 19:04

Weil das das einzige ist was ich nicht verstehe, bzw. falsche Ergebnisse liefert.
Mein Vorgehen:

1. Modelview für aktuelles Objekt berechnen:

C-/C++-Quelltext

1
modelview = object->getModelview();


An diesem Punkt bin ich mir schonmal nicht sicher ob ich diese Matrix jetzt nochmal mit der Kamera Modelview multiplizieren muss oder nicht.

2. Zwei Vektoren als Eckpunkte für die BB bekommen (werden aus dem Mesh am Anfang erstellt):

C-/C++-Quelltext

1
vec3 *box = object->getBoundingBox(); // gibt Array mit min und max


3. Vektoren der BB mit der Matrix multiplizieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
vec3 operator*(const vec3 &v){ // ja jetzt in dem Matrix-struct
    return vec3(values[0]*v.x+values[4]*v.x+values[8]*v.x,
            values[1]*v.y+values[5]*v.y+values[9]*v.y,
            values[2]*v.z+values[6]*v.z+values[10]*v.z);
}

box[0] = modelview*box[0];
box[1] = modelview*box[1];


4. Culling testen:

C-/C++-Quelltext

1
2
3
4
if((cull == BURNINGBYTE_BOX_CULLING && activeCamera->testBox(p, box[0], box[1])) || 
(cull == BURNINGBYTE_SPHERE_CULLING && activeCamera->testSphere(p, r))){

// ...


Hierbei ist zu sagen das in den Testfunktionen die Position des Objektes (Mittelpunkt des Meshes) addiert wird.

---------------------------

Also, wo ist der Fehler?

Werbeanzeige

Ähnliche Themen