każdy zauważył, że nie wszystkie powierzchnie są płaskie! Można tworzyć przybliżenia takich powierzchni, stosując płaskie wielokąty, ale...

Linki


» Dzieci to nie książeczki do kolorowania. Nie da się wypełnić ich naszymi ulubionymi kolorami.
»
SZEŚĆ ŚWIATÓW CYKLICZNEJ EGZYSTENCJIWedług nauk buddyjskich, istnieje sześć światów (loka*) egzystencji, w których przebywają wszystkie...
»
wszystkim, dał mu przeto taką kurę, na którą, kiedy zawołać: – Kurko, kurko! znieś mi złote jajko! – w istocie złote znosiła jajko...
»
Tworząc kod obsługi zasad biznesowych dobrą praktyką jest tworzenie funkcji obsługi wszystkich zasad...
»
Wejrzyj na mnie, broń mnie od zasadzek nieprzyjaciół widzialnych i niewidzialnych, wspomagaj mnie we wszystkich moich potrzebach, pocieszaj w cierpieniach mego...
»
Dlatego marzyła, żeby żyć wiecznie w legendzie, jak Ans-set, i zadała sobie wiele trudu, żeby dowiedzieć się o nim wszystkiego, co tylko możliwe...
»
 Z tego wszystkiego wyłania się inny interesujący problem: w jaki sposób wyzwania - takie jak rozlew krwi, rewolucja czy inny wstrząs - pomagają nam...
»
Silne stronyDo silnych stron firmy NETKOM mających wpływ na wybór strategii działania zaliczyć trzeba przede wszystkim:szeroki asortyment usług; firma...
»
Zawsze, gdy wracała od swej siostry Nesty, mieszkającej w San Francisco, liczyła z okna samolotu wszystkie te turkusowe baseny pływackie, które zdobiły Dolinę,...
»
— Wszystko w porządku? — Jane podeszła szybko, przed fotelem Adriana, do łóżka męża...
»
Vendôme z powodu rozmiarów swego cokołu, trzon kolumny jest z jednego kawała granitu, największy z wszystkich, jakie wykonała kiedykolwiek ludzka ręka...

Dzieci to nie książeczki do kolorowania. Nie da się wypełnić ich naszymi ulubionymi kolorami.

Później omawiać będziemy techniki pozwalające na
tworzenie iluzji łagodnych krzywizn za pomocą „wykręconych” wektorów normalnych
(kolejne czary!). Ale zacznijmy od początku…
)
Aby zobaczyć, jak definiuje się normalną dla wierzchołka, spójrzmy na rysunek 5.22, na
którym znajduje się płaszczyzna umieszczona w przestrzeni trójwymiarowej ponad
płaszczyzną xz. Staraliśmy się jak najbardziej uprościć ten rysunek, aby zademonstrować
pojęcie normalnej. Proszę zauważyć linię biegnącą przez wierzchołek 12 2 3 pro-
stopadle do płaszczyzny. Jeżeli wybierzemy na tej linii dowolny inny punkt, na przykład 1223, to linia od pierwszego punktu do drugiego będzie naszym wektorem
normalnym. Drugi z podanych punktów określa, że kierunek normalnej wskazuje w górę
osi y. W ten sposób określana jest też przednia i tylna strona wielokąta, ponieważ wektor
normalny wskazuje też przednią stronę powierzchni.
Jak widać, drugi punkt podawany jest jako liczba jednostek w osi x, y i z, opisujących
pewien punkt na wektorze normalnym wychodzącym z wierzchołka. Zamiast podawać
dwa punkty dla każdego wektora normalnego, możemy odjąć współrzędne wierzchołka
od współrzędnych tego drugiego punktu, a otrzymamy trzy wartości współrzędnych
określających odległość drugiego punktu od wierzchołka w osi x, y i z. W naszym przy-
kładzie byłoby to:
!!2!!#!2!!2!#4
248
Część I Klasyka OpenGL

