Kann diese UV-Texturkoordinaten nicht verstehen (Bereich ist NICHT 0,0 bis 1,0)

9

Ich versuche, ein einfaches Google-Objekt, das von Google SketchUp 8 Pro generiert wurde, auf meine WebGL-App zu zeichnen. Das Modell ist ein einfacher Zylinder.

Ich habe die exportierte Datei geöffnet und die Eckpunkte, Indizes, Normalen und Texturkoordinaten in eine .json-Datei kopiert, um sie in Javascript verwenden zu können. Alles scheint gut zu funktionieren, bis auf die Texturkoordinaten, die einige ziemlich große Werte haben, wie 46.331676 und auch negative Werte. Jetzt weiß ich nicht, ob ich falsch liege, aber sollen 2D-Texturkoordinaten nicht nur in einem Bereich von 0,0 bis 1,0 liegen?

Wenn ich das Modell mit diesen Texturkoordinaten zeichne, sehe ich total komisch aus, und ich kann die Textur nur dann richtig sehen, wenn ich dem Modell sehr nahe bin (nicht wirklich ich, die Kamera), als ob die Textur wahnsinnig gewesen wäre in seiner Größe reduziert und unendlich über die Gesichter des Modells wiederholt. (Ja, ich benutze GL_REPEAT für dieses Textur-Wrap-Ding.)

Was mir aufgefallen ist, dass ich, wenn ich alle diese Koordinaten erhalte und durch 10 oder 100 dividiere, ein viel "normales" Aussehen bekomme, aber immer noch nicht im Bereich von 0,0 bis 1,0.

Hier ist meine JSON-Datei: http://pastebin.com/Aa4wvGvv

Hier sind meine GLSL-Shader: http://pastebin.com/DR4K37T9

Und hier ist die von SketchUp exportierte .X-Datei: http://pastebin.com/hmYAJZWE

Ich habe auch versucht, dieses Modell mit XNA zu zeichnen, aber es funktioniert immer noch nicht. Verwenden dieser HLSL-Shader: http://pastebin.com/RBgVFq08

Ich habe versucht, dasselbe Modell in verschiedene Formate zu exportieren: collada, fbx und x. All das ergibt das Gleiche.

Delta
quelle

Antworten:

8

Sie haben Recht, dass UVs normalerweise von 0-1 gehen, obwohl dies, wie David X erwähnte, keine Voraussetzung ist. In Ihrem Fall ist das Problem die Häufigkeit der von SketchUp generierten UV-Koordinaten. Wenn beispielsweise Ihre Y-Achse (V-Koordinate) von 0 auf 46 wechselt, wird diese Textur bei aktiviertem Umbruch 46 Mal in V-Richtung wiederholt. Durch das Umwickeln wird es auch kleiner, da Sie das Bild mehrmals über dieselbe Oberfläche duplizieren müssen. Der Reexport als FBX oder Collada behebt das Problem nicht, da es sich in beiden Fällen um die gleichen UV-Strahlen handelt. Um dies zu beheben, müssen Sie zu SketchUp zurückkehren und die Erzeugung von UV-Strahlen für den Zylinder ändern. Möglicherweise können Sie den UV-Bereich selbst festlegen oder die Parametrisierung der Geometrie ändern. Ich habe SketchUp noch nie benutzt, also mache ich es nicht.

Schließlich sieht es so aus, als ob die Scheitelwicklung des Zylinders das Gegenteil Ihrer Würfel sein könnte. Grafik-APIs wie OpenGL und DirectX verwenden die Dreieckscheitelpunktwicklung, um zu bestimmen, in welche Richtung das Dreieck zeigt. Auf diese Weise führen sie ein Backface-Culling durch - ohne die von der Kamera abgewandten Dreiecke als Optimierung zu rendern. Bei Ihrem Zylinder scheint die Ansicht in den Zylinder zu schauen, da die der Kamera am nächsten gelegenen Dreiecke in die falsche Richtung weisen. Auch dies ist ein Problem, das in SketchUp behoben werden müsste. Es kann überprüft werden, indem für jedes Dreieck die Richtung der Gesichtsnormalen betrachtet wird (es sollte nach außen und nicht nach innen zeigen).

Corillian
quelle
1

(Texturkoordinaten können definitiv außerhalb von 0-1 liegen.) Ich denke, dies ist nur OpenGL, das seltsam ist. IIRC, Kugeln verwenden Texturkoordinaten, die das 0-1-Quadrat auf ~ 1/16 der Oberfläche setzen, und ich wäre nicht überrascht, wenn Zylinder etwas Ähnliches tun würden. In Bezug auf die Korrektur müssen Sie möglicherweise Ihren eigenen Zylindercode schreiben und die entsprechenden Texturkoordinaten eingeben.

David X.
quelle
1

Wenn Sie möchten, dass Ihre UV-Koordinaten genau zwischen 0 und 1 liegen, können Sie eine Skalierungsmatrix für Ihr Modell verwenden.

Wenn Sie Ihr Modell laden, können Sie nach Ihrer maximalen u- und v-Koordinate suchen und eine Skalierungsmatrix erstellen, die es "normaler" macht. Damit wird Ihre manuelle Skalierung von 10 oder 100 ersetzt. Damit sie passt, müssen Sie Ihre UV-Koordinaten auf [0,1] verkleinern.

|1/uMax|0     |
|0     |1/vMax|

Dies ist natürlich nur eine Problemumgehung, und Sie könnten besser einen Weg finden, Sketchup in den richtigen Einstellungen einzustellen (ich denke, Ihr Exporter oder Sketchup selbst geht hier schief). Wenn es für Sie jedoch nicht funktioniert, erstellen Sie Ihren Post-Loading-Prozessor und speichern Sie eine Textur-Skalierungsmatrix.

Marnix
quelle
@Marmix Dies ist eine sehr einfache, effektive und elegante Lösung !!!
3d-indiana-jones
0

Es sieht so aus, als würde SketchUp Ihre Texturkoordinaten nicht normalisieren oder eine eigene Metrik verwenden. Wenn Sie Texcoords <0 oder> 1 und GL_REPEAT als Texturumbruch verwenden, wird die Textur entsprechend der Geometrie verkleinert und horizontal und vertikal wiederholt.

Versuchen Sie, das Netz in ein anderes Modellierungspaket (MilkShape, Blender) zu importieren und die UV-Karte von dort aus zu reparieren.

r2d2rigo
quelle
4
Mit texcoords <0 oder> 1 und GL_REPEAT als Textur Verpackung bedeutet , dass die Textur wird [ fehlerhafte Anweisung entfernt wiederholt horizontal und vertikal].
Kromster