2010-12-26 10 views
4

Ich versuche ein "3D-Band" mit einer einzigen 3D-kubischen Bézier-Kurve zu rendern (die Breite des Bandes ist konstant). Dem ersten und letzten Kontrollpunkt ist ein Normalenvektor zugeordnet (der immer senkrecht zu den Tangenten an diesen Punkten steht und die Oberflächennormale des Bandes an diesen Punkten beschreibt), und ich versuche, den Normalvektor gleichmäßig zu interpolieren der Verlauf der Kurve.Wie berechnet man die Normalen von Punkten auf einer 3D-kubischen Bézier-Kurve bei Normalen für ihre Start- und Endpunkte?

Zum Beispiel sollte bei einer Kurve, die den Buchstaben "C" bildet, der erste und der letzte Kontrollpunkt beide Flächennormalen nach oben zeigen, das Band flach, parallel zum Boden, langsam drehen und dann flach enden wieder, in der gleichen Weise wie der erste Kontrollpunkt. Um dies "reibungslos" zu tun, müsste es nach der Hälfte der Kurve nach außen zeigen. Im Moment (für diesen Fall) konnte ich nur alle Oberflächen nach oben (und nicht nach außen in der Mitte) bringen, was einen hässlichen Übergang in der Mitte erzeugt.

Es ist ziemlich schwer zu erklären, ich habe einige Bilder von diesem Beispiel mit dem, was es derzeit aussieht (alle Oberflächen nach oben, scharfe Flip in der Mitte) und wie es aussehen sollte (sanfter Übergang, Oberflächen langsam drehen Sie sich um). Silberne Gesichter stehen für die Vorderseite, schwarze Gesichter für die Rückseite.

falsch, was es sieht derzeit wie:

Correct Ribbon http://img211.imageshack.us/img211/4659/ribbonincorrect.th.png

Richtige, was es sollte wie folgt aussehen:

Incorrect Ribbon http://img515.imageshack.us/img515/2673/ribboncorrect.th.png

Alles, was ich wirklich brauchen, um in der Lage zu berechnen dieser "hybride Normalvektor" für irgendeinen Punkt auf der kubischen Bézier-3D-Kurve, und ich kann die Polygone kein Problem erzeugen, aber ich kann nicht herausfinden, wie man kommt Sie drehen sich wie abgebildet gleichmäßig um. Völlig fest, wie es weitergeht!

Antwort

2

Sie können den im ersten Teil von this answer erläuterten Algorithmus verwenden, indem Sie die Normalen bei t = 0 (oder einem festen t, je nachdem, was Sie wählen) einen weichen Übergang erhalten.

So:

alt text

(Stellen Sie sich Gehweg entlang der blau-rote Grenze)

bearbeiten

Ok, das ist, was ich von einem anderen Weg bekam:

alt text

Das Verfahren ist einfach:

Haben Sie Ihre parametrisierte Funktion:

f[t] := { x[t], y[t], z[t] } 

den Tangentenvektor, indem Derivate berechnen:

f'[t] := { x'[t], y'[t], z'[t] } 

Wählen Sie Ihre (und endend Normalvektor) beispielsweise ausgehend :

n[0] = {0, 0, 1}; 

definieren nun eine andere Funktion als das Vektorprodukt des Derivats und Ihre normal:

cp[t_] := CrossProduct[f'[t], n[0]]; 

Und das ist es.

Die Punkte meines Vierecke liegen in:

{f[t] - cp[t]/3, 
    f[t] + cp[t]/3, 
    f[t + dt] + cp[t + dt]/3, 
    f[t + dt] - cp[t + dt]/3} 

wobei dt der Zuwachs Sie ist gefallen.

Ein ausgefeilterer Ansatz kann die Kurvenpfadlänge berücksichtigen, aber ich denke, das ist die zweite Iteration des Algorithmus.

HTH!

+0

Das Bild scheint darzustellen, was ich suche, aber ich habe Schwierigkeiten, die verwendeten Gleichungen zu verstehen. Insbesondere bin ich nur mit C-ähnlichen Sprachen vertraut ... Ich nehme nicht an, dass Sie die Gleichungen etwas mehr erklären könnten? – Robert

+0

@Robert Kein Problem, aber ich möchte kein Buch schreiben. Das sind mathematische Funktionen. Wenn Sie mich wissen lassen, wo Ihr Problem ist, könnte ich versuchen zu helfen! –

+0

Okay, ich bekomme deine mathematischen Funktionen - ich war verwirrt auf deiner Kreisgleichung. Habe ich richtig gedacht, dass die erwähnte orthogonale Ebene mehr oder weniger das ist, was ich berechnen muss? Ist die Oberflächennormale dieser Ebene (an einer Position t) derselbe Vektor, den ich zu berechnen versuche? Ich habe die parametrischen Gleichungen meines Bézier zur Hand und habe ihre Ableitungen berechnet, um die Tangente zu finden, also werde ich vielleicht morgen, wenn ich nicht müde bin, versuchen, sie in die Praxis umzusetzen. In der Zwischenzeit, vielen Dank für Ihre Hilfe! – Robert