Objekte rotieren bei bewegung falsch

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
BlackWolf73
Beiträge: 3
Registriert: 11.02.2010, 20:07

Objekte rotieren bei bewegung falsch

Beitrag von BlackWolf73 »

Hallo,

Ich habe 2 Objekte in einem 3D Raum, meine Kamera steht über dem Objekt 1 und schaut mit einem Winkel von 35 Grad darauf.
Meine Objekte drehe ich mit D3DXMatrixRotationAxis, das klappt auch wunderbar.

Jetzt möchte ich Objekt 1 zu dem X bewegen. Da Objekt 1 aber immer unter der Kamera bleiben soll, bewege ich also Objekt 2 entgegengesetzt.
Bild

und es passiert folgendes
Bild

Wiso dreht sich Objekt 2 ?
BlackWolf73
Beiträge: 3
Registriert: 11.02.2010, 20:07

Re: Objekte rotieren bei bewegung falsch

Beitrag von BlackWolf73 »

Ich denke mal das meine erste Beschreibung des Problems nicht ganz klar ist, deshalb versuche ich es etwas ausführlicher.

Also meine Kamera steht auf 0,-1000,0 und schaut mit einem Winkel von 35 Grad nach unten auf Objekt 1.

Objekt 1 steht bei 0,0,-1000 und um 90 Grad nach rechts gedreht.

Jetzt möchte ich Objekt 1 zu X bewegen, aber anstatt Objekt 1 jetzt die Koordinaten zu verändern, veränder ich von allen anderen die Koordinaten, hier ist das halt nur Objekt 2. Ich verschiebe also Objekt 2 entgegengesetzt als in die Richtung wo ich Objekt 1 hinbewegen möchte. Ich verschiebe also X und Objekt 2 nach links, anstatt Objekt 1 nach rechts.

Objekt 2 dreht sich aber bei der verschiebung Richtung Objekt 1, normal sollte es aber weiter geradeaus nach oben schauen.
Dirk Schulz
Establishment
Beiträge: 130
Registriert: 01.03.2009, 14:21
Alter Benutzername: frittentuete

Re: Objekte rotieren bei bewegung falsch

Beitrag von Dirk Schulz »

Hi,

also verschiebst du X und die Kamera entgegengesetzt zur Richtung von Objekt1. Warum verschiebst du die Kamera? Wenn du nur X an Objekt1 heranbewegst, hast du doch deine gewünschte Position.

Wie berechnest du denn deine Bewegungen? Nimmst du einfach die WorldMatrix und multiplizierst diese mit einer Translationsmatrix?

Etwas mehr Info oder Code wäre hilfreich.
BlackWolf73
Beiträge: 3
Registriert: 11.02.2010, 20:07

Re: Objekte rotieren bei bewegung falsch

Beitrag von BlackWolf73 »

Ich verschiebe nur X und Objekt 2, Objekt 1 und die Kamera bleiben wo sie sind.

Hier mal der Code dazu:

Hier setze ich Objekt 1 auf die feste Position

Code: Alles auswählen

sSpieler.posX = 0.0f;
    sSpieler.posY = 0.0f;
    sSpieler.posZ = -1000.0f;
    D3DXMatrixTranslation(&sSpieler.char_matPos, sSpieler.posX, sSpieler.posY, sSpieler.posZ);
    D3DXMatrixRotationX(&sSpieler.char_matRotX, D3DXToRadian(schar_spieler->rotX));
    D3DXMatrixRotationY(&sSpieler.char_matRotY, D3DXToRadian(schar_spieler->rotY));
    D3DXMatrixRotationZ(&sSpieler.char_matRotZ, D3DXToRadian(schar_spieler->rotZ));
    D3DXMatrixMultiply(&sSpieler.char_matWorld, &sSpieler.char_matRotX, &sSpieler.char_matRotY);
    D3DXMatrixMultiply(&sSpieler.char_matWorld, &sSpieler.char_matWorld, &sSpieler.char_matRotZ);
    D3DXMatrixMultiply(&sSpieler.char_matWorld, &sSpieler.char_matWorld, &sSpieler.char_matPos); 	
Das geht auch zum rendern.

Hier berechne ich die Bewegung von Objekt 1

Code: Alles auswählen

