Nie mogę zrozumieć tych współrzędnych tekstury UV (zakres NIE wynosi od 0,0 do 1,0)

9

Próbuję narysować prosty obiekt 3D wygenerowany przez Google SketchUp 8 Pro na mojej aplikacji WebGL, model jest prostym cylindrem.

Otworzyłem eksportowany plik i skopiowałem pozycje wierzchołków, indeksy, normalne i współrzędne tekstury do pliku .json, aby móc używać go w javascript. Wszystko wydaje się działać dobrze, z wyjątkiem współrzędnych tekstury, które mają dość duże wartości, takie jak 46,331676, a także wartości ujemne. Teraz nie wiem, czy się mylę, ale czy współrzędne tekstury 2D nie powinny mieścić się w zakresie od 0,0 do 1,0?

Cóż, narysowanie modelu przy użyciu tych współrzędnych tekstury daje mi zupełnie dziwny wygląd, i mogę zobaczyć teksturę poprawnie tylko wtedy, gdy jestem bardzo blisko (nie ja, kamera) do modelu, tak jakby tekstura była niesamowicie zmniejszone i powtarzane w nieskończoność na twarzach modelu. (tak, używam GL_REPEAT do tego zawijania tekstur)

Zauważyłem, że jeśli otrzymam wszystkie te współrzędne i podzielę je przez 10 lub 100, otrzymam znacznie „normalny” wygląd, ale nadal nie w zakresie od 0,0 do 1,0.

Oto mój plik Json: http://pastebin.com/Aa4wvGvv

Oto moje Shadery GLSL: http://pastebin.com/DR4K37T9

A oto plik .X wyeksportowany przez SketchUp: http://pastebin.com/hmYAJZWE

Próbowałem też narysować ten model za pomocą XNA, ale nadal nie działa. Korzystanie z tego modułu cieniującego HLSL: http://pastebin.com/RBgVFq08

Próbowałem wyeksportować ten sam model do różnych formatów, collada, fbx i x. Wszystko to daje tę samą rzecz.

Delta
źródło

Odpowiedzi:

8

Masz poprawne UV zwykle odchodzą od 0-1, ale jak wspomniał David X, nie jest to wymagane. W twoim przypadku problemem jest częstotliwość współrzędnych UV generowanych przez SketchUp. Na przykład, jeśli twoja oś Y (współrzędna V) ma wartość od 0 do 46, wówczas ta tekstura, jeśli włączone jest zawijanie, powtórzy się 46 razy w kierunku V. Zawijanie powoduje również, że wygląda on mniejszy, ponieważ trzeba wielokrotnie powielić obraz na tej samej powierzchni. Ponowne eksportowanie jako FBX lub Collada nie rozwiązuje problemu, ponieważ w obu przypadkach jest to samo UV. Aby to naprawić, musisz wrócić do SketchUp i zmienić sposób, w jaki generuje promieniowanie UV dla cylindra. Być może możesz sam określić zakres UV, a może musisz zmienić sposób parametryzacji geometrii. Nigdy nie korzystałem ze SketchUp, więc nie

Wreszcie wygląda na to, że uzwojenie wierzchołka cylindra może być przeciwieństwem twoich kostek. Interfejsy API grafiki, takie jak OpenGL i DirectX, wykorzystują uzwojenie wierzchołka trójkąta, aby określić, w którą stronę skierowany jest trójkąt. W ten sposób wykonują wygładzanie tylnej powierzchni - nie renderując trójkątów odwróconych od kamery jako optymalizacja. W przypadku cylindra wydaje się, że widok patrzy w cylinder, ponieważ trójkąty znajdujące się najbliżej kamery są zwrócone w złym kierunku. Ponownie jest to problem, który należałoby rozwiązać w SketchUp i można go zweryfikować, patrząc na kierunek twarzy normalny dla każdego trójkąta (powinien być skierowany na zewnątrz, a nie do wewnątrz).

Corillian
źródło
1

(Współrzędne tekstury mogą zdecydowanie znajdować się poza 0-1.) Myślę, że to po prostu dziwne OpenGL. IIRC, Kule używają współrzędnych tekstury, które umieszczają kwadrat 0-1 na ~ 1/16 powierzchni, i nie byłbym zaskoczony, gdyby Cylindry zrobiły coś podobnego. Naprawiając, może być konieczne napisanie własnego kodu cylindra, podając odpowiednie współrzędne tekstury.

David X
źródło
1

Jeśli chcesz, aby współrzędne UV były dokładnie między 0 a 1, możesz użyć macierzy skali dla swojego modelu.

Podczas ładowania modelu możesz sprawdzić maksymalną współrzędną u i v i utworzyć macierz skalowania, która sprawi, że będzie ona bardziej „normalna”. To zastąpi ręczne skalowanie 10 lub 100. Aby dopasować, musisz skalować współrzędne UV do [0,1].

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

Oczywiście jest to tylko obejście problemu i możesz lepiej znaleźć sposób, aby ustawić Sketchup we właściwych ustawieniach (myślę, że twój eksporter lub sam Sketchup popełniają błąd tutaj). Ale jeśli to nie zadziała, utwórz procesor ładujący i zapisz macierz skalowania tekstur.

Marnix
źródło
@Marmix To bardzo proste, skuteczne i eleganckie rozwiązanie !!!
3d-indiana-jones,
0

Wygląda na to, że SketchUp nie normalizuje współrzędnych tekstury ani nie używa własnej metryki. Posiadanie texcoordów <0 lub> 1 i GL_REPEAT jako zawijania tekstury oznacza, że ​​tekstura zostanie przeskalowana w dół, aby dopasować ją do geometrii i powtórzona poziomo i pionowo.

Spróbuj zaimportować siatkę do innego pakietu modelującego (MilkShape, Blender) i stamtąd naprawić mapę UV.

r2d2rigo
źródło
4
Posiadanie texcoordów <0 lub> 1 i GL_REPEAT jako zawijania tekstury oznacza, że ​​tekstura zostanie [ usunięta błędna instrukcja ] powtórzona poziomo i pionowo.
Kromster