JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=3f05268058668de7e4d4ef79677b8be3Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Rotations-Problem

 
Neues Thema eröffnen   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 24.05.2008, 08:23    Titel: Rotations-Problem Antworten mit Zitat

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 Crying or Very sad
Dabei soll man den Würfel auf seiner aktuellen position drehen können^^

GameLoop:
CPP:
        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
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.05.2008, 11:04    Titel: Antworten mit Zitat

Hi
Rotation erfolg IMMER um den Ursprung. Stell dir einen Kreis vor mit dem Mittelpunkt im Ursprung:

(Der Punkt im Mittelpunkt bleibt gleich, alle anderen Punkte bewegen sich auf einer Kreisbahn die jeweils den Ursprung als Zentrum hat).

Der Mittelpunkt wird theoretisch um sich selbst gedreht, aber da ein Punkt keine Ausrichtung hat, merkt man das nicht. Jetzt überleg dir, du schiebst dein Objekt aus dem Mittelpunkt heraus und drehst dann. Es wird logischerweise seine Position verändern (so wie die Eckpunkte des Vierecks auch ihre Position verändern).
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.05.2008, 11:12    Titel: Antworten mit Zitat

Ich habe keine Lust an 2 Seiten auf das selbe Problem zu antworten. Weiter gehts hier:

http://www.spieleprogrammierer.de/phpBB2/viewtopic.php?p=104312#104312

(das problem ist eh schon so gut wie gelöst).
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum