2009-07-05 9 views
3

In meinem aktuellen OpenGL-Projekt versuche ich, die Glieder einer Kette an die Konturen einer Bezier-Kurve anzupassen. Wie kann ich den Winkel zwischen zwei Punkten auf der Kurve finden, so dass ich die Glieder der Kette so positionieren kann, dass sie der Kurve folgen.Wie kann ich den Winkel zwischen zwei Punkten auf einer Bezierkurve finden?

Here ist ein Bild von der Kurve und Kette, ich brauche eine Art der Drehung der Links, so dass sie der Kurve folgen.

Weiß jemand hier, wie man das macht?

Antwort

4

Vielleicht so etwas wie this ist das, was Sie brauchen.

How to calculate the tangent to a Bezier curve

Das ist schwer zu finden online. Es muss ein Geheimnis sein, das von denen, die es wissen, eng gehalten wird. Oh, Sie können die mathematischen Formeln finden, aber haben Sie Spaß, sie zu interpretieren, wenn Sie kein Mathematiker sind. Also, was ist ein schlechter Entwickler zu tun? Zurück zur Schule gehen.

Ich verbrachte ein paar Tage damit, meinen Schädel über diesen zu schlagen. Ich habe mein Gehirn gegoogelt (was einfacher war, als mein Schädel schon genug eingeschlagen war). Dann, an einem strahlend schönen Samstag, war ich in meinem Verlies meines Entwicklers eingeschlossen, um meine müden Knochen zu ruhen. Ich hatte den Fernseher vor mir und Wikipedia auf der rechten Seite und da wechselte ich faul zwischen beiden hin und her.

Continue Reading...

+0

Als ich den verlinkten Artikel las, klickten plötzlich alle Stunden, die ich damit verbrachte, meine eigenen Bezier-Kurven zu verstehen und zu codieren, ein. Vielen Dank! – Liam

+0

+1 für die schönen Animationen allein. Ich liebe es, diese Art von Sachen zu sehen :) – Sampson

+7

Link ist kaputt. Sie sollten keine Links veröffentlichen. –

0

Lassen Sie die Punkte auf Ihrer Bezier-Kurve A und B. Normalisieren Sie den Vektor AB so, dass er die Länge 1 hat. Lassen Sie dies AB_norm sein. Dann benutze asin (AB_norm.y) oder acos (AB_norm.x), um den Winkel zu erhalten. Ein Winkel von 0 Grad ist dann ein horizontaler Vektor nach rechts. C-Stil Pseudo-Code folgt:

get_angle(Point A, Point B) { 
    AB.x = B.x - A.x; 
    AB.y = B.y - A.y; 
    length = sqrt(AB.x * AB.x + AB.y * AB.y); 

    AB_norm.y /= AB.y/length; 
    angle = asin(AB_norm.y); 
    // or 
    // AB_norm.x /= AB.x/length; 
    // angle = acos(AB_norm.x); 
} 

angle = get_angle(A, B); 
glRotatef(angle, 0.0f, 0.0f, 1.0f); 
// Draw the chain link here 
0

Sie müssen einige hier math. Sie können tangentiale, normale und binormale Vektoren finden, und dann können Sie den Winkel finden. Wenn Sie noch interessiert sind, lassen Sie es mich wissen, ich habe einige Details zu diesem Thema.