Wektor normalny
oddalający się
prostopadle
od płaszczyzny
Na powyższy przykład można spojrzeć jeszcze inaczej. Jeżeli wierzchołek zostanie przesu-
nięty do początku układu współrzędnych, to punkt wyznaczony przez powyższe odejmo-
wanie nadal będzie określał kierunek wektora normalnego w stosunku do powierzchni.
Na rysunku 5.23 przedstawiony został wektor przesunięty w ten właśnie sposób.

Przesunięty wektor
normalny
Wektor jest wielkością kierunkową informującą bibliotekę OpenGL o kierunku, w jakim
ustawione są wierzchołki (lub wielokąty). Poniższy fragment kodu pochodzi z naszego
przykładowego programu JET i przedstawia określanie wektora normalnego dla jednego
z trójkątów.
& %')$+,%-
0102!1010
/ 01010>10
/ 02! 101010
/ 0! 101010
-
Rozdział 5. Kolor, materiały i oświetlenie. Podstawy
249
Nawinięcie wielokątów
Proszę przyjrzeć się kolejności definiowania wierzchołków trójkąta pochodzącego z samolotu.
Jeżeli będziemy się mu przyglądać od strony wskazywanej przez wektor normalny, to wierzchołki będą układać się w kierunku przeciwnym do ruchu wskazówek zegara. Nazywane jest to nawinięciem wielokąta. Domyślnie przodem wielokąta określa się tę stronę, po której wierzchołki układają się właśnie w kierunku przeciwnym do ruchu wskazówek zegara.
Funkcja )7 pobiera w parametrach trzy współrzędne określające wektor nor-
malny wskazujący kierunek prostopadły do powierzchni trójkąta. W tym przykładzie
normalne wszystkich trzech wierzchołków mają dokładnie taki sam kierunek wskazujący
w dół ujemnych wartości osi y. Jest to bardzo prosty przykład, ponieważ cały trójkąt leży
w płaszczyźnie xz; jest on po prostu wycinkiem brzucha samolotu. Jak będzie można zobaczyć później, często będziemy musieli określać inne wektory normalne dla każdego
wierzchołka wielokąta.
Perspektywa definiowania wektora normalnego dla każdego wierzchołka wielokąta może
być nieco przerażająca, szczególnie że wiele powierzchni nie leży dokładnie na jednej
z głównych płaszczyzn. Bez obaw! Szybko podamy przydatną funkcję, z której możemy
korzystać cały czas do wyliczania wektorów normalnych.

W czasie gdy biblioteka OpenGL będzie „odprawiać swoje czary”, wszystkie wektory nor-
malne muszą zostać zamienione w normalne jednostkowe. Normalna jednostkowa jest
zwykłym wektorem normalnym o długości . Normalna przedstawiona na rysunku 5.23 ma
długość 5 jednostek. Długość każdej normalnej można uzyskać, podnosząc do kwadratu
wartość każdej współrzędnej, sumując wyniki, a następnie wyciągając z tej sumy pierwia-
stek kwadratowy. Jeżeli teraz podzielimy każdą składową wektora normalnego przez tę
długość, to otrzymamy identycznie skierowany wektor, ale o długości równej . W tym
przypadku nasz nowy wektor normalny będzie określany współrzędnymi 1223. Proces
ten nazywany jest normalizacją. Tak więc dla potrzeb obliczeń oświetlenia, wszystkie wektory normalne musza zostać znormalizowane. Świetny żargon!
Możemy nakazać bibliotece OpenGL wykonywanie normalizacji wszystkich wektorów
normalnych. Trzeba tylko wywołać funkcję * z parametrem !")'.$!+8*:
- %'($,+B-
Z tą metodą wiążą się jednak pewne spadki wydajności. Znacznie lepszym wyjściem
jest od razu wyliczyć znormalizowany wektor normalny, niż zlecać bibliotece OpenGL
wykonywanie tego zadania.
Trzeba zaznaczyć, że wywołanie funkcji 9 również będzie wpływać na długość
naszego wektora normalnego. Jeżeli będziemy jednocześnie stosować funkcję 9 i me-

Powered by MyScript