Dlaczego normalne mapy są głównie niebieskie?

44

Dlaczego normalne mapy są przeważnie niebieskie zamiast przypadkowego koloru?

Myślę, że normalne wektory obiektu 3D mogą wskazywać w każdym kierunku, na przykład:

(1.0, 0.1, 0.5), (0.1, -0.5, 0.3), (-0.51, 0.46, -1.0) ... 

wprowadź opis zdjęcia tutaj

Jinbom Heo
źródło

Odpowiedzi:

71

Istnieją dwa rodzaje normalnych map powszechnie używanych w tworzeniu gier. Twoim zdaniem powinny działać tak, jak działa jeden typ (normalne mapy w przestrzeni modelowej), ale większość gier używa innego typu (normalne mapy w przestrzeni stycznej), dlatego kojarzysz głównie niebieskie tekstury z normalnymi mapami.

Przykład normalnej mapy obszaru modelu

W przypadku map normalnych w przestrzeni modelu każdy kanał koduje dokładną wartość normalną przy użyciu tego samego układu współrzędnych, co wierzchołki modelu, z którym jest używany. Oznacza to, że różne części normalnej mapy będą miały różne odcienie, ale piksele w pobliżu zwykle będą miały podobne kolory. Przykład normalnej mapy przestrzeni modelowej pojawia się powyżej ( źródło ).

Normalne mapy przestrzeni stycznej są zwykle jasnoniebieskie. Ten typ mapy definiuje normalne w przestrzeni współrzędnych unikatowej dla pozycji każdego piksela na powierzchni siatki. Wykorzystuje (interpolowany) wierzchołek normalny jako oś Z oraz dwa inne wektory ortogonalne, zwane styczną i bitangentem, jako osie X i Y. Zasadniczo można traktować normalne na mapie jako „przesunięcie” względem normalnej dla tego piksela obliczone przez interpolację normalnych wierzchołków. Wektory styczne i bitowe są również interpolowane z danych wierzchołków i określają, który kierunek na siatce odpowiada „w górę” i „w lewo” na normalnej mapie. Obraz przedstawiony w pytaniu stanowi doskonały przykład tego, jak wygląda typowa mapa normalna w przestrzeni stycznej, więc nie podam tutaj innego przykładu.

Składniki normalnego normalnie (bez zamierzonej gry słów) wahają się od [-1, 1]. Ale komponenty koloru w obrazie mieszczą się w zakresie od [0, 1](lub [0, 255]zwykle są one znormalizowane do [0, 1]). Tak więc normalne są skalowane i przesunięte tak, że normalna (0, 0, 1)staje się kolorem (0.5, 0.5, 1). Jest to jasnoniebieski kolor widoczny na normalnych mapach i oznacza brak odchyleń od interpolowanego wierzchołka normalnego przy zastosowaniu normalnych przestrzeni stycznej.

Powodem, dla którego normalne w przestrzeni stycznej są preferowane w stosunku do normalnych w obszarze modelu, jest fakt, że są łatwiejsze do utworzenia i mogą być używane do wielu siatek. Dodatkowo, w przypadku użycia z animowaną siatką, zawsze używane są normalne z przestrzeni stycznej, ponieważ normalne stale się zmieniają.

brcrist
źródło
6
Uwielbiam to wyjaśnienie - zwięzłe, zawiera matematykę, opracowuje różne typy używane do normalnych map i dlaczego są używane.
Tom „Blue” Piddock,
Dziękuję za uzyskanie rozróżnienia bitangenti binormalprawidłowe.
imallett,
2
@imallett Tak, powierzchnie mają normalną, styczną i bitangent, podczas gdy krzywe mają styczną, normalną i dwumianową. Przynajmniej tak rozumiem.
bcrist
8

Normalna mapa najczęściej wskazuje na zewnątrz z powierzchni. Zakładając, że korzystasz ze zwykłego mapowania komponentu Z wektorów normalnych XYZ, będącego kierunkiem „głębokości”, oraz mapowania do komponentu B przestrzeni kolorów RGB, w efekcie większość normalnych wektorów będzie głównie niebieska.

Jeśli tekstura byłaby, powiedzmy, czerwona, oznaczałoby to, że normalna mapa jest powierzchnią, która jest w większości skierowana w prawo. Możesz zobaczyć tę funkcję na przykładowym obrazie, ponieważ prawa krawędź wypukłości ma czerwonawy odcień.

Kompletna powierzchnia o czerwonawym kolorze nie miałaby sensu. Oznaczałoby to powierzchnię całkowicie skierowaną w prawo. To byłoby po prostu modelowane za pomocą geometrii, a nie części normalnej mapy.

Sean Middleditch
źródło
3
Aby wyjaśnić to nieco bardziej, mapa normalna NIE zawiera wektora normalnego z twojego punktu widzenia, ale utrzymuje wektor normalny z punktu widzenia twarzy, więc po odebraniu normalnej z twarzy, wymieszasz to z normalmaps-normalvector. A ponieważ jest głównie niebieski, czyli (0, 0, 1), oznacza to, że normalny wektor, który już masz, nie zmienia się. (Pomyśl o tym, jakbyś położył każdą twarz płasko na podłodze, zanim ją narysujesz, a następnie użyj normalvectora z normalnej mapy, będzie to przeważnie w górę, jeśli jej prawa lub lewa strona, coś jest nie tak z siatką).
tkausl