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?


Anmelden zum Antworten