[2D theorie] rotatie figuur X en Y as

Pagina: 1
Acties:
  • 684 views sinds 30-01-2008
  • Reageer

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Ik ben bezig met een progje dat een simpel figuur laat roteren over respectievelijk zijn x en y as.

Nu heb ik de verschillende transformatie matrices gemaakt, en deze werken allemaal......behalve...juist de x en y as rotaties.

ik gebruik homogene coordinaten.
de x-as rotatie matrix ziet er als volgt uit:

code:
1
2
3
 1 0    0
 0 cos  sin
 0 -sin cos


De rotatie om de Z-as gaat wel goed. (dwz rotatie van rechts naar links over de oorsprong aangezien de Z-as een lengte van 1 heeft).

Voorbeeldje:
Start, figuur van 50x50 met als startcoordinaat 0,0

[img]http://www.xs4all.nl/~phbkn/start.jpg[\img]
[afbeelding]


Na 10graden rotatie over X-as"

[img]http://www.xs4all.nl/~phbkn/rotateX.jpg[\img]
[afbeelding]

Wat gaat hier nu fout? Kan het niet voor elkaar krijgen.
Heb al verschillende translaties geprobeerd, maar blijf dit rare resultaat krijgen.

[ Voor 10% gewijzigd door Nexopheus op 03-03-2003 20:26 . Reden: IMG tag schijnt niet helemaal te werken! ]

Wat niet kan is nog nooit gebeurd


  • MisterData
  • Registratie: September 2001
  • Laatst online: 10-12 14:49
Ik had een dergelijk probleem ook... ik geloof dat ik een cos ipv een -cos had neergezet ergens (ik doe een software 3d engine dus vergelijkbaar).... probeer es met je matrix te spelen, dat lost het vast op :)

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
De cos en sin waarden staan wel goed, getuige het feit dat de rotatie over de "Z" as wel goed gaat. Ik gebruik generieke methodes hiervoor:
Zie hieronder:
Java:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
private static final int X = 0;
private static final int Y = 1;
private static final int Z = 2;


//Private rotatie generatie methode.
    private static Matrix rotateAxis(double angle, int a1, int a2){
        double sin = Math.sin(angle);
        double cos = Math.cos(angle);
        
        Matrix rotate = Matrix.transformation();
        rotate.matrix[a1][a1] = cos;
        rotate.matrix[a1][a2] = -sin;
        rotate.matrix[a2][a2] = cos;
        rotate.matrix[a2][a1] = sin;        
        
        return rotate;
    }
    
    /**
    * Rotatie matrix
    * Transformatie-matrix voor een rotatie om de x-as.
    * @param angle Aantal radialen waarover geroteerd dient te worden.
    * @return Een transformatie-matrix.
    */
    public static Matrix rotateX(double angle){
        return rotateAxis(angle, Y, Z);
    }
    
    /**
    * Rotatie matrix
    * Transformatie-matrix voor een rotatie om de y-as.
    * @param angle Aantal radialen waarover geroteerd dient te worden.
    * @return Een transformatie-matrix.
    */
    public static Matrix rotateY(double angle){
        return rotateAxis(angle, X, Z);
    }
    
    /**
    * Rotatie matrix
    * Transformatie-matrix voor een rotatie om de z-as.
    * @param angle Aantal radialen waarover geroteerd dient te worden.
    * @return Een transformatie-matrix.
    */
    public static Matrix rotateZ(double angle){
        return rotateAxis(angle, X, Y);
    }
    

[ Voor 4% gewijzigd door Nexopheus op 03-03-2003 21:45 . Reden: Toevoegen const. XYZ ]

Wat niet kan is nog nooit gebeurd


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:14
Debug-print de Matrix die rotateX retourneert eens? Als die gewoon correct is, en je hebt de vermenigvuldiging goed geïmplementeert, zou alles goed moeten zijn. Plaats de code daarvan anders ook eens.

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
De transformatie matrix voor de rotatie over de X-as ziet er met 10 graden rotatie als volgt uit:
code:
1
2
3
4
5
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 0.984807753012208, -0.17364817766693033 |
     [java] | 0.0, 0.17364817766693033, 0.984807753012208 |
     [java] -----------------------------


!edit Ter aanvulling.
Ik heb dus een "world" object die representeerd het assenstelsel, het figuur transleer ik wanneer ik ga tekenen dus terug "omhoog" naar de wereld.

Het gekke is dat alle andere matrix operaties goed gaan.
shear,
transformatie.
rotatie over de oorsprong.

