• Welcome to Forum graficzne Burning-Brushes.pl. Please log in or sign up.
 

Jak zrobić napisy 3d w POV-Rayu?

Zaczęty przez Abik, Kwiecień 03, 2011, 18:57:02

Poprzedni wątek - Następny wątek
Przed ogarnięciem tego tutoriala zachęcam do ogarnięcia tego: http://burning-brushes.pl/pozostale-tutoriale/podstawy-pov-raya/msg113876/#msg113876 chociaż nie jest to niezbędne ;D

Cześć! Czas najwyższy zacząć i skończyć tego tutka. Będzie on opisywać dokładnie to jak w pov-rayu zrobić trójwymiarowe napisy. Wiem, że nie znacie pov-raya (no chyba, że ogarnęliście tutka sympatyka), ale wszystko co będzie konieczne do zrobienia tych napisów będzie tutaj opisane, a warto to ogarnąć bo umiejętność robienia napisów w 3d przydaje się bardzo często, nawet (albo i zwłaszcza) grafikom 2d.

1. Pierwsza sprawa (i prawdę mówiąc chyba najważniejsza), to pamiętajcie, że pracujemy w przestrzeni 3d. W pov rayu jest ona zbudowana w następujący sposób:

Nie wiem czy ten obrazek coś wam sprawę rozjaśnia, więc dodatkowo to wytłumaczę. Jak każda przestrzeń trójwymiarowa, ta w pov-rayu też, jest opisana przez trzy składowe - X, Y, Z. Na obrazku są reprezentowane w postaci osi co pewnie znacie ze szkoły czy z tvn'u. Jaki jest problem z tymi osiami? W zasadzie to nie ma tu problemu, wręcz przeciwnie, wg mnie w pov-rayu jest to bardzo pięknie rozwiązane i bardzo ułatwia zrozumienie przestrzeni 3d bo możemy sobie wyobrazić, że dolna krawędź monitora odpowiada osi Y, boczna krawędź osi X, a długość odpowiada osi Z. To ekstremalnie wszystko ułatwia bo nie musimy myśleć gdzie te nasze osie tak na prawdę są. Jedyna istotna sprawa z nimi związana, to że środek naszego układu czyli punkt 0,0,0 znajduje się właściwie w środku monitora.
Zrozumienie tej przestrzeni jest na prawdę ekstremalnie istotne... no może nie w tym tutku bo tu tylko zrobimy napisy 3d, ale i tak warto wynieść z tego coś więcej niż tylko tę jedną umiejętność. Jeśli mielibyście problemy ze zczajeniem tej reprezentacji przestrzeni to piszcie, wszystko wytłumaczę (najlepiej w temacie na forum to wtedy wszyscy skorzystają).

2. Zanim zajmiemy się umieszczeniem czegokolwiek na naszej scenie (tzn. zanim umieścimy napis : D) musimy ustalić punkt w przestrzeni gdzie znajdzie się kamera, czyli punkt, z którego patrzymy na naszą scenę.
Dla ułatwienia całej sprawy, umieścimy go sobie mniej więcej w miejscu gdzie znajduje się nasza głowa względem monitora. Tzn. jeśli założymy sobie, że krawędzie monitora są osiami X, Y, Z, to możemy sobie w takim układzie odniesienia ustalić pozycję naszej głowy, która znajduje się przed monitorem. Spójrzcie sami:

Tak to wygląda w rzucie z boku. Nasza głowa znajduje się przed monitorem, więc składowa Z (głębokość) musi przyjąć jakąś ujemną wartość, ale jednocześnie znajduje się mniej więcej dokładnie na wysokości punktu 0 na osi Y, czyli składowa Y musi być równa 0. Pytanie co z X'em? Możemy go zostawić w spokoju, tzn. równego zero, co oznacza, że nasza głowa znajdować się będzie na środku monitora. Środek osi X, znajduje się na środku monitora, a nie w rogu, pamiętajcie, z resztą to samo dotyczy pozostałych składowych, środek przestrzeni znajduje się w centralnym punkcie monitora, pamiętajcie, środek wszechświata jest w waszym monitorze! :D
No dobra, wiemy jak to ma być, ale jak to właściwie zrobić?
No musimy sobie to zapisać tak:
camera{
   location<0,10,-10>
}

Polecenie "camera" służy do umieszczenia obiektu kamery. Dalej obowiązkowo klamry { }, a pomiędzy nimi bardziej szczegółowe opcje jak ta nasza kamera ma tam sobie być.
Opcja location, jak nietrudno się domyśleć mówi, gdzie nasza kamera będzie umieszczona. Pomiędzy nawiasami ostrymi podajemy parametry, X, Y i Z. Tak jak ustaliliśmy X bez zmian(czyli 0), Y równy 0 i Z ujemne, tu -10.
Coś już mamy, warto by sprawdzić czy to działa, albo chociażby wiedzieć jak zobaczyć jak to wygląda. Nic prostszego, klikamy na przycisk Run (podświetlony na czerwono na screenie) i pov-ray generuje nam podgląd:

Hmm chyba coś nie działa bo nasz podgląd wygląda tak:

A już było tak pięknie! No ale nie bójcie się, w końcu to ja, sam Abik :D prowadzę was przez mroki pov-raya, więc uwierzcie, ze wszystko jest dobrze, z resztą myślę, że sami dobrze się spodziewaliście, że nic na razie nie zobaczymy. A dlaczego? Bo nie mamy poza kamerą żadnego obiektu na scenie.
Zanim wprowadzimy nowy obiekt, jeszcze jedno słówko o podglądzie. Tutaj możemy sobie ustalić podstawowe opcje generowanego obrazu:

Możemy wybrać rozmiar (im większy tym lepiej, no ale tym dłużej trwa renderowanie czyli rysowanie naszego obrazka) oraz czy ma być renderowany z antyaliasingiem czy bez, tzn. czy ma mieć ładnie wygładzane linie czy nie, oczywiście antyaliasing zwiększa czas renderowania, ale zazwyczaj powoduje, że obraz wygląda lepiej. Do zastosowań roboczych możemy zostawić ustawienia domyślne.

3. Super, jesteśmy panami trójwymiarowej przestrzeni, rozumiemy jak działa, umiemy nawet umieścić kamerę i wyrenderować obraz... czarny obraz. Czas dodać obiekt naszego napisu.
Niestety bardzo mnie to boli, ale nie ma tu zbyt wielkiej filozofii i nie bardzo jest się nad czym rozpisywać. Mamy poleceni text{ }, które odwala za nas większą część roboty.
Jako pierwszy parametr podajemy czcionkę, co łącznie wygląda tak:
text{
   ttf "Arial.ttf"
}

To bardzo bardzo nie wystarczy bo jako drugi argument musimy podać co ma być napisane, niech to będzie "Burning-brushes.pl"
text{
   ttf "Arial.ttf", "burning-brushes.pl"
}

To nadal mało bo wypadałoby podać głębokość naszego napisu, niech będzie to 1.
text{
   ttf "Arial.ttf", "burning-brushes.pl", 1
}

No czad, czad. Musimy jeszcze podać jeden parametr. Offset. Tu może słówko powiem co on ustala. Offset opisuje o ile każda kolejna literka jest przesunięta w górę lub w dół względem poprzedniej, może żeby nie było sucho to zastosujemy sobie do niego jakąś wartość (gdyby było to 0 to napisy byłyby w jednej linii), np. -0.1 ... a właśnie! Ujemne wartości oznaczają, że kolejne literki są coraz niżej, dodatnie wartości - coraz wyżej. Właściwie to nawet ma sens...... ah
text{
   ttf "Arial.ttf", "burning-brushes.pl", 1, -0.1
}

Yeah! Dodajmy jeszcze jakiś kolorek do napisu (domyślnie jest chyba czarny, a czarny na czarnym tle.....)
text{
   ttf "Arial.ttf", "burning-brushes.pl", 1, -0.1
   pigment{color<1,0,0>}
}

