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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

23.08.2016, 12:26

Wo genau liegt das Problem? Wenn du eine orthogonale Projektion verwendest und alles um den Faktor 42 vergrößerst, dann wird eben alles um den Faktor 42 größer. Mit anderen Worten: Wenn links unten und und rechts oben in deinem Fenster zuerst (-1, -1) bzw. (1, 1) entsprachen, dann entsprechen sie danach einfach nur noch (-1/42, -1/42) bzw. (1/42, 1/42)... ;)

12

23.08.2016, 14:55

Mein Problem ist, dass mir der relative Vergrößerungsfaktor eben nicht hilft, auf die realen Koordinaten zu kommen. Ein Beispiel:

- der DrawCanvas hat eine Größe von 100x100 Pixeln
- Zoom (Skalierung) meiner OpenGL-Szene ist 1, Orthogonaler View, alles zentriert und ich schaue senkrecht auf die X-Ebene
- ich zeichne eine Linie von -1,0,0 nach 1,0,0 (OpenGL-Koordinaten)

Real erscheint jetzt aber in meinem 100x100 Pixel Canvas keine Linie von dort 49,50 nach 51,50 sondern eher was in der Größe von z.B. 20,50 nach 80,50.

Es besteht also keine 1:1-Beziehung zwischen den an OpenGL übergebenen Koordinaten und den Koordinaten, wie sie im Canvas in Form von tatsächlich gezeichneten Pixeln bestehen. Da ist eben noch ein Faktor von - in diesem Beispiel 30 - im Spiel, den ich gerne irgendwie ermitteln oder vermeiden würde.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

23.08.2016, 15:06

Wie berechnest du deine Projektionsmatrix und wie genau setzt du deinen Viewport auf?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (23.08.2016, 16:47)


14

24.08.2016, 08:35

Die Initialisierung sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   glEnable(GL_CULL_FACE);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_BLEND);

   glEnable(GL_LINE_SMOOTH);
   glEnable(GL_POINT_SMOOTH);
   glEnable(GL_POLYGON_SMOOTH);
   glShadeModel(GL_SMOOTH);
   glHint( GL_POINT_SMOOTH_HINT, GL_NICEST );
   glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
   glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );

   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();   
   glOrtho(-0.5, 0.5, -0.5, 0.5, -1, 1000);


Bevor die Vektorarrays gesendet werden, passiert dann noch mal jeweils das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
   glClearColor((m_project->m_projectData.bgCol & 0xFF)/255.0f,
                ((m_project->m_projectData.bgCol >> 8) & 0xFF)/255.0f,
                ((m_project->m_projectData.bgCol >> 16) & 0xFF)/255.0f,1.0);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef(xpos,ypos,-2.0f);
   glScaled(zoom,zoom,zoom);
   glRotatef(xangle, 1.0f, 0.0f, 0.0f);
   glRotatef(yangle, 0.0f, 0.0f, 1.0f);
   glRotatef(180.0f, 0.0f, 1.0f, 0.0f);


Die 180-Grad-Rotation im letzten Schritt ist fix um eine Ansicht von oben zu erhalten.

Werbeanzeige