2016-05-14 7 views
2

Ich habe 4 Punkte, die ich mit der Kamera mit einer Spline-Kurve reisen musste, wie kann ich die Kurve mit dem Glm :: gtx_spline :: catmullRom generieren?Wie kann ich eine Spline-Kurve mit glm_gtx_spline :: catmullRom erzeugen?

Es ist eine Funktion von glm_gtx_spline http://glm.g-truc.net/0.9.4/api/a00203.html

genType catmullRom (genType const &v1, genType const &v2, genType const &v3, genType const &v4, typename genType::value_type const &s) 
+0

https://en.wikipedia.org/wiki/B-spline hat einige Beschreibung/Bilder von Kontrollpunkten. Sie geben nur die Punkte an, auf denen die Kurve basieren soll, und geben an, wie weit die Kurve für den Wert reichen soll. Es gibt keine "Kurve" für OpenGL, also müssen Sie auswählen, wie viele Samples entlang des Splines Sie möchten, und catmullRom so oft aufrufen, um die Samples zu erhalten. Je öfter Sie es nennen, desto besser sieht es aus, aber desto langsamer ist Ihr Code. – xaxxon

+0

Das Bit "Wie weit" ist der letzte Parameter. Die ersten 4 sind die Kontrollpunkte. – xaxxon

+0

Also sind die Kontrollpunkte die Punkte, die ich reisen möchte? Und wie kann ich das Wie weit ein bisschen einstellen? –

Antwort

5

A Catmull-Rom-Spline besteht in der Regel aus mehreren Segmenten, die jeweils ein Paar von aufeinanderfolgenden Kontrollpunkten interpoliert werden. Die glm::catmullRom Funktion berechnet nur ein Segment dieser Kurve, die von vier aufeinanderfolgenden Kontrollpunkten abhängt (p0, p1, p2, p3). Das Kurvensegment geht immer von p1 zu p2, während die Punkte p0 und p3 nur beeinflussen, wie die Kurve biegt dazwischen, wie hier dargestellt:

Catmull-Rom curve segment
(Bild von Hadunsford - Eigener Arbeit, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=28956755)

Wenn Sie mehrere dieser Kurvensegmente nacheinander verketten, erstellen Sie einen Catmull-Rom-Spline, der eine Folge von (einer beliebigen Anzahl von) Kontrollpunkten interpoliert. Wenn jedes Catmull-Rom-Kurvensegment aus vier aufeinanderfolgenden Kontrollpunkten berechnet wird, ist der resultierende Spline kontinuierlich und glatt (C kontinuierlich).

ein Vektor cp von n Kontrollpunkte berechnet die folgende Funktion den Wert des Catmull-Rom-Spline-Parameter bei t (wobei t 0-n -1 geht):

glm::vec3 catmull_rom_spline(const std::vector<glm::vec3>& cp, float t) 
{ 
    // indices of the relevant control points 
    int i0 = glm::clamp<int>(t - 1, 0, cp.size() - 1); 
    int i1 = glm::clamp<int>(t,  0, cp.size() - 1); 
    int i2 = glm::clamp<int>(t + 1, 0, cp.size() - 1); 
    int i3 = glm::clamp<int>(t + 2, 0, cp.size() - 1); 

    // parameter on the local curve interval 
    float local_t = glm::fract(t); 

    return glm::catmullRom(cp[i0], cp[i1], cp[i2], cp[i3], local_t); 
} 

In dieser Implementierung werden die relevanten Kontrollpunkt-Indizes auf den Bereich geklemmt (0, n -1). Konzeptionell wird dadurch eine Verdopplung der ersten und letzten Kontrollpunkte erreicht, so dass auch der erste und der letzte Kontrollpunkt von cp interpoliert werden.

den Parameter Wechselnde t zwischen 0 und n -1 wird nun Punkte nachzuspüren auf einer glatten Kurve alle Punkte in cp interpoliert werden.

Verwandte Themen