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