do ustalenia koloru mamy opcję pigment, którą możemy użyć przy każdym obiekcie jakiego użyjemy, np. napisie tak jak to właśnie robimy. W opcji pigment mamy pewną magiczną notację color<1,0,0> która oznacza, że nasz kolor będzie kolorem czerwonym. Pov-ray do opisu kolorów stosuje przestrzeń RGB, ale w zakresach od 0 do 1, minimalna wartość składowej to 0, a maksymalna to 1, mogłoby się to wydawać dziwne, gdyby nie to, że możemy używać też liczb rzeczywistych, a nie tylko całkowitych tzn. możemy składowej zero nadać wartość 0.4, albo 0.619 (pamiętajcie, kropka, a nie przecinek!), dzięki temu mamy dość dokładne możliwości ustawienia koloru. Ale... jest taki fajny gadżet, który możemy nam trochę uprościć pracę.
Pov-ray udostępnia kilka plików, które możemy sobie zaimportować do naszego są to np. textures.inc, shapes.inc, ale też colors.inc, który definiuje nazwy podstawowych kolorów. Jak możemy tego użyć? Na samym początku pliku musimy dopisać linijkę:
#include "colors.inc"
dzięki temu zamiast color<1,0,0> możemy użyć nazwy Red i uprościć cały zapis do takiej postaci:
text{
   ttf "Arial.ttf", "burning-brushes.pl", 1, -0.1
   pigment{Red}
}

Żeby się nie pogubić, cały nasz plik powinien teraz wyglądać tak:
#include "colors.inc"

camera {
    location <0, 0, -10>
}     
text{
   ttf "Arial.ttf", "Burning-brushes.pl", 1, -0.1
   pigment{color<1,0,0>}
}

No... to wciskamy run... i? Znowu czarne okno! No nie, ten cholerny pov-ray, jeszcze zaczniecie się przez niego bać ciemności. Mamy kamerę, mamy obiekt, wszystko ekstra? Dlaczego nic nie widzimy? Na te i inne pytania odpowiedź poznacie w następnym kroku, ale wcześniej krótka przerwa na reklamy.

[reklamy]
Żeby nie było, że jestem gołosłowny to zarzucę paroma linkami : D
Podstawy pov-raya wg Sympatyka: http://burning-brushes.pl/pozostale-tutoriale/pov-ray-podstawy/ Gorąco polecam żeby uzupełnić wiedzę, albo nawet, żeby najpierw się z nim zapoznać, a dopiero później z moim tutkiem, choć trochę późno o tym piszę.
http://burning-brushes.pl/pozostale-tutoriale/zen-coding-wprowadzenie-do-szybkiego-kodowania-w-html/ Genialny tutek Lyska, albo może po prostu dobry tutek Lyska o genialnym narzędziu do szybkiego kodowania html'a, polecam, bardzo przydatna rzecz.
http://burning-brushes.pl/dyskusje-i-pomoc/modele-przestrzeni-barw-co-to-jest-rgb-cmyk-i-inne/ mój artykuł (?) na temat reprezentacji kolorów w komputerze, myślę, że nikomu taka wiedza nie zaszkodzi
http://burning-brushes.pl/dyskusje-i-pomoc/pov-ray/ Temat w całości poświęcony pov-rayowi, prezentacja jego możliwości, klika linków do tutoriali.
[/reklamy]

