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

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

1

25.01.2010, 20:02

Rotation um eigene Achse Problem ( DirectX )

ja hallo erstmal,
hab jetzt eine rotation in mein spiel mit eingefügt geht alles einwandfrei mit den eigenen Achsen, nur wenn ich mein Objekt rotieren lasse rotiert er sich um den Nullpunkt von meinem Objekt und das is die linke obere Ecke nur ich will mein Objekt ganz um sich selbst rotieren, dass der Nullpunkt die mitte des Objekts ist ( z.b. bei sfml Sprite.SetCenter(mitte des Bilds); )
sowas würde ich gerne einbauen, aber wo muss ich die Position eintragen?
in meine drei eigene Achsen?
New Project: Operation CityRacer

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

25.01.2010, 20:06

Verschieb das Objekt zuerst um die Hälfte der Breite/Höhe/Tiefe in die Gegenrichtung zum Mittelpunkt. Dann rotierst du und schiebst das Objekt wieder um den Wert, den du vorher verschoben hast zurück.

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

3

25.01.2010, 20:21

C-/C++-Quelltext

1
2
3
4
5
    D3DXMATRIX matWorld;
    D3DXMATRIX matTranslation;
    D3DXMatrixTranslation(&matTranslation,m_fXPos+m_fWidth/2,m_fYPos+m_fHeight/2,m_fZPos);
    D3DXMatrixRotationAxis(&matRotation,&vZ,D3DXToRadian(m_dRotation));
    D3DXMatrixMultiply(&matWorld, &matRotation, &matTranslation);


hmm...und wo soll ich das Objekt wieder zurückschieben ?
New Project: Operation CityRacer

4

25.01.2010, 21:20

Du kannst doch auch einfach um die y-achse rotieren dann rotiert das Obkjekt auch um sich selbst oder?
Metal ist keine Musik sondern eine Religion.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

25.01.2010, 21:23

Zitat von »"Fabian Kock"«

Du kannst doch auch einfach um die y-achse rotieren dann rotiert das Obkjekt auch um sich selbst oder?

Kommt drauf an, wie die Vertices angeordnet sind. Er sagt ja, dass sich das Objekt um die linke obere Ecke rotiert, was ja falsch ist.

@Nexxtron
Ja und jetzt noch einmal zurück verschieben und nochmals multiplizieren.

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

6

25.01.2010, 21:33

mit welcher matrix muss ich dann multiplizieren? matWorld? ich probiers mal aus

Edit: hmmm...irgendwie funkts net, habe alle möglichen sachen ausprobiert

C-/C++-Quelltext

1
2
3
4
// .... das von oben und dann

D3DXMatrixTranslation(&matTranslation,m_fXPos,..,..);
// und dann ? so?

D3DXMAtrixTranslation(&matWorld, &matWorld, &matTranslation);

oder hab ich irgendwas anderes wichtiges vergessen?
New Project: Operation CityRacer

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

7

26.01.2010, 10:48

Wie gehabt. Du musst es nur vorher verschieben, wie Drakon schon sagte, weil die Objekte immer um ihren Null-Punkt rotiert werden.

Sprich wenn dein Objekt nun von 0,0,0 bis 10,10,10 geht, dann musst du's vor der Rotation erst einmal um -5,-5,-5 verschieben (translate), so dass die Mitte des Würfels auch 0,0,0 entspricht. (und der Würfel also von -5,-5,-5 nach 5,5,5 geht).

LG
Alyx

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

8

26.01.2010, 13:37

hä? ich peil grad gar nichts mehr ich kann doch nur 2 matrizen miteinander multiplizieren?

So mein code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    D3DXMATRIX matWorld, matWorld2;
    D3DXMATRIX matTranslation;
    m_fXPos -= m_fWidth/2;
    m_fYPos -= m_fHeight/2;
    D3DXMatrixTranslation(&matTranslation,m_fXPos,m_fYPos,0);
    D3DXMatrixMultiply(&matWorld, &matRotation, &matTranslation);
    m_fXPos += m_fWidth/2;
    m_fYPos += m_fHeight/2;
    D3DXMatrixTranslation(&matTranslation,m_fXPos,m_fYPos,0); 
    D3DXMatrixMultiply(&matWorld, &matWorld, &matTranslation);


kann mir einer sagen was daran falsch is, oder mir ihn einfach verbessern? ich versteh einfach nich wie ich es zurück translieren muss..,.
New Project: Operation CityRacer

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

9

26.01.2010, 13:59

Direct3D ist bei mir schon ein Jahrzehnt her, aber du kannst durchaus mehrmals multiplizieren, das musst du teilweise auch.

1. Objekt zentrieren, damit der Mittelpunkt bei 0,0,0 liegt
2. Objekt rotieren
3. Objekt an seine "echte" Position verschieben
4. Objekt mit World Matrix multiplizieren.

Ungefähr so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    D3DXMATRIX otrans,orot,wtrans;
    double mx = -m_fWidth/2;
    double my = -m_fHeight/2;
    double mz = -m_fDepth/2;

    // zentrieren
    D3DXMatrixTranslation(&otrans,mx,my,mz);

    // rotationsmatrix
    D3DXMatrixRotationYawPitchRoll(&orot,nick,gier,roll);

   // um mittelpunkt rotieren
   D3DXMatrixMultiply(&orot, &otrans, &orot);

   // welt-positions-matrix
   D3DXMatrixTranslation(wtrans,m_fXPos,m_fYPos,m_fZPos);

   // welt+position + rotation kombinieren
   D3DXMatrixMultiply(&wtrans, &orot, &wtrans);
  
   // mit world matrix kombinieren
    D3DXMatrixMultiply(&matWorld, &wtrans,  &matWorld); 

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

10

26.01.2010, 14:25

k thx werd ich mal so nochma versuchen aber eigentlich will ich ja mein objekt um die eigene achse drehen also (relativ), weil dieses yaw pitch roll für die globalen achsen ja sind...hab schon eine eigenes Achsensystem definiert gehabt also so meinte ich:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
vXAchse = D3DXVECTOR3(1,0,0);
vYAchse = D3DXVECTOR3(0,1,0);
vZAchse = D3DXVECTOR3(0,0,1);

// und dann beim Rotieren


    D3DXMatrixRotationAxis(&matRotation,&vZAchse,D3DXToRadian(m_dRotation));
    D3DXVec3TransformNormal(&vXAchse,&vXAchse,&matRotation);
    D3DXVec3TransformNormal(&vYAchse,&vYAchse,&matRotation);



EDIT:

thx es geht
New Project: Operation CityRacer

Werbeanzeige