PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PQ-Torus-Knot


MeLLe
2003-09-04, 19:12:10
Heya,
nach einem ausgedehnten Selbstversuch, eine OpenGL-Implementierung eines PQ-Torus-Knots zu schreiben, bin ich nun soweit, dass ich sagen kann: das Grundgerüst steht! Grundlage dafür ist übrigens dieses (http://www.blackpawn.com/texts/pqtorus/default.html) Prinzip.
Leider habe ich ein Problem mit der Texturierung, die einfach nicht so will, wie ich das gerne hätte. Das Problem ist, dass die Textur nicht gleichmäßig über das Mesh tapeziert, sondern an jedem Polygon neu angehängt und damit über das Mesh wild getiled wird. Wie kann ich das Problem lösen?

(Achso, falls jemand nen Screenshot möchte - den liefere ich nach, sobald mein Postfach das ZIP von Arbeit an mich rausgelassen hat ;D)

Xmas
2003-09-04, 19:35:11
Wie setzt du denn deine Texturkoordinaten?
Da der Torusknoten topologisch gesehen in beide Richtungen wrappt, brauchst du eine Tile-Textur. Und die Texturkoordinaten müssen so gewählt sein, dass sie in einem "Umlauf" von einer ganzen Zahl zu einer anderen gehen, in beide Richtungen. Dazu muss GL_TEXTURE_WRAP_S/T als GL_REPEAT gesetzt sein.

MeLLe
2003-09-04, 20:13:59
Nunja, grundsätzlich gehe ich folgenden Weg:
for i = 0 to 360
p1 = f(i)... // Punkt 1 auf der Torus-Spline
p2 = f(i+1)... // Punkt 2 auf der Torus-Spline

F1 = ... // Frenet-Frame für Punkt p1
F2 = ... // Frenet-Frame für Punkt p2

glbegin(GL_TRIANGLE_STRIP)
for j = 0 to 360
k = f(j) // Punkt auf Kreisbahn in x-y-Ebene um (0,0,0)

glTextureCoordinates(0,0)
glVertex(F1 * k)
glTextureCoordinates(0,1)
glVertex(F2 * k)
next j
glEnd()
next i
Haben den Code etwas pseudonymisiert, und unwesentliche Teile (setzen der Normalen etc.) weggelassen - ich hoffe der Sinn kommt raus.
Nochmal in Worten: für jeden Punkt auf der Torus-Kurve schiebe ich alternierend jeden Punkt der um die Kurve zu extrudierenden Kreisbahn am aktuellen und danach am nachfolgenden Punkt der Toruskurve in die GPU, d.h. es werden Triangle-Strips in Form eines geschlossenen Kreis-"Bandes" entlang der Torus-Kurve erzeugt.
Wie kann ich nun z.B. erreichen, dass eine einzige Textur ohne Tiling über den ganzen Torus gelegt wird?

MeLLe
2003-09-04, 20:58:12
Hier jetzt der versprochene Screenshot - Textur ist %WINDIR%\Präriewind.bmp ...

Xmas
2003-09-04, 21:15:05
Die Texturkoordinaten müssen von i und j abhängig sein. Also einmal glTexCoord2d(j / 360.0, i / 360.0) und einmal glTexCoord2d(j / 360.0, i + 1 / 360.0)

Und i sollte nur bis 359 gehen (bzw. den letzten Schritt auslassen), während j wieder zum Ausgangspunkt kommen muss.

MeLLe
2003-09-04, 22:07:46
Danke für die schnelle Hilfe, Xmas.
Ein wenig "Besserung" hat's ja gebracht, aber irgendwie scheint die Abhängigkeit der TexCoords von i noch nicht ganz zu passen - es tritt ein komischer Effekt auf: je größer i wird, umso "kleiner" wird die Textur, d.h. umso kleiner wird die Fläche, auf die die eine bestimmte Fläche der Textur abgebildet wird.
Aber der Screenshot sagt vielleicht mehr als 1000 Worte ...

MeLLe
2003-09-04, 22:27:54
Ich glaube es klappt - ich musste nur
glTexCoord2d(j / 360.0, i + 1 / 360.0)
in glTexCoord2d(j / 360.0, (i + 1) / 360.0)
ändern. Ist ja so dann auch logischer ;D

Tausend Dank, Xmas!
Ich glaube ich werd Dir die nächsten Tage mit meinem Torus-Knoten trotzdem noch bissl "Stress" machen ;D

MeLLe
2003-09-04, 22:29:29
Achja ... "Beweisfoto" ...