[ Voor 29% gewijzigd door Nexopheus op 03-03-2003 20:44 ]

Wat niet kan is nog nooit gebeurd


  • Harmsen
  • Registratie: November 2000
  • Laatst online: 22:58
Gezien je screenshots doe je dit in Java. Wij hebben dit voor school ongever ook moeten doen, na wat gepruts met Graphics2D en de rotate functie daarvan zijn we toch via een andere manier gaan werken.

Ik heb toen een tutorial gevonden die een paar leuke functies hadden

bron : http://www.programming.de/java_tutorial/j_tutor20.html

de functies waar het om gaan zijn dan :

Java:
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
int rotate_x(int x, int y)
    {
        return ((int) (cx + x * cos - y * sin));
    }

    int rotate_y(int x, int y)
    {
        return ((int) (cy + y * cos + x * sin));
    }

    void SetAngle(double a)
    {
        radians = (a * 2 * Math.PI) / 360;

        cos = Math.cos(radians);
        sin = Math.sin(radians);
    }

    void RotatePolygon(int x[], int y[], int n)
    {
        int new_x[] = new int [n];
        int new_y[] = new int [n];

        for(int i=0; i<n; i++)
        {
            new_x[i]=rotate_x(x[i], y[i]);
            new_y[i]=rotate_y(x[i], y[i]);
        }

        gBuffer.fillPolygon(new_x, new_y, n);
    }


Hopelijk kan je hier iets mee, de code op die site is makkelijk te begrijpen al zeg ik het zelf en ik neem aan dat je niet een beginner bent in Java zoals ik.

What a fine day for Science! | Specs


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Bedankt voor je input, maar als je kijkt naar
Java:
1
2
3
4
5
6
7
8
9
int rotate_x(int x, int y)
    {
        return ((int) (cx + x * cos - y * sin));
    }

    int rotate_y(int x, int y)
    {
        return ((int) (cy + y * cos + x * sin));
    }

En je zet dit in een matrix vorm, kom je uit op de matrix die ik hierboven ergens heb gezet.

Verder wil ik geen standaard API gebruiken zoals Graphics2D oid,. (deze heeft bijvoorbeeld ook een translate methode....)

Wat niet kan is nog nooit gebeurd


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:14
Nexopheus schreef op 03 March 2003 @ 20:42:
De transformatie matrix voor de rotatie over de X-as ziet er met 10 graden rotatie als volgt uit:
code:
1
2
3
4
5
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 0.984807753012208, -0.17364817766693033 |
     [java] | 0.0, 0.17364817766693033, 0.984807753012208 |
     [java] -----------------------------
Dat ziet er prima uit. Plaats je code voor de vermenigvuldiging van de vector met de matrix ook eens? En de uitvoer wanneer je er (bijvoorbeeld) (50, 0, 100), (50, 100, 0) en (50, 100,100) in stopt?

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
mmmm, de resultaten die ik uiteindelijk krijg schieten het dak uit!

hier het gehele verloop:
code:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[java] Transformatie naar de wereld:
     [java] Matrix parent:
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 1.0, 0.0 |
     [java] | 0.0, 0.0, 1.0 |
     [java] -----------------------------
     [java] 
     [java] Deze vermenigvuldigen met.....
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 0.984807753012208, -0.17364817766693033 |
     [java] | 0.0, 0.17364817766693033, 0.984807753012208 |
     [java] -----------------------------
     [java] 
     [java] Geeft als resultaat:
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 0.984807753012208, -0.17364817766693033 |
     [java] | 0.0, 0.17364817766693033, 0.984807753012208 |
     [java] -----------------------------
     [java] 
     [java] Totale translatie matrix naar de wereld:
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 0.984807753012208, -0.17364817766693033 |
     [java] | 0.0, 0.17364817766693033, 0.984807753012208 |
     [java] -----------------------------
     [java] 
     [java] Nu translatie van de basispunten van de figuur
     [java] Totale transformatie matrix:.....
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 0.984807753012208, -0.17364817766693033 |
     [java] | 0.0, 0.17364817766693033, 0.984807753012208 |
     [java] -----------------------------
     [java] 
     [java] Deze vermenigvuldigen met.....
     [java] -----------------------------
     [java] | 0.0, 0.0, 50.0, 50.0, 0.0 |
     [java] | 0.0, 50.0, 50.0, 0.0, 0.0 |
     [java] | 1.0, 1.0, 1.0, 1.0, 1.0 |
     [java] -----------------------------
     [java] 
     [java] Geeft als resultaat:
     [java] -----------------------------
     [java] | 0.0, 0.0, 50.0, 50.0, 0.0 |
     [java] | -0.17364817766693033, 49.06673947294347, 49.06673947294347, -0.17364817766693033, -0.17364817766693033 |
     [java] | 0.984807753012208, 9.667216636358724, 9.667216636358724, 0.984807753012208, 0.984807753012208 |
     [java] -----------------------------
     [java] 
     [java] Nu transformeren naar het scherm toe
     [java] Scherm transformator: 
     [java] -----------------------------
     [java] | 1.0, 0.0, 200.0 |
     [java] | 0.0, -1.0, 150.0 |
     [java] | 0.0, 0.0, 1.0 |
     [java] -----------------------------
     [java] 
     [java] Deze vermenigvuldigen met.....
     [java] -----------------------------
     [java] | 0.0, 0.0, 50.0, 50.0, 0.0 |
     [java] | -0.17364817766693033, 49.06673947294347, 49.06673947294347, -0.17364817766693033, -0.17364817766693033 |
     [java] | 0.984807753012208, 9.667216636358724, 9.667216636358724, 0.984807753012208, 0.984807753012208 |
     [java] -----------------------------
     [java] 
     [java] Geeft als resultaat:
     [java] -----------------------------
     [java] | 196.9615506024416, 1933.4433272717447, 1983.4433272717447, 246.9615506024416, 196.9615506024416 |
     [java] | 147.89481112949812, 1401.0157559808652, 1401.0157559808652, 147.89481112949812, 147.89481112949812 |
     [java] | 0.984807753012208, 9.667216636358724, 9.667216636358724, 0.984807753012208, 0.984807753012208 |
     [java] -----------------------------
     [java]


