Frage

Ich schreibe ein Programm, das eine solide entlang der Kurve einer Spline zeichnen wird. Ich bin mit Visual Studio 2005, und in C ++ für OpenGL zu schreiben. Ich verwende FLTK mein Fenster zu öffnen (schnell und leicht Toolkit).

Im Moment habe ich einen Algorithmus, der einen Kardinal Cubic Spline, da eine Reihe von Kontrollpunkten, durch Aufbrechen der Intervalle zwischen den Punkten nach oben in Subintervalle und Zeichnung linesegments zwischen diesen Unterpunkten ziehen wird. Die Anzahl der Subintervalle variabel ist.

Der Linienzeichencode funktioniert wunderbar und funktioniert im Prinzip wie folgt: Ich habe eine Reihe von Punkten entlang der Spline-Kurve unter Verwendung der Spline-Gleichung erzeugen und speichere sie in einem Array (als eine spezielle Datenstruktur genannt Pnt3f, wo die Koordinaten 3 Schwimmern und es gibt einige praktische Funktionen wie Entfernung, Länge, Punkt und Kreuzprodukt). Dann habe ich eine einzelne Schleife, die iteriert durch die Anordnung von Punkten und zieht sich als so:

glBegin(GL_LINE_STRIP);
for(pt = 0; pt<=numsubsegements ; ++pt) {
    glVertex3fv(pt.v());
}
glEnd();

Wie bereits erwähnt, funktioniert dieser Code groß. Nun, was ich tun möchte, ist, anstatt eine Linie zu zeichnen, ich möchte eine solide extrudieren. Meine aktuelle Exploration wird mit einem ‚Zylinder‘ quadric ein Rohr entlang der Linie zu erstellen. Dies ist ein bisschen schwieriger, als ich zu orientieren openGL in Richtung habe ich möchte den Zylinder ziehen. Meine Idee ist es, dies zu tun:

Psuedocode:

Push the current matrix,
translate to the first control point
rotate to face the next point
draw a cylinder (length = distance between the points)
Pop the matrix
repeat

Mein Problem ist immer die Winkel zwischen den Punkten. Ich brauche nur Gieren und Nicken, Rollen sind nicht wichtig. Ich kenne den Arkuskosinus des Skalarprodukts der beiden Punkte nehmen durch die Größe der beiden Punkte geteilt, wird der Winkel zwischen ihnen zurückkehren, aber das ist nicht etwas, was ich zu OpenGL einspeisen kann mit drehen. Ich habe versucht, dies in 2d tun, die XZ-Ebene unter Verwendung von x Rotation zu bekommen, und machen Sie die Punkte Vektoren vom Ursprung, aber nicht den richtigen Winkel zurück.

Mein aktueller Ansatz ist viel einfacher. Für jede Rotationsebene (X und Y), finden den Winkel von:

Arkuskosinus ((Differenz in 'x' Werte) / Abstand zwischen den Punkten)

der ‚x‘ Wert hängt davon ab, wie Sie Ihren Satz Ihres Flugzeug nach oben, wenn auch für meine Berechnungen ich immer Welt x verwenden.

ein paar Fragen der es Barring macht es in den richtigen Quadranten zu zeichnen, die ich noch ausgearbeitet haben, möchte ich um Rat zu bekommen, um zu sehen, ob dies eine gute Umsetzung war, oder um zu sehen, ob jemand einen besseren Weg kannte.

War es hilfreich?

Lösung

Sie sind richtig bei der Bildung von zwei Vektoren, die von den drei Punkten in zwei benachbarten Liniensegmente und dann den Arcuscosinus des Punktprodukts unter Verwendung der Winkel zwischen ihnen zu bekommen. Zur Verwendung dieses Winkels Sie benötigen, um die Achse zu bestimmen, um welche sollte die Rotation auftreten. Nehmen Sie das Kreuzprodukt von den gleichen zwei Vektoren, die diese Achse zu erhalten. Anschließend können Sie eine Transformationsmatrix bauen mit dieser Achse Winkel oder gibt es als Parameter an glRotate .

Andere Tipps

Ein paar Anmerkungen:
vor allem diese:

for(pt = 0; pt<=numsubsegements ; ++pt) {
  glBegin(GL_LINE_STRIP);
    glVertex3fv(pt.v());
}
glEnd();

ist kein guter Weg, um etwas zu zeichnen. Sie müssen eine glEnd () haben für jede einzelne glBegin (). Sie wollen wahrscheinlich die glBegin () aus der Schleife erhalten. die Tatsache, dass dies funktioniert, ist reines Glück.

zweite Sache

  

Meine aktuelle Exploration wird mit einem   ‚Zylinder‘ quadric ein Rohr zu schaffen,   entlang der Linie

Das wird nicht funktionieren wie erwartet. die ‚Zylinder‘ Quadric eine flache obere Basis und eine flache Boden Basis. Auch wenn Sie Erfolg in den richtigen Drehungen machen entsprechend die Spline der Kanten der flachen Oberseiten aus dem Volumen der beabsichtigten Röhre gehen, um Pop und es wird nicht glatt sein. Sie können es in 2D versuchen, mit nur einem Stift und Papier. Versuchen, ein glattes Rohr nur kürzere Rohre mit einer flachen Base zu ziehen. Das ist unmöglich.

Drittens, zu Ihrer eigentlichen Frage, Das endgültige Werkzeug für solche Drehungen sind quaternions . Es ist ein wenig komplex in diesem Bereich zu erklären, aber Sie plentyful Informationen überall finden können Sie suchen.
Wenn Sie QT statt FLTK verwendet haben, würden Sie auch libQGLViewer verwendet haben könnte. Es verfügt über eine integrierte Quaternion-Klasse, die Ihnen die Implementierung retten würde. Wenn Sie noch eine andere Wahl haben, empfehle ich zu QT bewegen.

Haben Sie darüber nachgedacht gluLookAt ? Setzen Sie Ihren Kontrollpunkt als Augenpunkt, den nächsten Punkt als Referenzpunkt, und stellen Sie die Aufwärts-Vektor senkrecht zu der Differenz zwischen den beiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top