Objekte rotieren lassen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Objekte rotieren lassen

Beitrag 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.
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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);
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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.
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
Krishty
Establishment
Beiträge: 8239
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Objekte rotieren lassen

Beitrag 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 :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
Jonathan
Establishment
Beiträge: 2369
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Objekte rotieren lassen

Beitrag 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.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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.
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Objekte rotieren lassen

Beitrag 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
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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.
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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?
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Objekte rotieren lassen

Beitrag 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.
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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.
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Objekte rotieren lassen

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Objekte rotieren lassen

Beitrag 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...
Benutzeravatar
gombolo
Establishment
Beiträge: 145
Registriert: 26.01.2011, 20:33

Re: Objekte rotieren lassen

Beitrag 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.
MEIN AKTELLES PROJEKT -> FirstStrike PLAY THE DEMO

NEUER ENDBOSS -> schau dir das Video an

WAS ICH SONST SO MACHEN -> Grafik und Design

ICH MACH MAL SCHNELL EINE 3D ENGINE -> oyname 3DEngine
Antworten