Autor Wątek: Obliczanie normalnych dla pojedynczych wierzchołków.  (Przeczytany 2613 razy)

Offline Draconis

  • Użytkownik

# Listopad 12, 2009, 22:31:56
Witam.
Jak w temacie - szperałem troszkę w polsko- i anglojęzycznych kursach matmy dla grafików, wikipedii, googlach itp. Wszędzie opisane wyznaczanie wektora normalnego jako wektora prostopadłego do pewnej płaszczyzny. Oczywiście iloczyn wektorowy, moduł wektora, normalizacja itp. Potrzebuję jednak znaleźć normalne per-vertex, czyli mając jedynie współrzędne x, y i z danego wierzchołka (czytaj: cieniowanie płynne).
Za każdą odpowiedź z góry dziękuję.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Listopad 12, 2009, 22:37:22
Normalna to z definicji prosta prostopadła do płaszczyzny. Jeśli chcesz cieniowanie gładkie to wystarczy pododawać do siebie normalne używane przez wierzchołek we wszystkich face'ach. Tu masz pseudokod: http://www.idevgames.com/forum/showpost.php?s=9694fb82aa953a250f3dd6c09cc20485&p=117661&postcount=8

Offline Draconis

  • Użytkownik

# Listopad 12, 2009, 22:47:38
Ok, muszę to jakoś przetworzyć. Jeśli dobrze zrozumiałem: jeśli wierzchołek jest współdzielony przez załóżmy trzy ściany, dodaję normalne tych trzech ścian, normalizuję to i otrzymuję to czego szukam, czyli normalną, którą podaję dla wierzchołka przy cieniowaniu płynnym?

Offline soku11

  • Użytkownik

# Listopad 12, 2009, 23:49:43
Tak.

Offline Draconis

  • Użytkownik

# Listopad 13, 2009, 00:27:19
Jeszcze tylko jedno pytanko: czy to działa dla każdej bryły? Bo np. dla sześcianu jednostkowego (wsp. kanoniczne z przedziału <-1; 1>) takie obliczenia dają w wyniku współrzędne wierzchołków, dla których jest to liczone; rozumiem, że to poprawny efekt...?

Offline Anton Chigurh

  • Użytkownik

# Listopad 13, 2009, 01:10:23
Tak, a jeśli urodziłeś się 1. stycznia 1901 roku, to jedna z normalnych wskaże Twoją datę urodzenia! ;)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 13, 2009, 03:09:15
Tak, a jeśli urodziłeś się 1. stycznia 1901 roku, to jedna z normalnych wskaże Twoją datę urodzenia! ;)
Co przy okazji będzie oznaczało, że zapomniałeś znormalizować wyniku i za chwilę pochrzani Ci się oświetlenie. ;)

Offline Draconis

  • Użytkownik

# Listopad 13, 2009, 03:40:59
Wszystko fajnie, jeszcze tylko jedna kwestia: o normalizacji wyników pamiętam, jest jednak pewien problem. Ilekroć analizuję cudzy kod, zawsze współrzędne znormalizowanych wektorów mają współrzędne 1, 0 lub -1. Załóżmy że mam wektor v = [1, 1, 1]; |v| = srqt(1*1+1*1+1*1) czyli sqrt(3). Tak więc normalizacja tego wektora daje wersor vn = [1/sqrt(3), 1/sqrt(3), 1/sqrt(3)]. Wszystko super, długość się zgadza (1/3 + 1/3 + 1/3 = 1) a więc jest to istotnie wektor znormalizowany. Czy jednak jego współrzędne mogą mieć taką postać? Nie muszą być całkowite lub ze zbioru {-1, 0, 1}? Jakoś mi nie pasuje w kodzie współrzędna pokroju 1/sqrt(3).

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 13, 2009, 03:59:46
Cytuj
Czy jednak jego współrzędne mogą mieć taką postać?
Jasne, że mogą.

Offline Draconis

  • Użytkownik

# Listopad 13, 2009, 04:05:30
Dzięki wielkie za wszystkie odpowiedzi;-)

Offline RedHot

  • Użytkownik

# Listopad 13, 2009, 14:23:38
Zapoznaj się jeszcze z zachowywaniem krawędzi

http://www.gamedev.net/reference/articles/article1763.asp