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

30.12.2012, 12:10

[OpenGL] Transformationsmatrizen für 2D Textur-Koordinaten

Hallo Forum

Ich benötige den Aufbau von allen (Trans., Rot., Scale) 2x2 Transformationsmatrizen für 2D Textur-Koordinaten (OpenGL).
Rotation habe ich glaube ich gefunden (wäre aber nett wenn das nochmal Jemand bestätigen könnte):

cos(alpha) sin(alpha)
-sin(alpha) cos(alpha)

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.

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

30.12.2012, 12:42

Mit einer 2x2-Matrix kannst du keine Translation durchführen, dafür brauchst du 3x3 (oder auch 4x4).
Ansonsten gibt es zum "Aufbau" dieser Matrizen nichts zu sagen, es sind halt ganz normale Transformationsmatrizen.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

3

30.12.2012, 13:06

Hmmm … die Rotationsmatrix ist aus einem Shaderbeispiel. Da wird der Rotationswinkel als Uniform übergeben,
dann die mat2 aufgebaut und die Texturkoordinaten mit der Matrix transformiert.
Wie soll das denn mit 3x3 bzw. 4x4 Matrizen funktionieren ? z bzw. w auf 1.0 setzen und nur x und y im Ergebnis verwenden ?
Ist es da nicht einfacher gleich eine 2x2 Matrix als Uniform zu übergeben ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

4

30.12.2012, 13:12

Du kannst mit einer 2x2 Matrix keine 2D Translationen beschreiben. Eine Translation ist rein prinzipiell eine nichtlineare Abbildung, Matrizen können rein prinzipiell nur lineare Abbildungen darstellen. Um Translationen mit Matrizen darstellen zu können, braucht es einen Trick. Es stellt sich nämlich heraus, dass eine 2D Translation zwar nichtlinear ist, man aber einen höherdimensionalen Raum erfinden kann, in dem sich lineare Abbildungen finden lassen, welche man wiederum mit Matrizen beschreiben kann, die Punkte so transformieren, dass deren Abbild in den niederdimensionalen Raum z.B. dem translierten Punkt entspricht...

Dein Stichwort lautet: Homogene Koordinaten. ;)

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

5

30.12.2012, 13:21

Wenn ich das auf WIKI richtig verstanden habe ist es doch genau ...

z bzw. w auf 1.0 setzen und nur x und y im Ergebnis verwenden ?


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

DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

30.12.2012, 13:52

Du benutzt halt eine 3x3 Matrix und packst an m31 und m32 die x, y Translation. Wenn man sich anguckt wie Matrizen multipliziert werden kommt man auch darauf warum der Punkt dann halt woanders ist :)

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 241

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

7

30.12.2012, 15:13

Ist jetzt klar. Für Translation immer eine Dimension höher als der eigentlich zu transformierende Vektor.
Rotation und Skalierung reicht gleiche Dimension. Will man alle drei Transformationen kombinieren
müssen auch Rot. und Skal. mit 3x3 Matrizen angegeben werden.

Habe also jetzt meine CMatrix33 Klasse erweitert:

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
CMatrix33 CMatrix33::Build_2DTextureRotationMatrix(float AngleZ)
{
    CMatrix33 z;

    z.m11= cosf(AngleZ); z.m12= sinf(AngleZ); z.m13=         0.0f;
    z.m21=-sinf(AngleZ); z.m22= cosf(AngleZ); z.m23=         0.0f;
    z.m31=         0.0f; z.m32=         0.0f; z.m33=         1.0f;

    return z;
}

CMatrix33 CMatrix33::Build_2DTextureTranslationMatrix(float x, float y)
{
    CMatrix33 m;

    m.m11=1.0f; m.m12=0.0f; m.m13=   x;
    m.m21=0.0f; m.m22=1.0f; m.m23=   y;
    m.m31=0.0f; m.m32=0.0f; m.m33=1.0f;

    return m;
}

CMatrix33 CMatrix33::Build_2DTextureScaleMatrix(float x, float y)
{
    CMatrix33 m;

    m.m11=x;    m.m12=0.0f; m.m13=0.0f;
    m.m21=0.0f; m.m22=y;    m.m23=0.0f;
    m.m31=0.0f; m.m32=0.0f; m.m33=1.0f;

    return m;
}


Danke !
"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

8

30.12.2012, 16:06

Sorry an David, Dot und Kugelschieber.
War in dem Thread etwas schwer von Begriff :D ...
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

Werbeanzeige