Er gaat dus ergens iets gigantisch mis met de vermenigvuldiging....

!edit
Hier de vermenigvuldiging methode:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Matrix multiply(Matrix arg){
        Matrix result;        
        double sum;
        if(this.cols != arg.rows)            
            return null;
        
        result = (Matrix) this.clone(this.rows,arg.cols);
        for(int i = 0; i< this.rows;i++)
            for(int j=0;j<arg.cols;j++){
                sum = 0.0;
                for(int k = 0; k < this.cols;k++)
                    sum += this.matrix[i][k] * arg.matrix[k][j];
                result.matrix[i][j] = sum;            
            }
        return result;            
    }  

[ Voor 11% gewijzigd door Nexopheus op 03-03-2003 21:11 ]

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Soultaker schreef op 03 maart 2003 @ 20:53:
[...]

Dat ziet er prima uit. Plaats je code voor de vermenigvuldiging van de vector met de matrix ook eens? En de uitvoer wanneer je er (bijvoorbeeld) (50, 0, 100), (50, 100, 0) en (50, 100,100) in stopt?
Die vertices zijn 3D! ik gebruik enkel de "z" voor het homogeen maken van de vector. -->
Java:
1
2
3
4
5
6
7
8
9
10
Vertex A = new Vertex("A",0,0);
Vertex B = new Vertex ("B",0,100);
Vertex C = new Vertex("C",100,100);
Vertex D = new Vertex("D",100,0);

[....connecties maken ed...]
geeft als matrix
(0, 0, 100, 100)
(0, 100, 100, 0)    
(1, 1, 1, 1 )

[ Voor 12% gewijzigd door Nexopheus op 03-03-2003 21:34 ]

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Ok, doet het nu zoals het moet.
rotatiematrix: (X)
code:
1
2
3
(1, 0, 0)
(0,cos,0)
(0,0,1)


Raar, maar waar.

Wat niet kan is nog nooit gebeurd


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 25-11 22:57

dusty

Celebrate Life!

Een (absolute) matrix opstellen voor een rotatie is vaak beter dan het met cos/sin "ter plekke" te berekenen (juist vanwege de afrondings verschijnselen) die je dus kunt vermijden door juist gebruik te maken van een matrix. Dus matrix zonder cos/sin erin. Maar absolute getallen. Hierdoor kan je verplaatsingen krijgen die exact op een punt vallen en niet tussen twee verschillende beeldscherm punten.

[ Voor 33% gewijzigd door dusty op 03-03-2003 22:16 ]

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Dat doe ik ook! zie post hierboven./
De matrix die daar staat is mijn rotatie matrix.

Wat niet kan is nog nooit gebeurd


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 25-11 22:57

dusty

Celebrate Life!

Nexopheus schreef op 03 maart 2003 @ 22:15:
Dat doe ik ook! zie post hierboven./
De matrix die daar staat is mijn rotatie matrix.

