Du bist nicht angemeldet.

Werbeanzeige

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

1

29.09.2014, 12:47

[OpenGL] Verzerrungsfreies rotieren von 2D-Objekten

Hallo

Ich möchte ein Rechteckiges 2D-Objekt (zwei Dreiecken bzw. 6 Vertices mit entsprechender Textur) rotieren lassen.
Da das 2D-Koordinatensystem von OpenGL mit relativen Koordinaten (links oben -1,1 ; rechts unten 1,-1) arbeitet enstehen Verzerrungen.
Diese entstehen weil die Breitenauflösung genau wie die geringere Höhenauflösung von -1 bis 1 abgebildet werden.
Mit anderen Worten das Objekt wird immer mehr gestaucht, je mehr es sich Vertikal ausrichtet.
Für die Rotation verwende ich eine 2D Rotationsmatrix zum transformieren der 6 Vertices.

Wie bekomme ich eine Rotation ohne verzerrungen hin ?
(Erster Gedanke war Korrektur über entsprechende Scalierung)

Vielen Dank für eure Hilfe
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

29.09.2014, 13:26

Setz Dir einen View, der eben nicht -1;1 und 1;-1 benutzt, sondern etwas, das zur Auflösung des Fensters passt und dieselbe Aspect-Ratio benutzt.
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]

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

3

29.09.2014, 13:28

Richtig, indem du durch entsprechende Skalierung der Koordinaten das Seitenverhältnis deines Ausgabebildes berücksichtigst.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

4

29.09.2014, 14:00

OK ... für die ganz dummen vieleicht noch ein Hinweis wie das geht :hmm:
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

29.09.2014, 14:31

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]

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

6

30.09.2014, 11:02

gluOrtho2D benutze ich nicht da ich nur Core drin haben will.
Aber prinzipiel ist doch der Ansatz auch mit glViewport umzusetzen.
Man lege einen ausreichend großen, quadratischen Viewport auf die Stelle wo der Sprite rotieren soll.
Ist der Viewport quadratisch entstehen keine verzerrungen.

Hab ich das richtig verstanden ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Schrompf

Alter Hase

Beiträge: 1 410

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

30.09.2014, 11:07

So geht es, ja. Auch wenn es übel langsam wird, für jedes Sprite einen Viewport zu setzen und einen separaten DrawCall aufzumachen.

Ich gebe in den Shader 1 / Bildschirmauflösung als Konstante rein, so dass ich alles im Shader in Pixelkoordinaten rechnen kann. Dann wende ich im Shader zuerst die Rotation an und rechne erst am Ende alles mit Hilfe der Konstante in den Clip Space (-1 bis +1) um.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

30.09.2014, 11:21

gluOrtho2D benutze ich nicht da ich nur Core drin haben will.
Da steht auch noch mehr, nicht nur für Ortho-Darstellung! Du musst schon die ganze Antwort lesen.

Ist der Viewport quadratisch entstehen keine verzerrungen.
Dein Fenster ist doch sicherlich nicht quadratisch. Alles, was Du tun musst, ist die Aspect-Ratio für deinen Viewport genau so zu setzen, wie die Maße des Fensters sind. Was genau gluOrtho macht, kann man übrigens auch nachlesen und dann genau das auch selbst machen.
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]

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

9

30.09.2014, 11:28

gluOrtho2D benutze ich nicht da ich nur Core drin haben will.
Da steht auch noch mehr, nicht nur für Ortho-Darstellung! Du musst schon die ganze Antwort lesen..

Habe ich ... ich benutze aber keine Projection Matrix.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static char sVertexShader[] =
    "#version 330\n"
    "precision highp float;\n"
    "precision highp int;\n"
    "\n"
    "layout (location = 0) in vec2 _v2Vertex;\n"
    "layout (location = 1) in vec2 _v2Texture;\n"
    "\n"
    "out vec2 _v2Texture_;\n"
    "\n"
    "void main (void)\n"
    "{\n"
    "   _v2Texture_ = _v2Texture;\n"
    "   gl_Position = vec4(_v2Vertex.x, _v2Vertex.y, 0.0, 1.0);\n"
    "}\n";
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

10

30.09.2014, 11:35

So geht es, ja. Auch wenn es übel langsam wird, für jedes Sprite einen Viewport zu setzen und einen separaten DrawCall aufzumachen.

Ich gebe in den Shader 1 / Bildschirmauflösung als Konstante rein, so dass ich alles im Shader in Pixelkoordinaten rechnen kann. Dann wende ich im Shader zuerst die Rotation an und rechne erst am Ende alles mit Hilfe der Konstante in den Clip Space (-1 bis +1) um.

Auch nicht schlecht ... du rechnest also deine Geometrie um auf [(-x/2 ; y/2) (x/2 ; -Y2)] mit x=ScreenWidth und y=ScreenHeight,
führst anschließend die Rotation durch und rechnest das Ergebnis wieder um auf [(-1 ; 1) (1; -1)] ?

Richtig ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Werbeanzeige