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

04.01.2015, 01:34

Objekt rotieren

Ich habe ein Problem wenn ich einen Würfel mit DirectX rotieren will.

Die Rotationsachsen sind nicht auf den Würfel bezogen. Ich habe festgestellt das ich eine Achse immer so rotiere wie ich es mir vorstelle, aber die Rotation auf einer Achse hat keinen Einfluss auf die Rotation einer anderen Achse. Die rotiert, so denke ich mir, immer imWeltkoordinatensystem.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
            D3DXMatrixIdentity(&tmpMesh->mTranslation);

            // Position/Rotation/Skalierung
            D3DXMatrixRotationY(&tmpMesh->mRy,tmpMesh->fRotateY);
            tmpMesh->mRotate = tmpMesh->mRy * tmpMesh->mRotate;

            D3DXMatrixRotationX(&tmpMesh->mRx,tmpMesh->fRotateX);
            tmpMesh->mRotate = tmpMesh->mRx * tmpMesh->mRotate;

            D3DXMatrixRotationZ(&tmpMesh->mRz,tmpMesh->fRotateZ);
            tmpMesh->mRotate = tmpMesh->mRz * tmpMesh->mRotate;


Das geht nicht

C-/C++-Quelltext

1
2
3
4
5
6
D3DXMatrixRotationYawPitchRoll(&mRotate,rotY, rotX, rotZ);
D3DXMatrixTranslation(&mTranslation, fx, fy, fz);

tmpMesh->mWorld = tmpMesh->mRotate * tmpMesh->mTranslation;

d3dDevice->SetTransform(D3DTS_WORLD, &tmpMesh->mWorld);


so ging es auch nicht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tmpMesh->vLook = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
tmpMesh->vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
tmpMesh->vRight = D3DXVECTOR3(1.0f, 0.0f, 0.0f);

// Y-Achse
D3DXMatrixRotationAxis(&tmpMesh->mRy, &tmpMesh->vUp,tmpMesh->fRotateY);
D3DXVec3TransformCoord(&tmpMesh->vRight,&tmpMesh->vRight,&tmpMesh->mRy);
D3DXVec3TransformCoord(&tmpMesh->vLook,&tmpMesh->vLook,&tmpMesh->mRy);

// X-Achse
D3DXMatrixRotationAxis(&tmpMesh->mRx, &tmpMesh->vRight,tmpMesh->fRotateX);
D3DXVec3TransformCoord(&tmpMesh->vUp,&tmpMesh->vUp,&tmpMesh->mRx);
D3DXVec3TransformCoord(&tmpMesh->vLook,&tmpMesh->vLook,&tmpMesh->mRx);

// Z-Achse
D3DXMatrixRotationAxis(&tmpMesh->mRz,&tmpMesh->vLook,tmpMesh->fRotateZ);
D3DXVec3TransformCoord(&tmpMesh->vUp,&tmpMesh->vUp,&tmpMesh->mRz);
D3DXVec3TransformCoord(&tmpMesh->vRight,&tmpMesh->vRight,&tmpMesh->mRz);


Dieser Versuch scheiterte auch.

Ich würde mich über Hilfe freuen.

Ein Beispiel wie es funktionieren sollte ->

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gombolo« (04.01.2015, 11:54)


FSA

Community-Fossil

  • Private Nachricht senden

2

04.01.2015, 16:15

Du willst also im Objektraum rotieren. Dann musst du einfach die vorherige Rotation mit der neuen Multiplizieren.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

3

04.01.2015, 17:40

Hmm ok, aber das habe ich schon einige male durchgespielt

Du meinst doch so?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
            D3DXMatrixRotationAxis(&lpMesh->mRy, &lpMesh->vUp, -lpMesh->fRotateY);

            D3DXMatrixRotationAxis(&lpMesh->mRx, &lpMesh->vRight, lpMesh->fRotateX);
            
            D3DXMatrixRotationAxis(&lpMesh->mRz, &lpMesh->vLook, lpMesh->fRotateZ);

            neueRotation = lpMesh->mRy * lpMesh->mRx * lpMesh->mRz;

            lpMesh->mRotate = lpMesh->mRotate * neueRotation  ;


oder?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
inline void Rotate(LPMESH lpMesh, float x, float y, float z)
{
                                    // Neue Rotation
    D3DXMATRIX mRotX, mRotY, mRotZ, mRotation;
    D3DXMatrixRotationX(&mRotX, -x);
    D3DXMatrixRotationY(&mRotY, -y);
    D3DXMatrixRotationZ(&mRotZ, -z);

    mRotation = mRotY * mRotZ *  mRotX;

    // Lokale Rotationsmatrix
    D3DXMatrixIdentity(&lpMesh->mRotate);
    D3DXMatrixMultiply(&lpMesh->mRotate, &mRotation, &lpMesh->mRotate);

    D3DXMatrixMultiply(&lpMesh->mRotate, &lpMesh->mTranslation, &lpMesh->mRotate);
} 


Auch der Code geht nicht so wie es soll. Gibt wohl keinen im deutschprachigen Raum der das Problem hatte oder es gelöst hat, aber auch in den englischen Foren konnte ich nichts finden (wobei mein englisch sehr schlecht ist)

Naja, ich hoffe mal das es einen gibt der mir helfen kann. cu

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gombolo« (04.01.2015, 18:58)


Werbeanzeige