4. Ok, witam po przerwie, mam nadzieję, że oblukaliście, którykolwiek z tych linków bo wszystkie są godne. Co do naszego problemu, to nie widzimy nic bo nie mamy światła! Brawo dla tych, którzy sami na to wpadli. W pov-rayu (i nie tylko, w blenderze np. też tak jest), światło jest osobnym obiektem, który musimy sami umieścić i skonfigurować. No takie życie, ciągle pod górkę :D
Jak to zrobić? Bardzo podobnie jak w przypadku kamery. Tym razem mamy polecenie light_source{ } gdzie jako pierwszy parametr podajemy w ostrych nawiasach składowe X, Y i Z gdzie nasze światło będzie umieszczone.
To pomyślmy gdzie chcemy mieć umieszczone nasze światło? Nasz obiekt... właśnie, gdzie jest nasz obiekt? Nie ustawiliśmy jego współrzędnych, więc domyślnie znajduje się w punkcie 0,0,0 (środek przestrzeni)... więc gdzie umieścić to światło, hmmm, w d... w dowolnym miejscu właściwie, bo gdziekolwiek będzie to i tak świeci w każdym kierunku, więc jakoś nam ten napis będzie oświetlać ten napis i coś zobaczymy.
Wyglądałoby to tak:
light_source {
    < 0, 0, -40>
}

przykładowo bo wartości możemy podać inne. Ok, gdybym był złośliwy to kazałbym wam wcisnąć run i skończyłoby się na tym, że znów nic byśmy nie widzieli, no i może na paru przekleństwach i zniszczonych komputerach, dlatego nie wciskajcie run bo i tak nic nie zobaczycie. Dlaczego? Bo w pov-rayu (to akurat raczej wada) światło musi mieć ustalony kolor (jakby nie mogło być domyślnie białe).
Robi się to bardzo prosto. Mamy parametr color, któremu wartości przypisujemy na tej samej zasadzie jak innym obiektom. Całe światło świecące i działające wyglądałoby tak:
light_source {
   < 0, 0, -40>
   color White
}   

Cały plik tak:

#include "colors.inc"

camera {
   location <0, 0, -10>
}
     
light_source {
   < 0, 0, -40>
   color White
}   

text{
   ttf "Arial.ttf", "Burning-brushes.pl", 1, -0.1
   pigment{Red}
}

No i teraz wciskamy run i widzimy:


5. No i czad bajer kurde, wreszcie mamy nasze napisy. Chociaż tak prawdę mówiąc, wyglądają strasznie kijowo bo skupiliśmy się bardzo szczegółowo na tym jak skonfigurować całą scenę i kamerę żeby w ogóle coś zobaczyć.
Ale przecież możemy sobie ustawić kamerkę inaczej, albo pozmieniać parę rzeczy żeby mieć lepszy widok na nasz napis bo teraz ledwo widać żeby był trójwymiarowy.
Po pierwsze, mi nie podoba się ta skośność napisu. Tzn. jest ok, ale jak dawałem wartość -0.1 to chciałem żeby to szło na prawdę powolutku w dół, no a jaka może być większa wartość niż -0.1, ale żeby nie przekraczała 0? No można by pomyśleć, że nie ma takiej, gdyby pov-ray przyjmował tylko wartości z dokładnością do jednej dziesiątej, ale możemy sobie pozwolić na większą burżuazję i jako parametr podać wartości z dokładnością do jednej setnej np. No i ja sobie zmienię tę wartość na -0.05, no i od razu lepiej:

Miejsce w kodzie, gdzie zaszła zamiana:
text{
   ttf "Arial.ttf", "Burning-brushes.pl", 1, -0.05
   pigment{Red}
}

Czad. No ale trochę nam ten napis ucieka na bok, ba, żeby tylko trochę. Dlaczego? Prosta sprawa, kamera jest na środku, patrzy się przed siebie, a na środku mamy umieszczony nasz napis, ale którą cząstkę jego dokładnie? A dokładnie lewy dolny przedni punkt, no więc wypadałoby przesunąć kamerkę trochę w bok.
Ofc, można by napis przesunąć, ale to wymagałoby opisania kolejnej opcji programu, a w przypadku tworzenia jedynego obiektu jakim jest napis (a o tym jest ten tutek) nie warto aż tak się spinać i wystarczy przesunąć kamerę.
Jak to zrobić? No wystarczy zmienić jej składowe. Którą składową dokładnie i o ile? No składową X bo chcemy się poruszać wzdłuż dolnej krawędzi ekranu (lewo, prawo). O ile? Ja nie mam zbyt dobrego wyczucia tych jednostek w pov-rayu, więc zaraz się dokładnie sprawdzi. Niech to będzie 4.
Teraz nasza kamera powinna wyglądać tak:
camera {
   location <4, 0, -10>
}

