Grafika komputerowa - PovRay


 

Generacja obrazów scen 3-D przy pomocy programu POV-ray

.

      Zapoznanie się z technologią generacji obrazów scen 3-D metodą śledzenia promieni (ray-tracing)
w programie POV-ray:

 

  • układ współrzędnych, orientacja osi układu, obroty wokół osi;
  • transformacje elementarne, translacja, skalowanie, obrót wokół osi;
  • składanie transformacji;
  • inicjalizacji zmiennych i realizacji pętli programowej,
  • konstruowania modeli złożonych obiektów geometrycznych przy pomocy konstrukcyjnej geometrii bryłowej (CSG),
  • definiowania własnych obiektów geometrycznych,

Krok 1 - Uruchomienie programu POV-ray, pierwszy przykład generacji obrazu sceny 3-D

  1. Skopiować z katalogu G:\Informatyka\Grafika.pg\POV_Ray do folderu F:\graf3d (w katalogu domowym) plik Scena_1.pov
  2. Uruchomić program POV-ray.
  3. Przy pomocy polecenia File > Open File > .../Scena_1.pov wczytać opis tekstowy sceny (jest to pewien program napisany w specyficznym języku opisu sceny) do pola edytora programu POV-ray.
  4. Obejrzeć (bez zbytniego zwracania uwagi na zrozumienie tekstu) treść wczytanego opisu sceny (programu).
  5. Wykonać polecenie Render > Start Rendering lub nacisnąć przycisk Run (oznaczony czerwonym, biegnącym człowieczkiem).
  6. Zaobserwować efekt wykonanego polecenia i spróbować skojarzyć wygląd wygenerowanego obrazu z tekstem opisu sceny umieszczonym w polu edytora.
  7. Zmienić w treści opisu sceny (edytując tekst przy pomocy typowych poleceń edycyjnych) linię pigment { color Red} na pigment { color Yellow}.
  8. Ponownie nacisnąć przycisk Run i zaobserwować efekt.
  9. Zapisać wynik zmiany przy pomocy polecenia File > Save.
  10. W okienku z napisem 320x240, No AA (co oznacza, że generowany obraz ma rozmiar320 na 240 pikseli i jest uzyskiwany bez zastosowania mechanizmu antyaliasingu), zmienić selekcję na 640x480, No AA i nacisnąć przycisk Run (rozdzielczość można zmienić również przez wykonanie polecenia Reneder > Edit Setings/Render i wpisanie w okienko Section odpowiednich parametrów rozdzielczości).
  11. Kolejny raz zmienić selekcję tym razem na 640x480, AA 0.3, nacisnąć przycisk Run i porównać uzyskany obraz z poprzednim.

Krok 2. Analiza treści opisu sceny

  1. Plik Scena_1.pov zawierający opis sceny, której obraz wygenerowano w poprzednim punkcie ma następującą treść i dla większej przejrzystości podzielony został na fragmenty, oznaczone różnymi kolorami. Funkcje jakie pełnią poszczególne fragmenty zostały opisane w formie komentarzy.
 #include "colors.inc"   /*  włączenie pliku zawierającego  */ 
/* predefiniowane elementy sceny */
background { color Cyan} /* określenie koloru tła */


camera /* określenie pozycji obserwatora */
/* (sposobu patrzenia na obiekt)*/
{
location <0, 2, -3>
look_at <0, 1, 2>
}

sphere /* definicja obiektu */
{ <0, 1, 2>, 1.5 texture { pigment { color Red } } } light_source { <2, 4, -3> color White} /* definicja oświetlenia sceny */
Dalsza analiza treści pliku z opisem sceny zostanie przeprowadzona w kolejnych punktach.

Krok 3. Włączanie do opisu sceny obiektów predefiniowanych

Fragment 1 zawiera komendę powodującą włączenie do treści opisu sceny elementów zdefiniowanych wcześniej i zapisanych w pliku z rozszerzeniem .inc. W tym przypadku jest to plik o nazwie colors.inc, w którym umieszczone zostały definicje różnych kolorów (wyrażone w modelu barw RGB). Niewielki fragment pliku colors.inc pokazano poniżej.