Ik zie een (cos) erin, dus gebruik je actief een cos (en reken je dus de cos "ter plekke" uit)

(was net bezig om het woordje absoluut bij mijn vorige post te zetten..)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
In mijn matrix class wordt de cos gebruikt.
Aan de hand van het aantal graden dat geroteerd dient te worden genereer ik in die klasse een transformatie matrix. En dat kan toch niet echt zonder de cosines.....toch.?

!edit Zie hier de JBuilder (no comments please) generated html van de source/
[ Matrix.java ]

[ Voor 27% gewijzigd door Nexopheus op 03-03-2003 22:25 ]

Wat niet kan is nog nooit gebeurd


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Een oude lame java applet van me: http://www.xs4all.nl/~perseus/zoom/zoom.html
(de source staat er ook)

snippet uit de 2D rotate routine (waar jij om vraagt)
Java:
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
void    rotate_it()
{
    double  gamma_rad;
    double  sin_g;
    double  cos_g;

    double  xn,yn;
    double  xn2,yn2;

    int i;

    // first update the angle. only gamma is interesting...
    gamma=(gamma+dgamma)%360;

    gamma_rad=(gamma/360)*2*Math.PI;
        
    // get the sin and cos of the angles

    sin_g=Math.sin(gamma_rad);      
    cos_g=Math.cos(gamma_rad);      

    // now rotate the coords...
    for(i=0;i<num_of_coords;i++)
    {
        yn=ys_coords[i];
        xn=xs_coords[i];

        xd_coords[i]=(xn*cos_g) - (yn*sin_g);
        yd_coords[i]=(yn*cos_g) + (xn*sin_g);
    }
}


xd_coords en yd_coords zijn de destination arrays voor de geroteerde punten, xs_coords en ys_coords zijn de source arrays voor de origin punten. Je roteert dus altijd vanuit de source. Daar heb je echt geen matrices voor nodig, gewoon 2 euler formuletjes :P

Enjoy.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • EfBe
  • Registratie: Januari 2000
  • Niet online
dusty schreef op 03 March 2003 @ 22:14:
Een (absolute) matrix opstellen voor een rotatie is vaak beter dan het met cos/sin "ter plekke" te berekenen (juist vanwege de afrondings verschijnselen) die je dus kunt vermijden door juist gebruik te maken van een matrix. Dus matrix zonder cos/sin erin. Maar absolute getallen. Hierdoor kan je verplaatsingen krijgen die exact op een punt vallen en niet tussen twee verschillende beeldscherm punten.
Euler lock doet zich niet voor in 2D dacht ik. In 3D heb je gelijk, maar dan ga je toch liever Quaternions gebruiken ipv euler based matrices. Dit is een 2D dingetje, dat roteren is 2 formuletjes.

