Seite 1 von 1

Objekte rotieren lassen

Verfasst: 03.01.2015, 00:05
von gombolo
Hallo, ich habe einen einfachen Würfel der sich drehen soll.

Wenn ich die Drehung über die einzelnen Achsen machen geht das auch, aber wenn ich die Drehung über mehr als eine Achse mache taumelt das Objekt.

Code: Alles auswählen

			D3DXMatrixRotationYawPitchRoll(&mRotate,rotY, rotX, rotZ);
			D3DXMatrixTranslation(&mTranslation, fx, fy, fz);

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

			d3dDevice->SetTransform(D3DTS_WORLD, &tmpMesh->mWorld);
Ich denke das Objekt wird nicht im lokalen Koordinatensystem rotiert. Deshalb verhält es sich so seltsam. Ich habe aber keine Idee mehr.

Re: Objekte rotieren lassen

Verfasst: 03.01.2015, 16:17
von gombolo
Nach dem ich gestern die halbe Nacht rumprobiert habe und dachte jetzt habe ich es geht es immer noch nicht. Auch der Code unten funktionert nicht so wie er soll. Das Ding dreht sich immer an den Weltachsen.

Code: Alles auswählen

			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);

Re: Objekte rotieren lassen

Verfasst: 03.01.2015, 16:51
von gombolo
Bild


Wie auf dem großen Bild soll es rotieren, aber es rotiert ählich wie auf dem kleinen Bild. Vielleicht ist das Problem so besser erkennbar.

Re: Objekte rotieren lassen

Verfasst: 03.01.2015, 16:57
von Krishty
Von den Bildern her klingt es, als sei die Reihenfolge der Achsen vertauscht. Wenn du erst über X rotierst und dann über Y (immer global, denn das tun Rotationsmatrizen eben so), dann kommt etwas anderes raus als bei erst Y, dann X :)

Re: Objekte rotieren lassen

Verfasst: 03.01.2015, 17:07
von gombolo
Krishty hat geschrieben:immer global, denn das tun Rotationsmatrizen eben so
Ja wenn die immer global sind wie kann ich sowas machen. Der Würfel soll immer um die roten Achsen rotieren.

Bei mir rotiert es immer um die blauen Achsen.

Bild

Re: Objekte rotieren lassen

Verfasst: 03.01.2015, 17:59
von Jonathan
Ich meine, ich hätte mal ein ähnliches Problem gehabt und hätte es durch Vertauschen der Reihenfolge der Matrizen in der Transformationskette gelöst. (wenn du die Matrix von links dranmultiplizierst, ist es eine globale Rotation, von rechts eine lokale - oder andersherum :D). Ich muss sagen, ich finde die D3DX Aufrufe auch nicht wirklich hübsch, ich mag Matrizenobjekte mit Überladenen * Operator viel lieber, weil dann der Code genau so aussieht, wie man es auf dem Papier beim nachrechnen hinschreiben würde - und Übersicht ist in mathematischen Berechnungen immer sehr von Vorteil.

Re: Objekte rotieren lassen

Verfasst: 04.01.2015, 03:36
von gombolo
Das Problem konnte ich immer noch nicht lösen. Und ich habe Keine Ahnung mehr wie ich da rangehen soll. Es gibt so viele Beispiele wie man rotiert, aber die Objekte rotieren immer im Weltkoordinatensystem. Ich würde gerne das die Rotation einer Achse Auswirkungen auf die anderen Achsen bei der Rotation haben.

Sollte einer noch was dazu beitragen können würde ich mich sehr freuen.

Re: Objekte rotieren lassen

Verfasst: 04.01.2015, 13:37
von dot
Was genau willst du denn erreichen? So wie mir das aussieht, willst du wohl eine Kamerasteuerung implementieren!? Eulerwinkel sind rein prinzipiell nicht die tollste Sache, wenn es darum geht, Orientierungen und Rotationen zu beschreiben und insbesondere für Kameras (außer vielleicht für die typische mausgesteuerte FPS Kamera) meiner Erfahrung nach völlig unbrauchbar...Was für eine Art Kamera willst du denn?

Interessantes Video: https://www.youtube.com/watch?v=zc8b2Jo7mno

Re: Objekte rotieren lassen