...

#declare Copper = color red 0.72 green 0.45 blue 0.20;
#declare Bronze = color red 0.55 green 0.47 blue 0.14;
#declare Bronze2 = color red 0.65 green 0.49 blue 0.24;
#declare Silver = color red 0.90 green 0.91 blue 0.98;
#declare BrightGold = color red 0.85 green 0.85 blue 0.10;
#declare OldGold = color red 0.81 green 0.71 blue 0.23;
#declare Feldspar = color red 0.82 green 0.57 blue 0.46;
#declare Quartz = color red 0.85 green 0.85 blue 0.95;
#declare Mica = color Black; // needed in textures.inc
#declare NeonPink = color red 1.00 green 0.43 blue 0.78;
#declare DarkPurple = color red 0.53 green 0.12 blue 0.47;
#declare NeonBlue = color red 0.30 green 0.30 blue 1.00;
#declare CoolCopper = color red 0.85 green 0.53 blue 0.10;
#declare MandarinOrange = color red 0.89 green 0.47 blue 0.20;

...

Kolejne linie pliku są definicjami kolorów o podanych nazwach. Podane liczby oznaczają zawartości skłdowych R,G,B i są liczbami z przedziału [0, 1]. Jeśli plik colors.inc zostanie włączony do treści opisu sceny przy pomocy komendy #include "plik" , to dalej zastosowanie danego koloru wymaga jedynie podania jego nazwy.

  1. Zmniejszyć rozdzielczość generowanego obrazu sceny, powracając do ustawienia 320x240, No AA.
  2. Zmienić w treści opisu sceny linię pigment { color ...} wpisując nazwy kolorów podane w pokazanym wyżej fragmencie pliku colors.inc (np. Copper, Silver itd) i generować obrazy sceny obserwując jak zmienia się wygląd kuli.
  3. Obejrzeć zawartość pliku colors.inc

Krok 4. Określenie tła

Tło zdefiniowane zostało w opisie przykładowej sceny przy pomocy komendy background {color Cyan}. Tło nie jest obiektem geometrycznym, lecz kolorem, którym wypełniane są punkty obrazu sceny nie związane z żadnym obiektem. Domyślny kolor tła jest kolorem czarnym.

  1. Zmienić w komendzie opisującej tło kolor na inny i zaobserwować efekt.
  2. Ustawić tło jako czarne (kolor domyślny) przez wstawienie znaków komentarza. Można to zrobić na dwa sposoby:

  3. // background { color color}
    lub
    /* background { color color} */

    Komentarz jest to fragment pliku opisu sceny (programu), który nie będzie miał żadnego wpływu na treść generowanego obrazu. W procesie generacji obrazu będzie on ignorowany.
    W pierwszym przypadku jako komentarz traktowany jest tekst od znaków // do końca danej linii.
    W drugim, tekst umieszczony pomiędzy sekwencją znaków /* ...*/. W tym przypadku tekst komentarza może się skłdać z wielu linii.

    Komentarze służą do umieszczania w treści programu informacji zwiększjaących jego czytelność i powinny być często stosowane. W większych programach brak komentarzy jest dowodem niechlujstwa programisty, a nie jak się sądzi w niektórych kręgach tzw. informatyków przejawem profesjonalizmu.

  4. Wypróbować efekt działania komentarzy; zauważyć, że fragment, który jest komentarzem wyświetlany jest dla większej czytelności innym kolorem.

Krok 5. Określenie układu współrzędnych i sposobu patrzenia na scenę

Układ współrzędnych używany w programie POV-Ray jest tzw. układem lewoskrętnym.
lewoskrętny układ współrzędnych prostokątnych

Orientację osi ukłdu można wyobrazić sobie posługując się następującym przykładem. Jeśli na płaszczyźnie wyznaczonej przez osie x-y zostanie umieszczony ekran monitora, to oś z będzie swoim grotem wbijała się w ekran, czyli punkt o większej wartości współrzędnej z będzie położony dalej od ekranu. W układzie zdefiniowanym powyżej, opisywane będą dalej wszystkie obiekty geometryczne umieszczane na modelowanej scenie.