[ Voor 2% gewijzigd door EfBe op 03-03-2003 22:51 . Reden: jaja het is lang geleje, deternions bestaan niet, quaternions wel ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Wanneer je deze code
Java:
1
2
xd_coords[i]=(xn*cos_g) - (yn*sin_g); 
yd_coords[i]=(yn*cos_g) + (xn*sin_g); 


(stelsel van vergelijkingen) in matrix vorm zet

dus. stelsel is:

x' = x * cos(hoek) - y * sin (hoek)
y' = y * cos(hoek) + x * sin(hoek)

[x'] [cos, -sin, 0] [x]
[y'] = [cos, sin, 0] * [y]
[1] [0,0,1] [z]

[layout is fucked-up grrr]
De matrix vermenigvuldiging doet dus exact het zelfde

[ Voor 7% gewijzigd door Nexopheus op 03-03-2003 22:52 ]

Wat niet kan is nog nooit gebeurd


  • EfBe
  • Registratie: Januari 2000
  • Niet online
klopt, de matrix uitgeschreven is dit setje formules. maar arrays zijn niet fijn in java, dus die formules leveren meer op, zeker in 2D

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Uiteraard is de methode die je me voorlegt een stuk sneller. Het gaat me echter om de lineaire algebra (incl. de matrices) te oefenen....

Nog iets wat je me mischien kan vertellen, hoe kom ik nu aan die absolute waarden ???
bij rotaties over een kleine hoek, is de cos bijna gelijk aan 1, dus die kan eventueel weg(?)...

Shine your light!

Wat niet kan is nog nooit gebeurd


  • EfBe
  • Registratie: Januari 2000
  • Niet online
welke absolute waarden bedoel je? De resultaatcoordinaat?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
dusty schreef op 03 March 2003 @ 22:14:
[......]
Dus matrix zonder cos/sin erin. Maar absolute getallen. Hierdoor kan je verplaatsingen krijgen die exact op een punt vallen en niet tussen twee verschillende beeldscherm punten.
Deze bedoel ik, je noemde Euler-lock in 1 van je vorige posts ...

Wat niet kan is nog nooit gebeurd


Verwijderd

Nexopheus schreef op 03 March 2003 @ 21:00:
....
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     [java] Nu translatie van de basispunten van de figuur
     [java] Totale transformatie matrix:.....
     [java] -----------------------------
     [java] | 1.0, 0.0, 0.0 |
     [java] | 0.0, 0.984807753012208, -0.17364817766693033 |
     [java] | 0.0, 0.17364817766693033, 0.984807753012208 |
     [java] -----------------------------
     [java] 
     [java] Deze vermenigvuldigen met.....
     [java] -----------------------------
     [java] | 0.0, 0.0, 50.0, 50.0, 0.0 |
     [java] | 0.0, 50.0, 50.0, 0.0, 0.0 |
     [java] | 1.0, 1.0, 1.0, 1.0, 1.0 |
     [java] -----------------------------
     [java] 
     [java] Geeft als resultaat:
     [java] -----------------------------
     [java] | 0.0, 0.0, 50.0, 50.0, 0.0 |
     [java] | -0.17364817766693033, 49.06673947294347, 49.06673947294347, -0.17364817766693033, -0.17364817766693033 |
     [java] | 0.984807753012208, 9.667216636358724, 9.667216636358724, 0.984807753012208, 0.984807753012208 |
     [java] -----------------------------
     [java]


Er gaat dus ergens iets gigantisch mis met de vermenigvuldiging....
.........
Wat doet die 3x5 matrix???

Maar volgens mij moet je je vector andersom uitlezen.
Er staat nu:: (voor punt (50,50))
code:
1
2
3
|50|
|50|
| 1 |

Maar dit zou volgens mij het volgende moeten zijn::
code:
1
2
3
| 1 |
|50|
|50|


Als ik deze vector vermenigvuldig met rotatie matrix, kom ik wel op het juiste punt uit.

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Nee hoor, voor dat punt klopt het wel. Dat zijn homogene coordinaten.
dus
code:
1
2
3
[x]
[y] 
[1]


De 3x5 matrix (is nu overigens 3*4) is het figuur dat getekend wordt.
(in homogene coordinaten)

[ Voor 33% gewijzigd door Nexopheus op 03-03-2003 23:26 ]

Wat niet kan is nog nooit gebeurd


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Ik denk dat je probleem eerder ligt bij de projectiematrix, hoe kom je aan dat ding?
code:
1
2
3
4
Scherm transformator: 
| 1.0,  0.0, 200.0 |
| 0.0, -1.0, 150.0 |
| 0.0,  0.0,   1.0 |


Projectie op vlak loodrecht op de z-as, daarna schaling van x- en y-as:
code:
1
2
3
| 200,   0, 0 |
|   0, 150, 0 |
|   0,   0, 0 |

[ Voor 29% gewijzigd door SuperRembo op 03-03-2003 23:42 ]

| Toen / Nu


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Dat ding is de transformatie matrix naar mij assenstelsel.
Dit assenstelsel heeft zijn oorsprong op 200,150 (scherm coordinaten) en
de -1 zorgt ervoor dat de y-as geinverteerd wordt.
Op deze manier creeer ik een assenstelsel waarmee ik verder ga werken.

De structuur die getekend wordt is een "kind" van dit assenstelsel. Voordat ik de structuur kan tekenen moet ik deze eerst nog transformeren naar zijn "parent" toe, in dit geval dus het assenstelsel.

Wat niet kan is nog nooit gebeurd


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Aha, maar dan moet je het zo doen:
code:
1
2
3
|x_scherm|   |200|   |1  0  0| |x|
|y_scherm| = |150| + |0 -1  0|*|y|
|z_scherm|   |  0|   |0  0  0| |z|

| Toen / Nu


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
leg eens uit....

Wat niet kan is nog nooit gebeurd


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
De 3x1 kolom zorgt voor de translatie (verschuiving).
De 3x3 matrix zorgt voor de projectie op het xy-vlak en de spiegeling t.o.v. de y-as.
Zo komt de oorsprong (0,0,0) dus ook op (200,150) op je scherm.

| Toen / Nu


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Aha, Ok.

PS ik werk niet in 3D dus het punt (0,0,0) bestaat niet.
dat is bij mij (0,0,1).

Wat niet kan is nog nooit gebeurd


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Waarom gebruik je dan z=1 en niet gewoon z=0 :?
En waarom wil je om de x-as roteren als je in 2D werkt? Wil je gewoon in het vlak van het scherm roteren (met de klok mee / tegen de klok in)?

| Toen / Nu


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
z = 1 gebruik ik om de coordinaten homogeen te maken zodat de matrix vermenigvuldigingen in serie doorlopen kunnen worden.
[bijv] translatie, rotate, scale, translatie.....

Ik wil graag om de x-as van het figuur roteren (en Y-as ook overigens) omdat dit een opdracht van school (was/is).
Ik keek er ook raar tegenaan, en ben dus ook een hele tijd aan het kutten geweest om de "rotatie" voor elkaar te krijgen.

Het is meer omklappen naar rechts-links of naar boven-onder, zodat de illusie gewekt wordt dat de structuur om zijn eigen as draait.

in een 3D wereld doet z gewoon mee als coordinaat, en werk ik met 4x4 transformatie matrices. [inderdaad ivm de homogene coordinaten]

Wat niet kan is nog nooit gebeurd


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Ow, ik snap het al
Dus dit
code:
1
2
3
|x'|   |200|   |1  0  0| |x|
|y'| = |150| + |0 -1  0|*|y|
|z'|   |  0|   |0  0  0| |z|

is hetzelfde als dit
code:
1
2
3
|x'|   |1  0  200| |x|
|y'| = |0 -1  150|*|y|
| 1|   |0  0    1| |1|


Haal je die systemen ((x,y,z) en (x,y,1)) dan niet door elkaar?
Die rotatiematrix gaat uit van (x,y,z) coords, die andere transformatie gaat uit van (x,y,1).

| Toen / Nu


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
De matrix klasse gaat inderdaad uit van 3D, dus wellicht dat daar nog het een en ander aan gefixed moet worden. Zoals ik het nu geimplementeerd heb werkt het precies zoals ik het wil. [hopen dat de docenten daar ook zo over denken :) ].
zie Matrix.java

Wat niet kan is nog nooit gebeurd


Verwijderd

Hoe kom ja aan die rotatie matrix?
code:
1
2
3
 1 0    0
 0 cos  sin
 0 -sin cos



moet dan de rotatie matrix niet als volgt zijn?

code:
1
2
3
 cos -sin 0
 sin  cos 0
   0    0   1


Dit omdat je de volgende vector gebruikt
code:
1
2
3
x
y
0

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
nope, dat is de rotatie-matrix voor de rotatie over de oorsprong.

!Edit: Dus eingelijk over de Z-as.

[ Voor 24% gewijzigd door Nexopheus op 04-03-2003 00:22 ]

Wat niet kan is nog nooit gebeurd


Verwijderd

Volgens mij gaat het fout omdat je gebruik maak van 3x3 matrices. Ik heb de berekening, om bijvoorbeeld het punt (50,50,0) 10 graden over de x as te roteren, gemaakt met 3x3 matrices (zoals je in 2d zou verwachten) en een keer met behulp van 4x4 matrices(zoals gebruikelijk is in 3d).

Het resultaat van het punt (50,50,0) 10 graden geroteerd over de x-as is, met 3x3 matrices (1786, 1253, 8.68). Dit komt aardig overeen met hetgeen dat jij als resultaat kreeg.

De zelfde berekening met 4x4 matrices geeft als resultaat (250,100, 8.68). Dit is het punt dat op het scherm afgebeeld zou moeten worden.

De berekening is als volgt:

Mv=T*S

P'=Mv*Rx*P

Waar Mv de transformatiematrix is van worldspace naar viewspace.
T is de translatie van de oorsprong van het scherm naar (200,15)
S vermenigvuldigt de Y waarde met -1

Rx is de rotatie matrix om de x-as
P is het oorspronkelijke punt.
P' is het punt op het scherm

3x3
code:
1
2
3
4
5
6
7
8
9
10
11
 P'=T*S*Rx*P

| x' |   | 1 0 200 |   | 1  0 0 |   | 1   0    0 |   | x |
| y' | = | 0 1 150 | * | 0 -1 0 | * | 0 cos -sin | * | y |
| z' |   | 0 0   0 |   | 0  0 1 |   | 0 sin  cos |   | z |

geeft als resultaat voor (50,50,0) bij een rotatie van 10 graden

| 1786.481776 |
| 1253.120944 |
| 8.682408883 |


Dezelfde berekening met 4x4 matrices
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 P'=T*S*Rx*P

| x' |   | 1 0 0 200 |   | 1  0 0 0 |   | 1   0    0  0 |   | x |
| y' | = | 0 1 0 150 | * | 0 -1 0 0 | * | 0 cos -sin  0 | * | y |
| z' |   | 0 0 1   0 |   | 0  0 1 0 |   | 0 sin  cos  0 |   | z |
| 1  |   | 0 0 0   1 |   | 0  0 0 1 |   | 0   0    0  1 |   | 1 |

geeft als resultaat voor (50,50,0) bij een rotatie van 10 graden

|    250   |
| 100.7596 |
| 8.682408 |
|     1    |

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Het is 2D dus je hebt een 2x2 matrix nodig, niet een 3x3.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
EfBe schreef op 04 March 2003 @ 08:59:
Het is 2D dus je hebt een 2x2 matrix nodig, niet een 3x3.
Nee, ik wil mnet homogene coordinaten werken dus heb ik matrices nodig in de vorm [Dimensie+1][Dimensoe+1]

-->DaMike...

mmmm interressant, zal het gelijk even op die manier proberen.

Wat niet kan is nog nooit gebeurd


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Nexopheus schreef op 04 maart 2003 @ 09:21:
[...]
Nee, ik wil mnet homogene coordinaten werken dus heb ik matrices nodig in de vorm [Dimensie+1][Dimensoe+1]
Dit lijkt me larie. Je bent puur 2D bezig, je hebt dus niets aan 3D rotaties. Je projecteert de 3D rotatie-resultaten toch ook niet met een orthogonale projectie op je beeld, maar negeert gewoon de Z toch?

Als je de 6 Euler formules uitschrijft, dan zie je dat in de Y een z waarde wordt meegenomen. Echter die is 0, en die exponent is dus ook 0, voegt dus niets toe aan je berekening.

Je kunt ook quaternions (4D vectors) gebruiken, voegt net zo min iets toe. Wat je wilt uittesten werkt ook in 2D met 2x2 matrices. Als je 3D coords wil gebruiken, roteer dan een 3D object om 3 assen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Als jij het zegt.....ik ben in alle theorie die ik bestudeerd heb (ook 2D) alleen maar homogene coordinaten tegengekomen. Zodat (wat ik al eerder vermeld heb) series van matrix vermenigvuldingen uitgevoerd kunnen worden).

Verder gebruik ik geen euler formules maar enkel matrix-operaties, dus schalen, transformeren, transleren, roteren etc.

Wat niet kan is nog nooit gebeurd


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:58

Janoz

Moderator Devschuur®

!litemod

EfBe schreef op 04 March 2003 @ 09:26:
[...]

Dit lijkt me larie. Je bent puur 2D bezig, je hebt dus niets aan 3D rotaties. Je projecteert de 3D rotatie-resultaten toch ook niet met een orthogonale projectie op je beeld, maar negeert gewoon de Z toch?

Als je de 6 Euler formules uitschrijft, dan zie je dat in de Y een z waarde wordt meegenomen. Echter die is 0, en die exponent is dus ook 0, voegt dus niets toe aan je berekening.

Je kunt ook quaternions (4D vectors) gebruiken, voegt net zo min iets toe. Wat je wilt uittesten werkt ook in 2D met 2x2 matrices. Als je 3D coords wil gebruiken, roteer dan een 3D object om 3 assen.



Beiden hebben gelijk.

Het is larie om cos en sin in de 3e kolom/rij neer te zetten waneer je met 2D bezig bent. In 2D is er maar 1 mogelijke rotatie. De door de TS gebruikte matrix slaat dus eigenlijk nergens op wat ook past bij het resultaat (je bent immers normalisatie waarden aan het roteren!)

Waarom toch dimensie +1 wordt gebruikt komt bv naar voren bij transleren. dan heb je een matrix als:
code:
1
2
3
1 0 dx
0 1 dy
0 0 1

Hieraan is trouwens ook mooi te zien waarom een vertex 1 als laatste component heeft en een vector 0. De laatste is namelijk ongevoelig voor transleren :).

