Drehung in Ebene
-
Hallo!
Ich hab ein kleines Problemchen mit Drehungen in der Ebene. Und zwar geht es darum, ein Skelett (mit gegebener Wirbelsäule usw.) zu entfalten.
Ich habe Kammolche (sone ARt Eidechse), die sind auf Bildern so ein bisschen gefaltet, also die liegen nicht ganz gerade (sieht man auf den Bildern aber gut was ich meine). Meine Aufgabe ist es, die Dreiecke, die die Eidechse bilden gerade zu drehen. Also der Bauch is in Dreiecke unterteilt und die Wirbelsäule (die Mitte davon) soll gerade gedreht werden und die Dreiecke, die den Körper bilden natürlich mit.Meine Idee dafür ist diese:
Ich fange hinten an (unten) und berechne den Winkel von den zwei letzten Stuecken der Wirbelsäule. Alle folgenden Punkte drehe ich dann um diesen Winkel, damit das Teilstück gerade ist. Die Punkte die direkt am Knoten der beiden Teile sind, drehe ich nur mit dem halben Winkel. Eigentlich müsste das ja funktionieren, denk ich ma, oder?
Aber auf dem Bild sieht man, dass es nicht geht. Schritt eins zeigt das Ausgangsbild. Bei Schritt 2 wurde der letzte Teil gedreht (sieht auch ganz gut aus)
Schritt 3 dreht dann den nächsten Teil, aber da sieght es dann schon total blöd aus und es wird immer schlimmer, wie man auf den folgenden Bildern sieht.Bild: [img=http://images1.pictiger.com/thumbs/e2/a120b762d26d4f5f51a7ad9c9ecf25e2.th.jpg]
Ich zeig hier mal den Code, wie ich das drehen mache:// Matrizen zum Drehen sMatrix MatRotation(const sCoords& Around, float angle) { FVALUE c = cos(angle); FVALUE s = sin(angle); sMatrix m = MatIdentity(); m._11 = c; m._12 = -s; m._13 = Around.x*(1-c) + Around.y*s; m._21 = s; m._22 = c; m._23 = Around.y*(1-c) - Around.x * s; m._31 = 0; m._32 = 0; m._33 = 1; return m; } sCoords MatTransformCoords(const sCoords& p, const sMatrix& m) { sCoords r; r.x = p.x * m._11 + p.y * m._12 + m._13; r.y = p.x * m._21 + p.y * m._22 + m._23; return r; } // Funktion zum begradigen void cExtractor::StraightenSpine(int nr) { // TransSpinePoints ist Wirbelsäule // TransTLPoints und transRTPoints sind linke und rechte Dreieckspunkte // nr gibt an, bis zu welchem Teil von hinten an gedreht werden soll if(nr == -1) nr = 0; for(int i = nr; i < m_TransSpinePoints.size() - 1; i++) { sVector v1; if(i == 0) v1 = sVector(0, 1); else v1 = m_TransSpinePoints[i] - m_TransSpinePoints[i-1]; sVector v2 = m_TransSpinePoints[i+1] - m_TransSpinePoints[i]; // Winkel zwischen beiden teilen berechnen float scalar = (v1.x * v2.x + v1.y * v2.y) / (VectorLen(v1) * VectorLen(v2)); float angle = acosf(scalar); sRay r = BuildRay(m_TransSpinePoints[i], v1); float c = PointLineCoords(m_TransSpinePoints[i+1], r); // links oder rechts rum drehen? if(c > 0) angle = -fabsf(angle); else angle = fabsf(angle); // folgende Punkte Transformieren sMatrix matRot = MatRotation(m_TransSpinePoints[i], angle); for(int p = i+1; p < m_TransSpinePoints.size(); p++) { m_TransLTPoints[p] = MatTransformCoords(m_TransLTPoints[p], matRot); m_TransRTPoints[p] = MatTransformCoords(m_TransRTPoints[p], matRot); m_TransSpinePoints[p] = MatTransformCoords(m_TransSpinePoints[p], matRot); } // Punkte am Knoten nur mit halbem Winkel drehen matRot = MatRotation(m_TransSpinePoints[i], angle / 2); m_TransLTPoints[i] = MatTransformCoords(m_TransLTPoints[i], matRot); m_TransRTPoints[i] = MatTransformCoords(m_TransRTPoints[i], matRot); } }
Ich hoffe, mir kann jemand helfen
Gruß, Maxi
-
hat niemand eine idee, woran das liegen könnte?
Ist meine Matrix richtig und die transformation mit dem vektor auch?
-
solltest du nicht immer 2 eckpunkte weitergehn?