Generacja obrazu sceny 3-D wymaga prócz opisania samej sceny określenia sposobu jej obserwacji. Formalnie sprowadza się to do określenia sposoby rzutowania punktów z przestrzeni trójwymiarowej na płaszczyznę. W programie POV-Ray do określenia sposobu rzutowania służy komenda camera użyta w pokazanym wyżej, przykładowym programie w postaci:

camera       /*  określenie pozycji obserwatora  */ 
/* (sposobu patrzenia na obiekt */
{ location <0, 2, -3> look_at <0, 1, 2> }
Funkcje jakie pełnią opcje location i look_at wyjaśnia rysunek

Opcja location< x, y, z > definiuje położenie w przestrzeni trójwymiarowej, punktu, w którym umieszczone jest ognisko obiektywu fikcyjnego aparatu fotograficznego mającego wykonać zdjęcie sceny. Opcja look_at< x, y, z > ustala natomiast punkt przez, który przechodzi oś obiektywu. Inaczej mówiąc location określa punkt, z którego obserwator patrzy na scenę a look_at punkt, na który patrzy.
  1. Wiedząc, że rysowanym obiektem jest kula o promieniu r = 1,5 i środku umieszczonym w punkcie (x, y, z) = (0, 1, 2) (patrz następna komenda opisu sceny) zmienić w kilkakrotnie parametry opcji location i look_at tak, aby nabrać pewnej wprawy w manipulowaniu położeniem kamery.
  2. Przećwiczyć takie umieszczanie kamery aby można było w sposób kontrolowany oddalać się od pokazywanej na rysunku kuli.
  3. Sprawdzić co stanie się gdy kamera zostanie umieszczona wewnątrz kuli i na jej powierzchni.

Krok 6. Opis obiektu na scenie

W przykładowym programie opisującym scenę pokazanym w punkcie 2 występuje tylko jeden obiekt. Jest nim sfera (powierzchnia kuli) o promieniu r = 1,5 i środku umieszczonym w punkcie
(x, y, z) = (0, 1, 2). Komenda definiująca sferę ma następującą postać:
sphere                 /*  nazwa obiektu */ 
{
<0, 1, 2>, 1.5 /* współrzędne środka i promień */
texture /* charakterystyka powierzchni obiektu (tekstura) */
{
pigment { color Red }
/* barwa powierzchni obieku: czerwona */
}
}

Współrzędne środka i promień opisują geometrię obiektu, natomiast komenda texture zawarta wewnątrz komendy sphere pozwala na opisanie charakterystyki powierzchni obiektu. W tym przypadku opis jest bardzo prosty, mówi jedynie, że powierzchnia sfery jest czerwona. Możliwe są oczywiście do zdefiniowania bardziej subtelne charakterystyki powierzchni obiektu. Powyższy fragment programu definiujący sferę jest w pełni równoważny tekstowi:

sphere { <0, 1, 2>, 1.5 texture { pigment { color Red } } }

bowiem przy generowaniu obrazu sceny spacje, nowe linie i komentarze są ignorowane.
  1. Zmienić kilkakrotnie położenie środka i promień sfery, generując za każdym razem obraz i obserwując efekty zmian.
  2. W oknie edytora programu POV-Ray zaznaczyć definicję sfery i przy pomocy poleceń Edit > Copy i Edit > Paste skopiować treść komendy opisującej sferę, aby w ten sposób uzyskać definicję drugiej sfery (umieszczając je jedna za drugą).
  3. Zmienić parametry i kolor drugiej sfery a następnie wygenerować obraz sceny.
  4. Zaznaczyć definicję drugiej sfery i skasować ją przy pomocy polecenia Edit > Delete.
  5. Dodać do opisu sceny drugi obiekt (płaszczyznę pokrytą wzorem szachownicy) przez dopisanie po fragmencie z definicją sfery następujących linii.