@TS

Het om verschillende assen draaien is (zoals ik al zei) onmogelijk in 2D. Wat jij van plan bent is eerder een heel simpele 3D projectie (zonder perspectief). Hiervoor zul je dus ook 3d math moeten gebruiken! Niks normalizatie invullen voor de Z maar gewoon een waarde. Anders krijg je idd dit soort effecten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Ok, ik ga er mee bezig..

!Edit:
Werkt als een tierelier! Gek genoek is dit gezelfde als wat ik eerst had.
DUs alleen maar cosinus op 0,0 voor x en 1,1 voor y.!

Thx voor de input!!

[ Voor 85% gewijzigd door Nexopheus op 04-03-2003 09:55 ]

Wat niet kan is nog nooit gebeurd


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:58

Janoz

Moderator Devschuur®

!litemod

Da's ook niet geheel onlogisch. De projectie die je nu toepast is 'negeer z coordinaten'. Zoals ik al zei, een projectie zonder perspectief. de normale rotatie matrix in het 3d geval zou zijn:
code:
1
2
3
4
1,   0,   0,   0
0, cos, sin,   0
0,-sin, cos,   0
0,   0,   0,   1

Waneer je dus op voorhand al de Z negeert (door deze weg te laten. en het 4e component te verplaatsen naar de 3e positie) zou je van deze matrix slechts de 4 waardes links boven overhouden samen met de kolom + de rij van de normalisatie. Vandaar dat je alleen de cos nodig hebt.

