Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Apr 18, 2024 07:10

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Aug 11, 2014 23:38 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Hallo.
Ich möchte gerne eine Schwarzes Quadrat zeichnen mit den Positionen:
Code:
  1. Vertex(10,  10)
  2. Vertex(110, 10)
  3. Vertex(110, 110)
  4. Vertex(10,  110)

Das klappt problemlos. Ich erhalte das folgende Bild:
Bild
Doch setze ich einen Mittelpunkt fest (z.B. 60|60 in diesem Fall) dann verrutscht das Bild:
Bild
Wie ist das zu erklären?
Als ich noch mit glRotate gearbeitet habe, musste ich vorher und nachher ein glTranslate durchführen, um den Mittelpunkt manuell anzugeben. Doch zur Zeit arbeite ich mit eigenen Matrizen und berechne den Mittelpunkt mit ein:
Code:
  1.  
  2.     mat4x4 Construct(float rotation, float scale, const vec2f& position, const vec2f& center) {
  3.         const float angle = -rotation * M_PI / 180.f;
  4.         const float cos = std::cos(angle);
  5.         const float sin = std::sin(angle);
  6.         const float sc = scale * cos;
  7.         const float ss = scale * sin;
  8.         const float tx = -center.x * sc - center.y * ss + position.x;
  9.         const float ty = center.x * ss - center.y * sc + position.y;
  10.  
  11.         return mat4x4(sc, ss, tx,
  12.                        -ss, sc, ty,
  13.                        0, 0, 1);
  14.     }
  15.  

Ist da was an meinem Code falsch oder habe ich einen Denkfehler? Muss ich tatsächlich immer noch vorher und hinterher ein glTranslate machen? Und wenn ja: warum, wenn ich doch den Mittelpunkt in die Berechnung mit einfließen lasse.
In beiden Fällen erstelle ich vor dem Zeichnen mithilfe der obigen 'Construct' Funktion eine neue Matrix zur Darstellung, daran liegt es also nicht. Im zweiten Fall habe ich in meiner Berechnung lediglich noch center.x und center.y auf 60|60, statt auf 0|0.

Danke schon einmal. :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 12, 2014 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich würde 3 separate Funktionen schreiben.
Eine für Rotation, ein für Skalieren und eine für Translate.
Ich bin so besser gefahren.

Hier kannst meine Quellcode runteladen, dort hat es 2D-Matrixmanipulationen ist zwar in Pascal geschreiben.

Link

Noch eine Frage, wie kommt es bei dir, das du Ganzzahlige Werte bei den Vertex hast ?
Ich habe dort immer Fliesskommazahlen.

_________________
OpenGL


Zuletzt geändert von mathias am Di Aug 12, 2014 21:21, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 12, 2014 21:15 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich kann nirgends einen Link zu deinem Code entdecken. :/ Inwiefern würde mich denn das aufsplitten in 3 Funktionen weiterbringen? Würde das nicht in derselben Struktur / Matrix resultieren?
Mein Vertex struct nimmt float's entgegen, wenn ich also den Wert 10 übergebe wird das in C ganz automatisch zu 10.f.

Gibt es denn etwas, was ich grundsätzlich falsch mache bei meinem Vorgehen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 12, 2014 21:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Sorry, habe den Link vergessen.

Zitat:
Inwiefern würde mich denn das aufsplitten in 3 Funktionen weiterbringen? Würde das nicht in derselben Struktur / Matrix resultieren?

Ich habe bis jetzt noch keine Matrix-Bibliothek gesehen, welche alle Funktionen zusammenfasst.
Die Reihenfolge von den Funktionen ist sehr heikel, es kann schnell zu Ergebnissen führen, welche man nicht will.

Code:
  1. mat4x4
Müsste dies nicht mat3x3 heissen ?

Drehen und Skalieren geht ?



Hier währen meine 2D Matrixfunktionen:

Code:
  1. procedure MatrixScale(var Matrix: TMatrix; Faktorx, Faktory: float);
  2. var
  3.   i: integer;
  4. begin
  5.   for i := 0 to 1 do begin
  6.     Matrix[i, 0] := Matrix[i, 0] * Faktorx;
  7.     Matrix[i, 1] := Matrix[i, 1] * Faktory;
  8.   end;
  9. end;
  10.  
  11. procedure MatrixTranslate(var Matrix: TMatrix; x, y: float);
  12. begin
  13.   Matrix[2, 0] := Matrix[2, 0] + x;
  14.   Matrix[2, 1] := Matrix[2, 1] + y;
  15. end;
  16.  
  17. procedure MatrixRotate(var Matrix: TMatrix; Winkel: float);
  18. var
  19.   i: integer;
  20.   x, y: float;
  21. begin
  22.   Winkel := Winkel / 360 * (2 * Pi);
  23.   for i := 0 to 1 do begin
  24.     x := Matrix[i, 0];
  25.     y := Matrix[i, 1];
  26.     Matrix[i, 0] := x * cos(Winkel) - y * sin(Winkel);
  27.     Matrix[i, 1] := x * sin(Winkel) + y * cos(Winkel);
  28.   end;
  29. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 13, 2014 17:01 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ja, meine Construct Methode scheint aus irgendeinem Grund falsch zu sein. Mit einem solchen Kettenaufruf klappt es:
Code:
  1. _matrix.loadIdentity().rotate(_rotation, _center).scale(_scale, _center).translate(_position);

Vielen Dank!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 15 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.038s | 16 Queries | GZIP : On ]