D3DXMatrixRotationAxis(&matRotY, &D3DXVECTOR3(0,1,0), D3DXToRadian(schar_spieler->rotY));
    D3DXVec3TransformCoord( &myCamera_vDir, &myCamera_vDir, &matRotY );
    D3DXVec3TransformCoord( &myCamera_vUP, &myCamera_vUP, &matRotY );
    D3DXVec3TransformCoord( &myCamera_vRight, &myCamera_vRight, &matRotY );
    D3DXMatrixRotationAxis(&matRotX, &D3DXVECTOR3(1,0,0), D3DXToRadian(schar_spieler->rotX));
    D3DXVec3TransformCoord( &myCamera_vDir, &myCamera_vDir, &matRotX );
    D3DXVec3TransformCoord( &myCamera_vUP, &myCamera_vUP, &matRotX );
    D3DXVec3TransformCoord( &myCamera_vRight, &myCamera_vRight, &matRotX );
    D3DXMatrixRotationAxis(&matRotZ, &D3DXVECTOR3(0,0,1), D3DXToRadian(schar_spieler->rotZ));
    D3DXVec3TransformCoord( &myCamera_vDir, &myCamera_vDir, &matRotZ );
    D3DXVec3TransformCoord( &myCamera_vUP, &myCamera_vUP, &matRotZ );
    D3DXVec3TransformCoord( &myCamera_vRight, &myCamera_vRight, &matRotZ );
    schar_spieler->posX = schar_spieler->posX + myCamera_vDir.x * schar_spieler->speed;
    schar_spieler->posY = schar_spieler->posY + myCamera_vDir.y * schar_spieler->speed;
    schar_spieler->posZ = schar_spieler->posZ + myCamera_vDir.z * schar_spieler->speed; 
Das ist nur dazu da um den Rest der Welt zu berechnen

Hier jetzt der Code für den Rest der Welt

Code: Alles auswählen

float PosX = (sSpieler.posX + schars[i].posX - schar_spieler->posX);
        float PosY = (sSpieler.posY + schars[i].posY - schar_spieler->posY);
        float PosZ = (sSpieler.posZ + schars[i].posZ - schar_spieler->posZ);

        D3DXMatrixTranslation(&cCharaketer[i].matPos, PosX, PosY, PosZ);
        D3DXMatrixRotationAxis(&cCharaketer[i].matRotX, &D3DXVECTOR3(1,0,0), D3DXToRadian(schars[i].rotX));
        D3DXMatrixRotationAxis(&cCharaketer[i].matRotY, &D3DXVECTOR3(0,1,0), D3DXToRadian(schars[i].rotY));
        D3DXMatrixRotationAxis(&cCharaketer[i].matRotZ, &D3DXVECTOR3(0,0,1), D3DXToRadian(schars[i].rotZ));
//        D3DXMatrixRotationX(&cCharaketer[i].matRotX, D3DXToRadian(schars[i].rotX));
//        D3DXMatrixRotationY(&cCharaketer[i].matRotY, D3DXToRadian(schars[i].rotY));
//        D3DXMatrixRotationZ(&cCharaketer[i].matRotZ, D3DXToRadian(schars[i].rotZ));
        D3DXMatrixMultiply(&cCharaketer[i].matWorld, &cCharaketer[i].matRotX, &cCharaketer[i].matRotY);
        D3DXMatrixMultiply(&cCharaketer[i].matWorld, &cCharaketer[i].matWorld, &cCharaketer[i].matRotZ);
        D3DXMatrixMultiply(&cCharaketer[i].matWorld, &cCharaketer[i].matWorld, &cCharaketer[i].matPos); 
Dies geht auch wieder zum rendern.

Wie gesagt, die Positionen werden alle korrekt angezeigt, auch die Bewegungen stimmen, nur wird Objekt 2 halt gedreht.

Hab mal ein Video gemacht was passiert, ist 8MB groß
http://www.thm-cbm.de/video.avi
Boomhower
Beiträge: 6
Registriert: 08.07.2008, 20:34

Re: Objekte rotieren bei bewegung falsch

Beitrag von Boomhower »

Hallo!
"Leicht" verworren ist das ganze für mich.
Ich kann das ganze jetzt nach diverser Betrachtungszeit nicht nachvollziehen aber wenn ich dir einen Rat geben darf, dann änder die Koordinaten von denjenigen Objekten die du bewegen willst (oder ist dir das zu einfach?). Wenn du in dem Programm mal irgendwelche komplexeren Bewegungen machen willst, wird dich diese Methode ganz sicher auf nen Holzweg führen.
Tut mir echt leid aber das ganze ist extrem verwirrend, sowas hab ich echt noch nie gesehn^^
Vielleicht nochmal ne ausführliche Beschreibung in Pseudocode oder so...
Benutzeravatar
exploid
Establishment
Beiträge: 146
Registriert: 21.08.2005, 18:33

Re: Objekte rotieren bei bewegung falsch

Beitrag von exploid »

...
All your base are belong to us! Justice
Antworten