Verfasst: 04.01.2015, 15:32
von gombolo
Nein, eine Kamerasteuerung will ich nicht. Ich will den Würfen auf den Bildern (oben) rotieren.

Ich möchte sowas erreichen

https://www.youtube.com/watch?v=4TyGQX_iRI4

Alle beschriebenen Rotationen rotieren den Würfen an den Achsen der Welt. Drehe ich den Würfen um die Y-Achse hat diese Drehen keine Auswirkung auf die anderen Achsen. Das ist meiner Meinung nach nicht richtig.

Re: Objekte rotieren lassen

Verfasst: 04.01.2015, 18:56
von gombolo

Code: Alles auswählen

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);
} 
Noch ein Code der nicht funktioniert. Gibt es hier keinen der das selbe Problem hatte. Oder habt ihr nicht ein Stück Code von euren Projekten?

Re: Objekte rotieren lassen

Verfasst: 04.01.2015, 19:11
von dot
gombolo hat geschrieben:Drehe ich den Würfen um die Y-Achse hat diese Drehen keine Auswirkung auf die anderen Achsen. Das ist meiner Meinung nach nicht richtig.
Was verwendest du denn für eine Rotationsreihenfolge? Wenn du die Rotation um Y als letztes durchführst, dann hat diese natürlich keine "Auswirkung" auf die Rotationen um die anderen Achsen, da um die anderen Achsen ja bereits rotiert wurde!?

Für das aus deinem Video brauchst du nur zwei Rotationen: Je nachdem wie du deine Achsen auslegst z.B. erst X und dann Y.

Re: Objekte rotieren lassen

Verfasst: 04.01.2015, 19:33
von gombolo
Ich habe keine Ahnung mehr was ich alles ausprobiert habe :)

Aber ich möchte eine Funktion

Rotierte( OBJEKT obj, float inX, float inY, float inZ)

Halt nur im lokalen Koordinatensystem.

Re: Objekte rotieren lassen

Verfasst: 05.01.2015, 00:14
von Schrompf
Dann musst Du immernoch die Reihenfolge der drei Rotationen um X, Y und Z festlegen. Zuerst X? Oder zuerst Z? Man verwendet einfach keine Eulerwinkel mehr, sorry.

Dein Problem kannst Du übrigens so lösen: Du wendest eine Rotation an, welche auch immer Du zuerst haben willst. Das wird die "innerste" Rotation. Wenn Du jetzt noch eine Rotation drin haben willst, kannst Du Dir einfach Deine Wunsch-Rotationsachse mit der aktuellen Objekttransformation transformieren. Dann rotierst Du im diese Achse.

Re: Objekte rotieren lassen

Verfasst: 05.01.2015, 01:27
von dot
gombolo hat geschrieben:Ich habe keine Ahnung mehr was ich alles ausprobiert habe :)

Aber ich möchte eine Funktion

Rotierte( OBJEKT obj, float inX, float inY, float inZ)

Halt nur im lokalen Koordinatensystem.
Ich dachte du willst eine Bewegung wie die im verlinkten Video!? Was genau soll "halt nur im lokalen Koordinatensystem" bedeuten? Eine Rotation um eine Achse verändert das lokale Koordinatensystem...

Re: Objekte rotieren lassen

Verfasst: 05.01.2015, 09:20
von gombolo
Ich habe das Problem erkannt. Die Rotation erfolgt immer über die Weltachsen. Würde ich in einem Flugzeug sitzen und es um 10 Grad in Y drehen und danach um 20Grad nach X, aber nicht mehr an der X-Achse des Flugzeugs sondern an der X-Achse des Flughafens würde ich mich als Pilot sicher sehr sehr sehr sehr wundern. ;)

Ich muss die Rotation an der lokal Achse des Flugzeugs durchführen. Das ist die Aufgabe, aber ich bin gerade dabei mich in das Thema einzuarbeiten. Leider sind die Feiertage rum und mein Problem muss warten :)

Trotzdem danke an euch. cu


*EDIT* Ha Leute jetzt habe ich es hinbekommen. Mensch ich war immer sooooo nah dran, aber ein blöder Fehler den ich die ganze Zeit nicht gesehen habe. Und den richtigen Code immer wieder gelöscht und falschen Code geschrieben habe.