Normaal zou je je punten door kunnen blijven roteren, maar aangezien jij je z-waardes negeert lukt dat niet in jou geval.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 20-08-2024
Ja, het begint me allemaal te dagen, potlood, papier een geodriekhoek en rekenmachine zijn zeer krachtige tools :)

Wat niet kan is nog nooit gebeurd


  • EfBe
  • Registratie: Januari 2000
  • Niet online
translatie in 2D kan ok met een 2x2 matrix. Je kunt die nl. vermenigvuldigen met je rotatie matrix en dan en roteren en transleren in 1 keer. Je vectoren hebben nl. maar 2 elementen, dus je hebt nooit een 3x3 matrix nodig :P

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:58

Janoz

Moderator Devschuur®

!litemod

EfBe schreef op 04 maart 2003 @ 13:01:
translatie in 2D kan ok met een 2x2 matrix. Je kunt die nl. vermenigvuldigen met je rotatie matrix en dan en roteren en transleren in 1 keer. Je vectoren hebben nl. maar 2 elementen, dus je hebt nooit een 3x3 matrix nodig :P


Ok, mag ik van jou dan de 2x2 matrix waarmee ik een punt over (dx,dy) verplaats?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • EfBe
  • Registratie: Januari 2000
  • Niet online
uit mn blote hoofd:

code:
1
2
dx, 0
0  , dy

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-12 02:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat is een schaling, geen translatie
test: we gaan vector (1, 2) transleren over (4, 4), dus dan zou ie op (5, 6) uit moeten komen

code:
1
2
3
4
  *       [ 4  0 ]
          [ 0  4 ]

[ 1  2 ]  [ 4  8 ]


hmm, dat klopt niet echt ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
EfBe schreef op 04 March 2003 @ 16:34:
uit mn blote hoofd:

[code]
dx, 0
0 , dy
[/code]
(Edit)
je hebt gelijk. Ik zat wat te prutsen hiermee, en ik kreeg de optelling niet in de matrix die als vermenigvuldiging wordt gebruikt. Dat lukt alleen met dx, dy op de laatste rij en Z=1, waardoor ze automatisch in de x en y worden meegenomen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • T.T.
  • Registratie: April 2000
  • Laatst online: 17-11 15:58

T.T.

Sowieso

nee EfBe,
code:
1
2
[2] * [dx , 0] = [2*dx, 2*dy]
[2]   [0,  dy]

Als je dus punt (2,2) zou willen verplaatsen met (3,4), dan kom je op (2*3, 2*4) = (6,8) uit.
Dat is een schaling.

met een 3x3 matrix kun je wel gewoon transleren over 3,4:
code:
1
2
3
[2]* [1 , 0, 3] = [2+3, 2+4, 1]
[2]  [0,  1, 4]
[1]  [0,  0, 1]


fuck te laat 8)7

[ Voor 10% gewijzigd door T.T. op 04-03-2003 16:46 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-12 02:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

EfBe schreef op 04 maart 2003 @ 16:44:
je hebt gelijk. Ik zat wat te prutsen hiermee, en ik kreeg de optelling niet in de matrix die als vermenigvuldiging wordt gebruikt. Dat lukt alleen met dx, dy op de laatste rij en Z=1, waardoor ze automatisch in de x en y worden meegenomen.


u hebt zojuist het homogene coordinatenstelsel ontdekt :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
.oisyn schreef op 04 March 2003 @ 16:47:
u hebt zojuist het homogene coordinatenstelsel ontdekt :P
hehe ;) Ja dat krijg je als mensen met als specialisatie alles met databases iets met 3D gaan doen :D

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1