a obraz prezentować się tak:

Ha! Zmieniam zdanie, moje wyczucie jednostek w pov-rayu wcale nie jest takie złe, jak dla mnie idealnie, prawie na środku, więc jest bdb :D
Tylko nadal właściwie napis ten wygląda jak 2d. Przybliżmy trochę kamerę, i może przesuńmy ją w górę. Czyli zmieniamy składowe Z i Y. Z np. przybliżmy o 3 (czyli z -10 robi nam się -7), a Y podnieśmy o 5.
W kodzie wygląda to tak:
camera {
   location <4, 5, -7>
}

No i co? CO my najlepszego zrobiliśmy!? Straciliśmy go! Odszedł! Nasz napis zniknął!
A to znaczy, że musieliśmy coś spieprzyć, ale co? Przecież tylko zmienialiśmy kamerę, nie mogliśmy usunąć napisu! No i to jest prawda, ale wartość Y ustawiona na 5, okazała się chyba zbyt duża. To akurat wymyśliłem celowo, żeby móc wam pokazać pewien dodatkowy parametr polecenia camera{ }, mianowicie look_at.
look_at przyjmuje jako parametr w nawiasach ostrych składowe X,Y,Z punktu, na który kamera ma się gapić. Bardzo przydatny gadżet. Pamiętacie gdzie znajduje się nasz napis? Tak jest, punkt 0,0,0. A pamiętacie jaki był z tym problem? Że trochę przesunęliśmy kamerę bo w 0,0,0 mieliśmy właściwie literkę "B", a nie jako tako cały napis. Wypadałoby to teraz uwzględnić i w parametrze look_at wszystkie wartości ustawić na 0 poza X'em, który ustawiamy na 4 tak jak to mamy w location.
W kodzie wygląda to tak:

camera {
  location <4, 5, -7>
  look_at <4,0,0>
}

W praktyce:

Czaaad. Jejciu, ale mamy super 3d napis. Ale... żeby nie było za miło, trochę podrasujmy jeszcze. Wg mnie trochę kijowe jest światło. Co z nim nie tak? Zauważcie jak jest ustawione, idealnie na wprost napisu (wszystkie składowe na 0, tylko Z na -40), to ewidentnie nie podkreśla jego trójwymiarowości i oświetla tylko przód tak prawdę mówiąc. Przysuńmy światło bliżej i przestawmy je wyżej, tak żeby oświetliło nam też napis od góry.
To akurat prosta sprawa, mieliśmy Z = -40, zmienimy sobie na -10, i podniesiemy Y z 0 na 20 i powinno być ładniej.
Kod:
light_source {
   < 0, 20, -10>
   color White
}

Efekt:

Mrrr, na moje oko wygląda to teraz znacznie bardziej hardo, dobra robota. Mimo wszystko wkurza mnie trochę długość tego napisu, zmniejszę go sobie o 1/4 długości.
Kod:

   ttf "Arial.ttf", "Burning-brushes.pl", 0.75, -0.05

Trochę jeszcze sobie ten napis przybliżę przez zmniejszenie w location Y i Z. Kod:
camera {
   location <4, 4, -6>
   look_at <4,0,0>
}

Y na 4, Z na -6 jak widać.
Może wymienię sobie czcionkę na jakąś ładniejszą, tylko w sumie jaką, ja tam się zbytnio nie znam na dobieraniu czcioneczek i koloreczków, to jest dobre dla bab :D :*
No i mam problem. Bo skąd mam wiedzieć jak nazywa się plik z czcionką, którą chce? Niestety nie zawsze to jest to samo co nazwa wyświetlana w photoshopie, ba, rzekłbym nawet, że to rzadko kiedy jest takie same. Nie jest to na szczęście nic trudnego. Wchodzimy Na dysk C:\ tam szukamy folderu Windows, a w nim folderu Fonts, gdzie zapisane mamy wszystkie czcionki.
W windowsie jest to bardzo fajnie rozwiązane bo od razu mamy podgląd naszych czcionek no i te nazwy, które możemy przeczytać są takie jak w phothosopie. No ale tak jak napisałem, to nie są te nazwy. Jak już znajdziemy tę czcionkę, która nam się podoba, klikmay na jej podglądzie prawym przyciskiem myszy i z menu kontekstowego wybieramy "Właściwości", powinno to wyglądać tak:

Ja korzystam z windows 7, u was jeśli korzystacie ze starszych systemów to menu może wyglądać trochę inaczej, ale na pewno nie będzie się dużo różnić i na pewno będzie tam opcja właściwości, a tylko ona nas teraz interesuje.
Wyświetli nam się okno właściwości czcionki, z której kopiujemy (Ctrl + C lub prawy przycisk myszy i opcja "kopiuj") nazwę czcionki, pod warunkiem, że jej rozszerzenie po kropce to ttf, innych pov-ray nam nie obsłuży.

W kodzie wklejamy je w znanym nam już miejscu, tam gdzie podajemy nazwę czcionki w cudzysłowie (pamiętajcie, pisze się w cudzysłowie, a nie w cudzysłowiu, tak samo jak się mówi, mam Cię w du***, a nie mam Cię w dupiu)
text{
ttf "BAUHS93.TTF", "Burning  brushes.pl", 0.75, -0.05
pigment{Red}
}

Jeśli wybierzecie zbyt wybajerzoną czcionkę to czas renderowania może się wydłużyć, no i jeśli wybierzecie czcionkę zbyt masywną to będziecie musieli dostosować waszą kamerę żeby ją ogarnęła, u mnie jest wszystko ok.
Ja (poza tym, że zmieniłem czcionkę) przesunąłem sobie location i look_at o 0.5 w lewo (odjąłem od X'a z obu opcji wartośc 0.5), o 5 podniosłem światło (Y + 5), no i tyle.
Kod:

#include "colors.inc"

camera {
location <3.5, 4, -5>
look_at <3.5,0,0>
}
     
light_source {
< 0, 25, -10>
color White
}   

text{
ttf "BAUHS93.TTF", "Burning  brushes.pl", 0.75, -0.05
pigment{Red}
}

Efekt, antyaliasingiem i przy większych wymiarach:

Sweeeet :D
To by było na tyle.
Chciałbym tylko dodać kilka teoretycznych informacji. Za każdym razem kiedy wciśniemy run, pov-ray tworzy plik bmp z naszym podglądem, dokładnie taki sam jak widać w podglądzie, w tym samym folderze gdzie mamy zapisany nasz plik źródłowy z rozszerzeniem pov (to miejsce renderowania da się zmienić chyba gdzieś w ustawieniach, ale to byłby materiał na innego tutka).
Przy okazji z teoretycznych informacji, chyba w każdym kodzie tu pokazywanym dawałem wcięcia wewnątrz każdej klamry, tzn. 3 spacje, nie jest to konieczne, ale zwiększa czytelność, nie musicie tego robić, jak chcecie.
No i jeszcze przydatna wiadomość. Ten cały kod, który napisaliśmy, można by nazwać językiem programowania właściwie, no i jako takowy, umożliwia on robienie komentarzy do własnego kodu. Komentarze to są takie no po prostu komentarze, które chcecie sobie napisać w kodzie, tak żeby wiedzieć co dane polecenie wam robi, np:

//Tutaj wprowadzamy swiatlo do sceny
light_source {
< 0, 25, -10>
color White
}   

Jak widać, komentarz poprzedzamy dwoma ukośnikami, o tak: //

No. Teraz to już zupełnie wszystko co chciałem tu napisać, dziękuję, za uwagę, mam nadzieję, że wam to się przyda, zachęcam do odwiedzenia linków przedstawionych podczas reklam : D


TUTORIAL NAPISANY TYLKO I WYŁĄCZNIE DLA BURNING-BRUSHES.PL