plane                   /* nazwa obiektu */ 
{
<0, 1, 0>, -1
/* parametry opisujące płaszczyznę */
pigment {checker color Red, color Blue } /*(czerwono - niebieska szachownica) */
}

Parametry opisujące płaszczyznę to: współrzędne wektora normalnego < nx, ny, nz > (wektora prostopadłego do płaszczyzny) i odległość od środka układu współrzędnych, liczona wzdłuż kierunku wyznaczonego przez wektor normalny. W powyższym przykładzie opisana została płaszczyzna równoległa do płaszczyzny wyznaczonej przez osie x i z układu współrzędnych i przesunięta o jedną jednostkę w dół, licząc wzdłuż osi y. Wprowadzenie płaszczyzny pozwoli na lepszą orientację obserwatora obrazu w przestrzeni.

Krok 7. Opis sposobu oświetlenia sceny

Aby po wygenerowaniu obrazu zdefiniowany w opisie sceny obiekt był widoczny, na scenie musi znajdować się przynajmniej jedno źródło światła. W analizowanym opisie sceny z punktu 2 żródło światła opisuje fragment:

light_source { <2, 4, -3> color White}      /* definicja źródła światła */

Określono w ten sposób źródło punktowe, umieszczone w punkcie (x, y, z) = (2, 4, -3), świecące światłem białym. Możliwe jest określeni wielu źródeł i uzyskanie znacznie bardziej subtelnych charakterystyk świecenia.

  1. Zmienić kolor sfery na biały.
  2. Zmienić kilkakrotnie położenie źródła (przesuwając je w prawo, w lewo a także poza obiekt ) i obserwować efekty zmian.
  3. Zmienić kolor światła np. na czerwony, zielony itd. i obserwować jak wygląda obraz białej kuli.
  4. Zmienić kolor kuli i obserwować jak wygląda jej obraz przy oświetlaniu kolorowym światłem.
  5. Skopiować linię opisującą źródło, wprowadzając w ten sposób nowe źródło światła.
  6. Oświetlać kulę kilkoma źródłami świecącymi różnymi kolorami.

Krok 8. Transformacje obiektów geometrycznych

  1. Napisać prosty program rysujący stożek ( cone ) przy następujących założeniach:
    • stożek umieszczony jest w środku układu współrzędnych (czyli tak, że środek podstawy znajduje się w punkcie (0, 0, 0) a wierzchołek w punkcie (0, d, 0)),
    • stożek obserwowany jest z kamery znajdującej się na ujemnej części półosi osi z ( location <0, a ,- b>, look_at <0,0,0> ),
    Uzyskany obraz powinien wyglądać mniej więcej tak:


    stożek, którego środek podstawy znajduje się w punkcie (0, 0, 0)

  2. Zapisać scenę pod nazwą program1.
  3. Otworzyć nowy plik opisu sceny, zapisać go pod nazwą program2, zdefiniować drugi stożek (innego koloru) i zaobserwować działanie odpowiednio użytych (patrz plik pomocy) komend
    • translate
    • scale ,
    • rotate
    Zbadać wpływ kolejności wykonywania transformacji na wynik końcowy. Rysunek pokazuje efekt uzyskany po skopiowaniu opisu stożka zielonego, zmianie koloru na czerwony i zastosowaniu w jego opisie komendy translate <0, 0, c>. Po zakończeniu zapisać plik z definicją sceny.


    stożek czerwony powstał przez przesunięcie stożka zielonegowzdłuż osi z

