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

1

24.05.2008, 00:09

Rotations-Problem

Hi,

ich bin dabei tetris in 3D zu programmieren, allerdings habe ich hier ein kleines Problem. Wenn ein würfel fällt soll man ihn ja auch mit der [pfeil nach oben] taste drehen können um ihn richtig positionieren zu können, allerdings ist bei mir der fall, dass der würfel zwar richtig fällt, aber wenn ich ihn drehe (mit D3DXMatrixRotationZ), verschiebt sich der würfel auch an eine andere stelle ^^
Dh. sobald ich die [pfeil nach oben]-taste drücke, verschwindet der Würfel von seiner aktuellen position und wird weiter rechts oder links oder oben oder unten (kommt halt drauf an um welcher Achse ich das drehe) etwas gedreht dargestellt :cry:
Dabei soll man den Würfel auf seiner aktuellen position drehen können^^

GameLoop:

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
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
        else
        {
            Cinptm.getKeyboardInput(keys);

            speed = 0.05f;
            stop = -6.5f;
            rotationquestion = 0;
            //AddText(keys);

            if(keys[DIK_LEFT])
            {
                if (x != 1)
                {
                x--;  
                xposition -= 0.25f;
                }
            }
            else if(keys[DIK_RIGHT])
            {
                if (x != 20) 
                {
                x++;    
                xposition += 0.25f;
                }
            }
            else if(keys[DIK_UP])
            {
                rotationquestion = 1;
            }
            //speed erhöhen

            else if(keys[DIK_DOWN] && yposition > stop)
            {
                yposition -= speed; 
                y = static_cast<int>(abs(yposition) / 0.25f);
            }

            //Collision erkennen

            if(feld[x-1][y-1] == 1)
            {
                stop += (y-1)*0.25;
                //Addfloat(y-1);

            }

            //schritte zählen und y position versetzen

            if(yposition > stop)
            {
                yposition -= speed;
                y = static_cast<int>(abs(yposition) / 0.25f);
                //AddInt(feld[7][20]);

                //Addfloat(position);

            }

            
            D3DXMATRIX TransMatrix, RotationMatrix, WorldMatrix;
            D3DXMATRIX IdentityMatrix;
            Direct3D.BeginScene();

            // Das Vertex-Format festlegen

            Direct3D.GetDevice()->SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE );

            Direct3D.GetDevice()->SetStreamSource(0, VB_WALL, 0, sizeof(CustomVertex));
            D3DXMatrixIdentity(&IdentityMatrix);
            Direct3D.GetDevice()->SetTransform(D3DTS_WORLD, &IdentityMatrix);
            Direct3D.GetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 10);

            // Das Vertex-Format festlegen

            Direct3D.GetDevice()->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE );

            Direct3D.GetDevice()->SetStreamSource(0, VB_BUTTON, 0, sizeof(CustomVertex));
            D3DXMatrixIdentity(&IdentityMatrix);
            Direct3D.GetDevice()->SetTransform(D3DTS_WORLD, &IdentityMatrix);
            Direct3D.GetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

            

            // Das Vertex-Format festlegen

            Direct3D.GetDevice()->SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE );
 
            Direct3D.GetDevice()->SetStreamSource(0, VB_STONES, 0, sizeof(CustomVertex));
 
            D3DXMatrixTranslation(&TransMatrix, xposition,  yposition, 0.0f);
            D3DXMatrixIdentity(&RotationMatrix);
            if(rotationquestion == 1)
            {
                D3DXMatrixRotationZ(&RotationMatrix, 1.0f);
 
            }
            D3DXMatrixMultiply(&WorldMatrix, &TransMatrix,  &RotationMatrix);
            Direct3D.GetDevice()->SetTransform(D3DTS_WORLD, &WorldMatrix);
            Direct3D.GetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 10);

            Direct3D.EndScene();
        }


Den kompletten Source Code + compilierte exe gibts hier (59,3KB):
http://rebornx.re.funpic.de/tetris_3D.rar

2

24.05.2008, 00:18

probier mal aus der zeile

C-/C++-Quelltext

1
D3DXMatrixMultiply(&WorldMatrix, &TransMatrix,  &RotationMatrix);


folgendes zu machen

C-/C++-Quelltext

1
D3DXMatrixMultiply(&WorldMatrix, &RotationMatrix, &TransMatrix);


gibt allerdings keine garantie ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

24.05.2008, 00:33

Grundsätzlich gilt immer zuerst Rotation, dann Translation. Weil sich das Obejkt immer "um" den Ursprung dreht. Respektive dessen Achsen und nicht die des Objektes.

4

24.05.2008, 00:49

Habich gemacht ^^ bringt aber nicht viel ^^ jetzt is der würfel wieder an einer anderen position ^^

5

24.05.2008, 10:21

Irgendwer meinte mal, dass die Rotierachse verschoben sein kann. Allerdings weiß ich nicht wie bzw wo man das einstellen kann ^^

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

24.05.2008, 10:39

Das Problem ist die Position von deinem Objekt im lokalen Objectspace. Du hast das Objekt schon dort verschoben. Das heißt du rotierst zwar schon richtig, aber, weil sich dein Objekt nicht mehr im Nullpunkt befindet, nicht um die eigene Achse.
@D13_Dreinig

7

24.05.2008, 13:10

http://www.jliforum.de/board/viewtopic.php?t=5463

.....



Sei noch zu erwähnen, ein Objekt hat niemals so etwas wie eine Position oder so. Du hast nur einen Haufen von Matrizen die nacheinander angewandt werden. Du musst eben dafür sorgen dass die Reihenfolge stimmt.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

24.05.2008, 13:55

Zitat von »"Jonathan_Klein"«


Sei noch zu erwähnen, ein Objekt hat niemals so etwas wie eine Position oder so. Du hast nur einen Haufen von Matrizen die nacheinander angewandt werden. Du musst eben dafür sorgen dass die Reihenfolge stimmt.


Sei noch zu erwähnen: Jedes Objekt muss eine Position haben.
@D13_Dreinig

Werbeanzeige