Animacja - przechowywanie zmiennych - 2006-10-26
Przy zapisywaniu wartości do pliku nie zapomnij wstawić na końcu przecinka
wiecej >>

Szukaj: 
Logowanie
Login
Hasło   
Pamiętaj mnie na tej stronie
 Zarejestruj się...




Najnowsza grafika
maxmoon
2012-04-24


Najnowsza tapeta
Nunas
2011-09-15
O obrocie cial niebieskich

Dla kogo jest przeznaczony ten tutorial

Dla ludzi światłych, ludzi otwartych a nadewszystko pragnących tajniki niezgłebione obrotów posiąść. A wszak sprowadzić można to: "dla kogo ten skrypt przenaczony jest" do zdania jednego. Dla tych co obratoach wiedzieć chcą.

Co znajdziesz w tym tutorialu:
  • Materię pierwotą co obobrotach traktuje.
  • Siłę co ruch wymusza.
  • I niedużo wiedzy na temat ruchu samego w sobie.

    A teraz dla tych co mowy przdoków naszych pojąć w stanie nie są.
  • O dyrektywie rotate
  • O różnych opcjach rotate i wsółzgrania z transalte
  • I troche o Animacji.

    Niechaj zatem opowieść wiedzie własną drogą:


    Krok 1: Założenia podstawowe.

    Napiszę to, choć wydaje mi się to zbędne i trochę poniżające czytających.
    Na początku należy stworzyć nową scenę (dla tych co używają programu pod Windows: File -> New File a dla tych co pracują pod linuxem proponuję: vi rotate1.pov ).

    Tworzymy plik ze sceną, w której będziemy eksperymentować. GOtowy kod ze scą wygląda takL
      
      #include "colors.inc"
      
      global_settings {
        assumed_gamma 1.0
      }
      
      camera {
        location  <30.0, 90, -120.0>
        look_at   <0.0, 0.0,  0.0>
        angle 10
        
      }
      
      sky_sphere {
        pigment {
          gradient y
          color_map {
            [0.0 rgb <0.5,0.5,0.5>]
            [0.7 rgb <0.5,0.5,0.5>]
          }
        }
      }
      
      light_source { <0, 0, 0> color rgb <1, 1, 1>  translate <-300, 300, 0>}
      light_source { <0, 0, 0> color rgb <1, 1, 1>  translate <0, 300, -300>}
      
      
      cylinder { <-100,0,0>,<100,0,0>,.1 pigment { color Green } } // os X
      cylinder { <0,-100,0>,<0,100,0>,.1 pigment { color Red } } // os Y  
      cylinder { <0,0,-100>,<0,0,100>,.1 pigment { color Blue } } // os z
      
      
      sphere
      {
              <0,0,0>,5
              pigment { checker Blue, Yellow scale 8 }
      }
      
    


    No dobra teraz słów kilka odnośnie tego cośmy poczynili.
    Stworzyliśmy scenę dodaliśmy do niej walce (cylindry) które reprezentują nasze osie.. i jedną kulę.
    Po wyrenderowaniu nasz "twór wygląda tak.



    Krok 2: Rotate


    W POVRay'u wszystkie obroty wykonują się względem początku układu współrzędnych względem punktu <0,0,0>
    Jest to dość istotne i ważne. Zrozumienie techniki obrotu bardzo ułatwia pracę z programem.
       W naszej scenie umieściliśmy kulę (sphere) w punkcie <0,0,0> i jako, że jest to tutorial dla początkujących wyjaśnijmy sobie to.
    Kula w punkce <0,0,0> oznacza tyle że jej środek jest w tym punkcie. Jeżeli teraz damy jej promień równy 5 to: swoją powierzchnią będzie ona "wystawać" od -5 do 5 w osiach xyz. Teraz dla przykładu zobaczmy jak wygląda obrót takiej kuli względem osi Y



    Teraz zobaczmy co się stanie jak stowrzymy prostopadłościan (box) który początek będzie miał w punkcie<0,0,0> Za remujmy (czyli wstawmy komentarz) naszą kulę i wstawmy box

      
      box
      {
              <0,0,0>,<10,5,5>
              pigment { checker Blue, Yellow scale 5 }
              rotate z*180*clock
      }
      
    


    PO wyrenderowaniu wygląda tak.



    i dla porównania zobaczmy jak wygląda taki box po obrocie względem osi Y



    Mam nadzięję, że dało to trochę poglądu na sposób obracania w POVRay'u

    Teraz przyjżyjmy się jak wyglądają obroty wokół innych osi.

    Obrót wokół osi X (kolor zielony) Obrót wokół osi Y (kolor Czerwony) Obrót wokół osi Z (kolor niebieski)



    Zrobiło się kolorowo i ruchomo, dlatego przydało by się trochę tekstu :-)
    Jak wspomniałem cały problem i cała wspaniałość obrotu w povrayu polega na obrocie względem punktu <0,0,0> Co jednak się stanie jak przesuniemy obiekt? w naszym przypadku nasza kulę. Czy będzie ona się nadal obracała wokół własnej osi??
    Zobaczmy.

    Kod naszej kuli wygląda tak.
      
      sphere{
              <0,0,0>,5
              pigment { checker Blue, Yellow scale 8 }
              translate x*20
      
    
    A po wyrenderowaniu wygląda to tak




    A teraz zobaczmy jak wygląda ta kula podczas obrotu według osi Y




    Obroty wokół innych osi popróbójcie sami. My teraz przejdziemy do torchę bardziej zaawansowanych zagmatwań.


    Moim zdaniem dobrze jest tworzyć obiekt tak aby jego punkt obrotu leżał w punkcie <0,0,0>. Np. Powiedzmy, że chcemy utowrzyć ziemie, a od jakiegoś czasu wiadomo, że ziemia się obraca wokół własnej osi to utworzymy ją w punkcie <0,0,0>, tak jak to uczyniliśmy z naszą kulą. Jednak powiedzmy księżyc nie obraca się wokół własnej osi (choć tego to nie wiem tak na pewno) tylko obraca się po orbicie ziemi. Tedy możemy stworzyć ksieżyc od razu przesunięty wzdłuż osi X albo no właśnie istnieje albo do którego bym się przychylał... Tak też przejdziemy do konkretów.

    Krok 2: Ziemia i jego satelita.

    Stworzymy scene, która będzie zawierała tylko słońce (jako mała żółta kropka), ziemie i księżyc.
    Załażenia.
  • Słońce jest nieruchome
  • Ziemia obraca się wokół własnej osi
  • Ziemia krąży wokół słońca (orbita jest okręgiem)
  • Księżyc nie obraca się wokół własnej osi tylko wokół ziemi.

    Deklarujemy nasze objekty

      
      #declare slonce=sphere
      {
              <0,0,0>,1
              texture { pigment { color Yellow} finish { ambient 1} }
      }
      #declare ziemia=sphere
      {
              <0,0,0>,5
              pigment { checker Blue, Yellow scale 5 }
      }
       
      #declare ksiezyc=sphere
      {
              <0,0,0>,1
              pigment { color Red }
      }
      
    


    Teraz trochę pracy umysłowej: Biorąc pod uwagę fakt, że księżyc jest przywiązany do ziemi a ziemia się obraca wokół słońca to wygodnie będzie stworzyć obiekt ziemia_ksiezyc
      
      #declare ziemia_ksiezyc=union
      {
              object { ziemia                   rotate y*360*365*clock } 
              object { ksiezyc translate x*10   rotate y*360*120*clock }
      }
      
    

    Słowo wyjaśnienia: Stworzyliśmy obiekt union (połączenie) dwóch obiektów Ziemi i Ksiezyca odrazu przesuneliśmy księżyc na orbite ziemi (translate x*10) i ustawiliśmy rotate które będzie moża wykorzystać w animacji. Do animacji wrócę jeszcze teraz chciałbym zwrócić uwagę na jedno. Proszę zauważyć, że pierwej księżyc przesuneliśmy a dopiero wykonaliśmy obrót wokół osi y co spowoduje obrót ksiezyca wokól orbity ziemi. Ziemie natomiast obracamy tu wokół własnej osi (rotate y*360*365*clock)

    Teraz trochę o clock jest to zmienna która przyjmuje wartości z zakresu
    Initial_Clock do Final_Clock w tym przypadku jest to od 0 do 1.
    360*365 :-) taki mój wymysł w ciągu trwania jednego pełnego cyklu animacji ziemia ma sie obrócić 365 razy wokół własnej osi (360)
    jeżeli ustalimy ilość klatek na 60 to clock będzie przyjmował kolejno 0, 1/60, 2/60 itd.

    Dobrze to poznaliśmy trochę teorii

    Teraz dodajmy nasze obiekty do sceny

      
      object { slonce }
      object { ziemia_ksiezyc translate x*20 rotate y*360*clock }
      
    
    Umieściliśmy słońce i ziemie_ksiezyc. Obiekt ziemia_ksiezyc została przesunięta o 20 wzdłuż osi X i dokonujemy animacji.. gotowa animacja wygląda tak:

    Reasumując: Ziemia obraca się okół właśnej osi, księżyc obraca się wokół zimie a całość ziemia i księżyc obracają się po orbicie wokół słońca

  • Plik źródłowy
  • Plik z ustawieniami animacji

    Na sam koniec przykład co można osiągnąc odpowiednio dobierająć punkty <0,0,0> swoich obiektów

    Kliknij aby pobrać gifacza

  • © druidy.pl

    Korzystając z witryny bez zmiany ustawień przeglądarki wyrażasz zgodę na użycie plików cookies. W każdej chwili możesz swobodnie zmienić ustawienia przeglądarki decydujące o ich zapisywaniu.