Krok 9. Podstawowe konstrukcje programowe języka opisu sceny, deklarowanie zmiennych, pętla

  1. Deklaracja zmiennej w języku opisu sceny stosowanym w programie POV-Ray wygląda następująco:
    #declare Count = 0;        /*  zdefiniowana została zmienna Count i przypisano jej wartość 0 */ 

    W linii deklaracji zmiennej można stosować operacje arytmetyczne +, -, *, / np :

    #declare Number = 64; /* zdefiniowana została zmienna Count i przypisano jej wartość 0 */
    #declare Ang = 360/Number; /* zdefiniowana została zmienna Ang i przypisano jej wartość
    wyliczoną na podstawie wartości zmiennej Number */
  2. Struktura pętli programowej (liczby 1 i 64 są przykładowe) wygląda natomiast tak:
    #declare Count = 1;         /*  Deklaracja i ustawienie wartości początkowej licznika pętli*/ 
    #declare Number = 64; /* Deklaracja i ustawienie wartości liczby przebiegów pętli*/

    #while (Count < Number+1) /* Sprawdzenie warunku końca pętli*/


    (komendy do wykonania wewnątrz pętli )


    #declare Count= Count+1; /* Zwiększenie licznika petli*/
    #end /* Koniec pętli*/
  3. Wykorzystując program z poprzedniego punktu oraz używając komendy translacji i pętli opisać scenę, na której prócz zielonego stożka znajdzie się jeszcze dziesięć czerwonych stożków oddalonych równo od siebie. Przykład obrazu takiej sceny pokazano na rysunku. Program zapisać pod nazwą program3.



  4. 10 czerwonych stożków jako efekt wykonania pętli (w stosunku do poprzednich obrazów punkt usytuowania obserwatora został nieznacznie zmieniony)

Używając jako obiektu elementarnego sfery, trzech poznanych wczeœniej transformacji i konstrukcji pętli napisać program generujący obraz obiektu podobny do obiektu na rysunku. Zapisać program pod nazwą program4.

Krok 10. Podstawy konstrukcyjnej geometrii bryłowej (Constructive Solid Geometry).

  1. Utworzyć plik z opisem sceny i nazwać go program5.
  2. Skopiować zawartość pliku o nazwie program1 (pojedynczy zielony stożek).
  3. Wprowadzić do opisu sceny drugi stożek tak aby, otrzymać obraz podobny do pokazanego na rysunku.



  4. Dwa stożki


  5. Prześledzić (posługując się przy edycji opisów sceny plikiem pomocy) efekty jakie można uzyskać stosoując operacje konstrukcyjnej geometrii bryłowej:
    • union,
    • intersection,
    • difference,
    • merge.
  6. Określić i zilustrować różnicę pomiędzy operacjami union i merge (aby ją dostrzec należy przynajmniej jeden z obiektów zdefiniować jako przezroczysty).

Krok 11. Definiowanie własnych obiektów

  1. Utworzyć plik z opisem sceny i nazwać go program6.
  2. Skopiować treść pliku o nazwie program4 (zielony pierścień).
  3. Wprowadzić do opisu sceny ("obejmując" jej zakresem opis pierścienia) następującą konstrukcję:


  4. # declare My_object = union
    {

    ( dowolny ciąg komend opisujących obiekt )

    }

    można w ten sposób zdefiniować nowy obiekt o nazwie My_object. W deklaracji opisu obiektu użyto komendy union w ogólności może być tu użyta inna komenda (np. merge, intersection, itd. ).

  5. Wygenerować obraz sceny. Jeśli nie ma błędów w tresci opisu obiekt powinien zniknąć.
  6. Po deklaracji obiektu My_object dodać linię wywołania obiektu przy pomocy komendy object:
  7. object 
    {
    My_object translate <0, 0, 0>
    }

    po wygenerowaniu obrazu pierścień powinien pojawić się ponownie w tym samym miejscu gdzie był poprzednio. Przedstawiona powyżej konstrukcja pozwala na operowanie jedynie nazwą obiektu i stosowanie do jego przemieszczania dowolnych transformacji.

  8. Posługując się definicją pierścienia, komendą object i pętlą programową, zmodyfikować program opisujący scenę tak, aby uzyskać obraz podobny do pokazanego na rysunku.. Scena zawiera 36 pierścieni a każdy z nich zbudowany jest z 64 sfer:
  9. Pokazane wyżej konstrukcje programowe pozwalają na dalsze zagnieżdżanie opisów obiektów.