Du bist nicht angemeldet.

Werbeanzeige

1

11.09.2010, 01:14

Zentriert Rotieren

Hallo, ich habe ein "Viereck" das ich Rotieren möchte. soweit auch kein Problem. Nur möchte ich es zentriert Rotieren und nicht wie es sosnst um die obere linke Ecke. Ein kleines Beispiel wäre super. Danke.

Stazer

Alter Hase

Beiträge: 470

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

2

11.09.2010, 01:17

Die Mitte mit einer Funktion bestimmen.
Dabei die Größe des Bildes durch zwei dividieren.

C-/C++-Quelltext

1
Sprite.SetCenter ( Image.GetHeight ( ) / 2 , Image.GetWidth ( ) / 2 ) ;


MfG Stazer

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

3

11.09.2010, 01:17

Ich bin mir nicht ganz sicher, ob es so funktioniert, aber ich hätte das Viereck als erstes so verschoben, dass (0|0) in der Mitte liegt, dann rotiert und anschließend wieder zurückverschoben.

drakon

Supermoderator

Beiträge: 6 523

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

11.09.2010, 01:18

Beispiel wird ohne dein Code schwierig. ;)

Aber prinzipiell musst du das Viereck um die Hälfte der Grösse nach links und oben schieben, dann rotieren und dann wieder zurückschieben.

Wenn du linke obere Ecke z.b (0,0) ist und die Grösse des Vierecks (100,100) ist, dann schiebst du das Viereck im (-50,-50), rotierst und verschiebst es um (50,50) zurück.

5

11.09.2010, 01:18

Also Verschieben dann mit SetTransform setzen und wieder zurück oder wie Funktioniert das?

Oder Multiplizier ich die Erst alle und setzt sie dann mit SetTransform?

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

6

11.09.2010, 01:35

Ein Beispiel in Worte:
Du hast ein Viereck (Quadrat) à 5x5cm, das du um 50° dreehen willst.

Der Ursprung liegt in der linken oberen Ecke, also verschiebst du das Viereck so (um -2,5, -2,5), dass er auf (2,5|2,5) liegt, rotierst um 50° und verschiebst wieder zurück (um 2,5, 2,5).

Du wendest hier also mTranslation * mRotation * mTranslation an.

7

11.09.2010, 01:46

Ich habs jetzt so Versucht:

C-/C++-Quelltext

1
2
3
4
5
6
D3DXMatrixRotationYawPitchRoll(&RotMatrix, fRotation,0,0);

D3DXMatrixTranslation(&TransMatrix , SpriteList[iSpriteID].vPosition.x - (SpriteList[iSpriteID].iWidth/2) ,SpriteList[iSpriteID].vPosition.y - (SpriteList[iSpriteID].iHeight/2) ,SpriteList[iSpriteID].vPosition.z); 
D3DXMatrixTranslation(&TransMatrix2 , SpriteList[iSpriteID].vPosition.x + (SpriteList[iSpriteID].iWidth/2) ,SpriteList[iSpriteID].vPosition.y + (SpriteList[iSpriteID].iHeight/2) ,SpriteList[iSpriteID].vPosition.z);

ss_r.D3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&(TransMatrix*RotMatrix*TransMatrix2)));


Hoffe die Variable namen sind selbst erkärend ^^

Leider Funktioniert das ganze nicht. Statt um den Mittelpunkt dreht es jetzt in einer Riesigen bahn. (die Breite und Höhe sind Korrekt (iHeight und iWidth)

David_pb

Community-Fossil

Beiträge: 3 887

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

11.09.2010, 10:48

Vllt eher:

C-/C++-Quelltext

1
ss_r.D3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&(TransMatrix2*RotMatrix*TransMatrix)));
@D13_Dreinig

9

11.09.2010, 18:51

Macht leider keinerlei unterschied

David_pb

Community-Fossil

Beiträge: 3 887

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

11.09.2010, 18:57

Macht leider keinerlei unterschied


Das sollte allerdings einen Unterschied machen, weil du die Operationen umgedreht hast! Stell doch mal den bisherigen relevanten Code zur Verfügung.
@D13_Dreinig

Werbeanzeige