Wie berechne ich den Mittelpunkt eines Rechtecks?
-
Meine gespeicherte Position ist die links oberste Ecke des Rechtecks. Wenn ich es jetzt transliere und rotiere, dann verändert sich diese gespeicherte Position und ich kann nicht mehr einfach +Breite/2, + Höhe/2 rechnen.
Hab schon versucht mit inverser Rotationsmatrix zu multiplizieren, gab aber falsche Werte.
Jemand ne Idee?
-
Es sollte eigentlich klappen, wenn du die inverse Rotationsmatrix mit den Vektoren multiplizierst.
Der Mittelpunkt des Rechtecks ABCD ist 0A + AB/2 + BC/2, einfach mit den Verbindungsvektoren der Punkte arbeiten.
-
Danke, benutze aber das DirectX Sprite Interface, hab also keine AB BC Vektoren sondern immer nur die links obere Position..die mittransformiert wird.
Naja wenn du sagst dass das mit der inversen Rotationsmatrix funktionieren müsste...dann muss es wohl
-
Die inverse Rotationsmatrix ist nichts anderes als die Rotationsmatrix mit -α statt α, also die Drehung in die Rückrichtung. Deshalb sollte ein mit der Rotationsmatrix R transformierter Punkt durch Multiplikation mit R^-1 wieder auf seiner Ausgangsposition landen.
edit: wichtig ist hierbei die natürlich die Richtung, in der du multiplizierst, d.h. du kannst nicht einen per p_neu = R*p gewonnenen Punkt per p_neu*R^-1 zurücktransformieren, sondern du musst auch R^-1 wieder von links multiplizieren: p = (R^-1)*p_neu (es würde auch gar nicht gehen, es sei denn, du hast die Matrizenmultiplikation falsch implementiert
)
-
0A + AB/2 + BC/2 kannst du auch als 0A + AC/2 bzw (A+C)/2 sehen und genau das hast du
-
C hab ich doch auch nicht wenn A rotiert ist.
@Heinzellotto: Ich hab probiert die Multiplikation umzudrehen, aber gibt sofort Unendlichkeitswerte bei der Position.
Also bei mir klappt im Moment gar nichts mehr, ich schaffs nichtmal ein einfaches Sprite zu rotieren. Wenn ich um den Mittelpunkt rotieren will, brauch ich den Mittelpunkt. Den Mittelpunkt rechne ich aber aus indem ich die Rotation invertiere...es sind ein paar Zeilen Code die für mich im Moment einfach eine Wand sind, vielleicht seht ihr den offensichtlichen Fehler?
Im Moment: wenn ich ein paar Mal setRotation aufrufe, geht meine Position und Mitte des Sprites gegen unendlich..aarrrg.void SpriteModel::setPosition(float x,float y) { D3DXMatrixTranslation(&m_translationMatrix,x,y,0); D3DXMatrixMultiply(&m_worldMatrix,&m_worldMatrix,&m_translationMatrix); }
void SpriteModel::setRotation(float rad) { this->rotation = rad; D3DXVECTOR2 rotationCenter= D3DXVECTOR2(getCenterPosition().x, getCenterPosition().y); D3DXMatrixTransformation2D(&m_rotationMatrix,0,0,0,&rotationCenter,rad,0); D3DXMatrixMultiply(&m_worldMatrix,&m_worldMatrix,&m_rotationMatrix); }
D3DXVECTOR3 SpriteModel::getCenterPosition() { D3DXMATRIX inverseRotation; D3DXMatrixInverse(&inverseRotation,NULL,&m_rotationMatrix); D3DXMATRIX originalPosition; D3DXMatrixMultiply(&originalPosition,&inverseRotation,&m_translationMatrix); return D3DXVECTOR3(originalPosition._41 + Breite/2,originalPosition._42 + Höhe/2, 0); }
-
Ok habs jetzt auf andere Weise gelöst, danke Leute!
Warum die Multiplikation mit der inversen Rotationsmatrix nicht funktioniert hat, weiß ich bis jetzt nicht, aber ich habe untransformierte Position einfach am Anfang gespeichert und immer mit der neuesten Translation der transformierten Position geupdated.