2011-01-15 7 views
5

Ich habe ein Objekt, mit dem ich eine Bezier-Kurve folgen lassen möchte und bin jetzt ein wenig verloren, um es auf der Grundlage der Zeit und nicht der Punkte zu machen, die die Kurve ausmachen.Ein Objekt in Richtung einer Bezier-Kurve bewegen?

. :: Aktuelles System ::. Jedes Objekt in meinem Szenegraph wird aus Positions-, Drehungs- und Skalierungsvektoren erstellt. Diese Vektoren werden verwendet, um ihre entsprechenden Matrizen zu bilden: Skalierung, Rotation und Translation. Diese werden dann in dieser Reihenfolge multipliziert, um die lokale Transformationsmatrix zu bilden. Eine Welttransformation (normalerweise die Identitätsmatrix) wird dann mit der lokalen Matrixtransformation multipliziert.

class CObject 
{ 
public: 
// Local transform functions 
Matrix4f GetLocalTransform() const; 
void SetPosition(const Vector3f& pos); 
void SetRotation(const Vector3f& rot); 
void SetScale(const Vector3f& scale); 

    // Local transform 
    Matrix4f m_local; 
    Vector3f m_localPostion; 
    Vector3f m_localRotation; // rotation in degrees (xrot, yrot, zrot) 
    Vector3f m_localScale; 
} 

Matrix4f CObject::GetLocalTransform() 
{ 
    Matrix4f out(Matrix4f::IDENTITY); 

    Matrix4f scale(), rotation(), translation(); 

    scale.SetScale(m_localScale); 
    rotation.SetRotationDegrees(m_localRotation); 
    translation.SetTranslation(m_localTranslation); 

    out = scale * rotation * translation; 
} 

Die große Frage, die ich habe sind

1) Wie kann ich mein Objekt orientieren die Tangente der Bezier-Kurve stellen?

2) Wie bewege ich dieses Objekt entlang der Kurve, ohne nur die Position des Objekts auf die eines Punktes auf der Bezier-Kurve zu setzen?

Heres eine Übersicht über die Funktion bisher

void CNodeControllerPieceWise::AnimateNode(CObject* pSpatial, double deltaTime) 
{ 
    // Get object latest pos. 
    Vector3f posDelta = pSpatial->GetWorldTransform().GetTranslation(); 

    // Get postion on curve 
    Vector3f pos = curve.GetPosition(m_t); 

    // Get tangent of curve 
    Vector3f tangent = curve.GetFirstDerivative(m_t); 

} 

Edit: traurig es ist nicht ganz klar. Ich arbeite seit Ewigkeiten daran und es macht mein Gehirn zu Brei.

Ich möchte, dass das Objekt an der Kurve befestigt wird und der Richtung der Kurve zugewandt ist.

Wie für die Bewegung möchte ich ablehnen, um die Kurve basierend auf der Zeit folgen, auf diese Weise schafft es eine gleichmäßige Bewegung in der gesamten Kurve.

+0

Ich habe die Kurve in ihrer vollen Form. Ich bekomme eine Position auf der Kurve basierend auf dem Wert von t (siehe die Funktion AnimateNode), die zwischen 0 und 1 liegt. Die Funktion "curve.GetPosition (m_t)" basiert auf der parametrischen Gleichung der Kurve. – Sent1nel

Antwort

2

Sie sollten eine Kurve in parametrischer Form haben und einen Differentialvektor verwenden, um die Rotation Ihres Objekts (Rotationswinkel = Ableitungswinkel) zu bewerten, wie @etarion sagte.

Um das Objekt auf einer Kurve mit einer gewünschten Geschwindigkeit zu bewegen (ich denke, es ist das Denken Sie wollen) jeden Simulationsschritt sollten Sie die Entfernung schätzen, die der Punkt in diesem Schritt bewegen sollte.

Die einfachste Schätzung ist dist = derivative.length()*TIMER_STEP. Wenn Sie wissen, dass der Dist auf dem aktuellen Schritt durchlaufen werden soll und t0 - der aktuelle Parameter der Kurve, können Sie einfach t0 um einen kleinen Wert epsilon inkrementieren und überprüfen, dass die durchfahrene Distanz immer noch kleiner als geschätzt ist. Wiederholen Sie dies, bis die zurückgelegte Distanz (während Sie t0 erhöhen)> = geschätzt ist. Dies wird der neue aktuelle Parameter t0 für den nächsten Schritt

EDIT sein:

nicht erst bemerken Haben Sie sind in 3d. Im 3D-Raum können Sie die Position eines Objekts auf einer Kurve nicht eindeutig definieren, selbst wenn Sie die Anfangsposition kennen. Stellen Sie sich vor, Ihre Kurve ist eine Linie - das Objekt kann sich immer noch um die Linie drehen. Dieser Winkel ist nicht durch eine Kurve definiert.

Ich würde so etwas tun. Lassen Sie uns einen Vektor an das Objekt binden, so dass am Beginn der Bewegung (Kurvenparameter t = 0 zum Beispiel) die Objektvektorrichtung mit dem Ableitungsvektor übereinstimmt. Dann sollte dieser Vektor während der Bewegung immer noch mit der Ableitung in jedem Punkt einer Kurve übereinstimmen. Sie werden also diesen Objektvektor kennen und können Ihr Objekt gemäß diesem Vektor einrichten. Aber Sie werden immer noch einen Freiheitsgrad haben.

Zum Beispiel können Sie sagen, dass sich das Objekt nicht um diesen Vektor dreht.

Wenn Sie den Objektvektor und den Rotationswinkel kennen, können Sie die Objektorientierung in der 3D-Welt wiederherstellen.

PS: solcher Objektvektor und ein Rotationswinkel um es heißt Quaternion - so können Sie Quaternion Mathe verwenden (einfache Kopie der erforderlichen Formel), um die Objekt Rotationsmatrix zu berechnen! Hier sind die Formeln http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm

+0

Ich bin nicht sicher, was Sie und "Etarion" für die Einstellung der Rotation bedeuten.Ist der "Differentialwinkel" der Tangens der Kurve? Wenn es ist, wie mache ich diesen Vektor, die Tangente, in Winkel mit der Funktion "pSpatial-> SetRotation (Vector3f (?,?,?));" ? – Sent1nel

+0

Ich habe die Antwort aktualisiert – Andrew

+0

Dies ist nicht ganz das, was ich tat, aber war eine gute Hilfe. Ich werde meine Lösung in ein paar Tagen veröffentlichen. Ich brauche gerade jetzt Schlaf. – Sent1nel

2

Sie benötigen eine parametrische Formel Ihrer Kurve.

Die große Frage, die ich habe sind

1) Wie kann ich mein Objekt Gesicht der Tangente der Bezier-Kurve zu orientieren?

Wenn Sie die Kurve in parametrischer Form haben, ist die tangentiale Richtung die Ableitung der Position wrt. t.

2) Wie verschiebe ich das Objekt entlang der Kurve ohne nur Objekte Position, die von einem Punkt auf dem Bezier cuve Einstellung?

Ich bin mir nicht sicher, ob ich Ihre Frage bekommen - Sie t in Ihrer parametrischen Form in einem kleinen Schritt und Update Position und Richtung erhöhen würden. Sie haben dort immer noch einen gewissen Freiheitsgrad, übrigens - die "Aufwärts" -Richtung wird nicht von der Kurve bestimmt, also müssen Sie sich auch darum kümmern.

0

Ich nehme an, Sie haben alle Punkte, die Sie benötigen, um die Bezier-Kurve zu definieren. Dann können Sie jeden Punkt auf dieser Kurve berechnen. Berechnen Sie einen geeigneten Punkt unter Berücksichtigung der Geschwindigkeit, mit der sich das Objekt bewegen soll, und der Rahmen-Timing und Sie sollten konsistente Bewegung haben.

Der Vektor, der durch die Punkte vom letzten und aktuellen Bild gebildet wird, kann in den meisten Fällen als grobe Schätzung der Tangente verwendet werden; z.B. wenn die Kurve nicht zu stark gebogen wird.

Edit: siehe auch hier how to calculate the length of a bezier curve. Sie müssen das transformieren, damit Sie einen Punkt auf Ihrer Kurve (oder eher t) für eine gegebene Länge berechnen können. Dann bewegen Sie sich gleichmäßig über die Zeit und Sie sollten in Ordnung sein.

0

Ein Ansatz besteht darin, eine Pyramide von Punkten zu berechnen. Die unterste Ebene sind Ihre transformierten Kontrollpunkte. Erstellen Sie jetzt für ein gegebenes t und für jedes Paar benachbarter Punkte einen neuen Punkt, der auf diesem mit t gewichteten Liniensegment liegt. Diese neue Menge von Punkten bildet die nächste Ebene in der Pyramide. Wiederholen Sie dies, bis die aktuelle Ebene nur einen Punkt hat. Dieser Punkt ist deine Position. Beachten Sie, dass die zweite Ebene von oben zwei Punkte hat und die Tangente bestimmt.

Verwandte Themen