Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

23.12.2008, 14:30

Bézier Curve-Implementierung

Hallo,
ich hab da ein kleines Problem oder sagen wir's so, ich bin auf der Suche nach einem Kleinen Anstups. Und zwar lade ich mir die Koordinaten für eine Bézier Kurve aus einem Model (OBJ-File). Da das Format in der ASCII-Formatierung vorliegt, heir ein kleines Beispiel wie die Koordinaten vorliegen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 3.0 Bezier patch
v -5.000000 -5.000000 0.000000
v -5.000000 -1.666667 0.000000
v -5.000000 1.666667 0.000000
v -5.000000 5.000000 0.000000
v -1.666667 -5.000000 0.000000
v -1.666667 -1.666667 0.000000
v -1.666667 1.666667 0.000000
v -1.666667 5.000000 0.000000
v 1.666667 -5.000000 0.000000
v 1.666667 -1.666667 0.000000
v 1.666667 1.666667 0.000000
v 1.666667 5.000000 0.000000
v 5.000000 -5.000000 0.000000
v 5.000000 -1.666667 0.000000
v 5.000000 1.666667 0.000000
v 5.000000 5.000000 0.000000
# 16 vertices

Ich hatte mir ein Prinzip überlegt, was auch gut funktioniert. Ich lese ein bis ein 'v' kommt, wenn es da ist werden die Koordinaten in 3-Dimensionalen Vektoren gespeichert. So, bishierhin alles gut. Jetzt kommen wir zu meiner Kurvenimplementierung. Und zwar sagte ich ja das die Vertices in einem Vektor abgelagert werden. Nachdem dies getan wurde, so dachte ich, ist es relativ einfach die Vektoren zu übergeben. Dazu hab ich dann mal gleich ne Kurvenfunktion geschrieben:

C-/C++-Quelltext

1
void GetCurve(const Vector &vector1, const Vector &vector2, const Vector &vector3,unsigned int numOfPoints);

So wie ich es mir überlegt hattem übergebe ich nach jedem Punkt, die Vektoren an die Funktion. Meine Frage, eventuell auch Problem, ist, dass ich für eine Kurve zwei wichtige Punkte brauche. Und zwar den Anfangs- und Endpunkt. Woher soll ich wissen welcher der Endpunkt und welcher der Startpunkt sind? Oder habe ich vielleicht was missverstanden, könnte es also sein das ein kompletter Block (wie ich ihn oben gepostet hab) eine einzige Kurve ist? Dann wäre es ja relativ einfach...
Ich vertue mich doch da oder?

Hoffe es hat einer verstanden, vielen Dank im Voraus!

Anonymous

unregistriert

2

23.12.2008, 14:42

Meinst du nun Patches oder Curve?

Auch wenn ich von NeHe nichts halte, aber aus diesem Tut könntest du dir weitere Informationen saugen:
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=28

Anonymous

unregistriert

3

23.12.2008, 14:44

Muss doch auch mit Curves gehen? oO

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

23.12.2008, 15:57

Die Vertexreferenzen für den Patch findest du im allgemeinen als Parameter des surf Attributes. Grob gesagt ist das folgend aufgebaut:

C-/C++-Quelltext

1
surf s0 s1 t0 t1 vertex1 vertex2 ... vertexn


Die Werte s0/s1 und t0/t1 sind die Start- und Stopwerte für die s/t Interpolation und die Werte für vertex* referenzieren auf den entsprechenden Vertex im Vertexpuffer. (Übrigens musst du hier den Surfacetyp beachten, bei rationalen Oberflächen können die Vertices 3 oder 4 Dimensional sein, in ersterem Fall wird für 'w' der Wert 1 vorausgesetzt).
@D13_Dreinig

Anonymous

unregistriert

5

23.12.2008, 16:26

Zitat

Die Werte s0/s1 und t0/t1 sind die Start- und Stopwerte

Was heisst Start- und Stopwerte, wieso sollte es übrehaupt Start- und Stzopwerte geben? Woher soll ich überhaupt wissen welche dann die Zwischenpunkte sind?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

23.12.2008, 16:39

Die Werte geben Bereich an in dem evaluiert wird. Die Zwischenpunkte bekommst du ja durch die interpolation und die Kontrollpunkte hast du ja.

Der Vorgang sieht im Endeffekt so aus:
o Du nimmst die vier Kontrollpunkte der ersten Gridzeile und berechnest den ersten Punkt auf der Kurve (u) (abhängig von deiner Schrittweise)
o Das Gleiche machst du für die drei übrigen Gridzeilen.
o Mithilfe der 4 neuen Kontrollpunkte kannst du jetzt eine weitere Kurve erzeugen (v), wobei du die Punkte in deinen Vertexpuffer einträgst.

Die oben genannten Schritte machst du so lang bis du alle Punkte beisammen hast. Danach musst du die Vertices nur noch zu Dreiecken zusammen fassen.
@D13_Dreinig

Werbeanzeige