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.
und es passiert folgendes
Wiso dreht sich Objekt 2 ?
Objekte rotieren bei bewegung falsch
-
- Beiträge: 3
- Registriert: 11.02.2010, 20:07
-
- Beiträge: 3
- Registriert: 11.02.2010, 20:07
Re: Objekte rotieren bei bewegung falsch
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.
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.
-
- Establishment
- Beiträge: 130
- Registriert: 01.03.2009, 14:21
- Alter Benutzername: frittentuete
Re: Objekte rotieren bei bewegung falsch
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.
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.
-
- Beiträge: 3
- Registriert: 11.02.2010, 20:07
Re: Objekte rotieren bei bewegung falsch
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
Das geht auch zum rendern.
Hier berechne ich die Bewegung von Objekt 1
Das ist nur dazu da um den Rest der Welt zu berechnen
Hier jetzt der Code für den Rest der Welt
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
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);
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;
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);
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
Re: Objekte rotieren bei bewegung falsch
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...
"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...