Skocz do zawartości

Processing. Obiekty trójwymiarowe dla średniozaawansowanych - #3


Pomocna odpowiedź

PImage oraz rotateX(), rotate(Y), rotateZ()

Nie ulega wątpliwości, że wyobrażenie sobie dwóch kół jako Słońca i Ziemi wymaga sporej wyobraźni. Nadszedł czas, aby temu zaradzić. W pierwszej kolejności obiekty zostaną wyposażone w odpowiednie tekstury. W tym celu wykorzystany zostanie obiekt typu PImage.

Podobnie jak PShape, PImage jest typem danych. Jednak w odróżnieniu od PShape, przechowuje on informacje nie o kształtach, ale o obrazie. Dostępne formaty obrazu to .gif, .jpg, .tga oraz .png.

W pierwszej kolejności deklarujemy obiekt przechowujący teksturę Ziemi (EARTH_TEXTURE);

PImage EARTH_TEXTURE;                                        // Deklaracja obiektu przechowującego informacje o teksturze Ziemi

Następnie, przypisujemy mu obraz który, znowu, podobnie jak w przypadku PShape, może być wczytany z pliku lub stworzony od początku za pośrednictwem metod: loadImage() lub createImage(). W tym przypadku, gotowy obraz zostanie wczytany. Jeśli nie podamy wprost lokalizacji pliku Processing będzie poszukiwał go bezpośrednio w folderze, w którym umieszczony jest skrypt programu lub w podkatalogu DATA, również znajdującym się w tym folderze, o ile zostanie taki wcześniej stworzony. Możliwe jest jednak literalne podanie ścieżki dostępu do pliku znajdującego się w innym miejscu na komputerze lub wskazanie adresu, jeśli obraz pobierany jest z Internetu. Obraz Ziemi w naszym programie może zostać pobrany albo bezpośrednio ze strony Tom Patterson, www.shadedrelief.com -zawierającej m.in. interesujące tekstury naszego globu- albo z pliku ściągniętego na dysk (osobiście zdecydowanie zachęcam do ściągania plików na własny dysk). Należy pamiętać, że pobieranie danych z sieci oprócz oczywiście konieczności dostępu do Internetu może wiązać się ze znacznymi opóźnieniami wczytywania danych (a nawet uporczywymi błędami i zatrzymaniem programu) oraz niedostosowaniem jego wymiaru do naszych oczekiwań. Grozi również naruszeniem praw autorskich. Wszystkie tekstury użyte w tym programie nie są objęte licencjami komercyjnymi i mogą być swobodnie wykorzystywane. W treści kodu zostały podane zakomentowane komendy odwołujące się do pliku znajdującego się w Internecie oraz działające komendy odwołujące się do pliku wcześniej ściągniętego.

Załadowanie obrazu do obiektu EARTH_TEXTURE zrealizowane zostało następującą komendą:

EARTH_TEXTURE=loadImage("1_earth_8k.jpg");
//Alternatywnie: EARTH_TEXTURE=loadImage("http://shadedrelief.com/natural3/ne3_data/8192/textures/1_earth_8k.jpg");

Na koniec konieczne jest przypisanie tekstury przechowywanej przez obiekt typu PImage (EARTH_TEXTURE) obiektowi typu PShape (EARTH). Służy do tego metoda setTexture():

EARTH.setTexture(EARTH_TEXTURE);                         // Przypisanie tekstury kształtowi

Jesteśmy gotowi do wykonania kolejnej wersji programu:

212201545_Nagraniezekranu2021-05-4o08_30.20-2.thumb.gif.4667d390a1420f81566d064d0b8e1be9.gif

 

Niestety, efekt nie jest zadowalający. Po pierwsze, Ziemia jest nienaturalnie niebieska. Po drugie, Słońce krąży wokół zerowego południka zamiast wokół równika. Na szczęście, łatwo to zmienić. 

Nadmiar koloru niebieskiego spowodowany jest wcześniejszym użyciem metody setFill() do ustawienia koloru wypełniania kształtu. W zasadzie po załadowaniu tekstury nie jest już to potrzebne, chyba że ma to na celu osiągnięcie specjalnego efektu. W naszym programie usuwamy wypełnienie kształtu jako zbędne, kasując odpowiednią linię kodu.

Rozwiązanie drugiego problemu będzie wymagało od nas podjęcia decyzji co do początkowej pozycji Ziemi widocznej na ekranie oraz płaszczyzny w jakiej ma się wokół niej poruszać Słońce. Pamiętamy, że chcemy, aby Słońce poruszało się po okręgu w płaszczyźnie równika. Najlepiej, aby swój ruch zaczynało na południku zerowym, który jednocześnie powinien przechodzić przez środek okna (innymi słowy chcemy, aby Słońce w momencie początku swojego obiegu znajdowało się dokładnie w centrum okna i poruszało się w poziomie). Jednocześnie Ziemia ma być zwrócona do nas widokiem Europy i Afryki tak, abyśmy mogli obserwować południk, w którym Słońce zaczyna swój bieg.

Zacznijmy od zmiany płaszczyzny obrotu Słońca. Posłuży do tego grupa funkcji pokrewnych znanej już funkcji translate(), wywoływanych komendami: rotateX(), rotateY() oraz rotateZ(). Funkcje pozwalają na dokonanie obrotu układu współrzędnych wokół zadanej osi X, Y, lub Z o zadany kąt wyrażony w radianach w kierunku zgodnym z ruchem wskazówek zegara (wartości dodatnie) lub przeciwnym (wartości ujemne). Należy pamiętać, że wykonywane kolejno obroty się kumulują. 

Aby Słońce poruszało się zgodnie z dokonanym wyborem, konieczne jest dokonanie dodatkowych przekształceń układu współrzędnych polegające na jego obrocie o 90 stopni wokół osi X i o tyle samo wokół osi Z. Początkowe ustawienia układu współrzędnych będą więc następujące:

translate(width/2,height/2,0);                     // Przesunięcie środka układu współrzędnych do centrum ekranu/okna programu
rotateX(TWO_PI/4);                                 // Obrót środka układu współrzędnych o 90 stopni wokół osi X
rotateZ(TWO_PI/4);                                 // Obrót środka układu współrzędnych o 90 stopni wokół osi Z

Po dodaniu nowych funkcji Słońce będzie poruszało się już zgodnie z przyjętymi założeniami. 

2070524175_Nagraniezekranu2021-05-4o16_45_20.thumb.gif.7079a1576d6bce25936df303851ffd6f.gif

Przy okazji przekształceń układu współrzędnych przesunięciu uległo nie tylko Słońce, ale i Ziemia. Pytanie, jak obrócić Ziemię, aby przy okazji nie zmieniać położenia Słońca? Bardzo prosto! Oczywiście, przy pomocy pushMatrix(). Ponieważ znajdujemy się gdzieś na środku Pacyfiku powinniśmy obrócić Ziemię o -90 stopni wokół osi X oraz 180 stopni wokół osi Y.

Obroty jednak muszą być dokonywane poza układem współrzędnych, w których znajduje się Słońce. W konsekwencji część kodu odpowiedzialna za wyświetlenie Ziemi powinna wyglądać następująco:

pushMatrix();                                                     // Wepchnięcie macierzy współrzędnych
rotateX(-TWO_PI/4);                                               // Obrót środka układu współrzędnych o -90 stopni wokół osi X
rotateY(PI);                                                      // Obrót środka układu współrzędnych o 180 stopni wokół osi Y
shape(EARTH);                                                     // Rysunek Ziemi 
popMatrix();                                                      // Wypchnięcie macierzy współrzędnych

Na koniec w ten sam sposób jak w przypadku tekstury Ziemi możemy przypisać teksturę Słońcu. Wykorzystany w programie obraz pochodzi ze strony: https://pl.m.wikipedia.org

Dzięki wprowadzonym zmianom program działa już w zadowalający sposób:

838733997_Nagraniezekranu2021-05-4o20_34_21.thumb.gif.4a5fb29548e172244665f50be6835d7e.gif

Odpowiada za niego następujący kod:

 int EARTH_RADIUS=150;                                              // Promień Ziemi
 int SUN_RADIUS=10;                                                 // Promień Słońca
 int SUN_ORBIT=300;                                                 // Promień orbity Słońca;
 
 float xSol=0;                                                      // Chwilowa współrzędna x środka Śłońca 
 float ySol=0;                                                      // Chwilowa współrzędna y środka Śłońca
 float zSol=0;                                                      // Chwilowa współrzędna z środka Śłońca
 float tSol=0;                                                      // Chwilowy azymut Słońca liczony od południka 0 w radianach  

 PShape EARTH;                                                      // Deklaracja kształtu przechowującego informacje o kształcie Ziemi
 PImage EARTH_TEXTURE;                                              // Deklaracja obrazu przechowującego informacje o teksturze Ziemi

 PShape SUN;                                                        // Deklaracja kształtu przechowującego informacje o kształcie Słońca
 PImage SUN_TEXTURE;                                                // Deklaracja obrazu przechowującego informacje o teksturze Słońca
 
void setup() {
  
  size(1800,1000,P3D);                                              // Rozmiar okna 1800/1000 pixeli. Rendering trójwymiarowy
  frameRate(30);                                                    // Ilość klatek na sekundę(ftp/s)
  background(22);                                                   // Tło
  smooth(4);                                                        // Ustawienie poziomu anty-aliasingu
 
  sphereDetail(120);                                                // Szczegółowość rysowania sfer
  
  EARTH=createShape(SPHERE,EARTH_RADIUS);
  EARTH_TEXTURE=loadImage("1_earth_8k.jpg");
  // Alternatywnie: EARTH_TEXTURE=loadImage("http://shadedrelief.com/natural3/ne3_data/8192/textures/1_earth_8k.jpg");
   
  SUN=createShape(SPHERE, SUN_RADIUS);
  SUN_TEXTURE=loadImage("320px-Map_of_the_full_sun.jpg");
  // Alternatywnie: SUN_TEXTURE=loadImage("https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Map_of_the_full_sun.jpg/320px-Map_of_the_full_sun.jpg");
  
  EARTH.setStroke(false);                                           // Brak wyświetlania obrysu
  EARTH.setTexture(EARTH_TEXTURE);                                  // Przypisanie tekstury kształtowi Ziemi
  
  SUN.setStroke(false);                                             // Brak wyświetlania obrysu
  SUN.setTexture(SUN_TEXTURE);                                      // Przypisanie tekstury kształtowi Słońca

}

void draw() {
  
  background(22);													// Wymazanie klatki

  translate(width/2,height/2,0);                                    // Przesunięcie środka układu współrzędnych do centrum 
  rotateX(TWO_PI/4);                                                // Obrót środka układu współrzędnych o 90 stopni wokół osi X
  rotateZ(TWO_PI/4);                                                // Obrót środka układu współrzędnych o 90 stopni wokół osi Z
  
  pushMatrix();                                                     // Wepchnięcie macierzy współrzędnych
  rotateX(-TWO_PI/4);                                               // Obrót środka układu współrzędnych o -90 stopni wokół osi X
  rotateY(PI);                                                      // Obrót środka układu współrzędnych o 180 stopni wokół osi Y
  shape(EARTH);                                                     // Rysunek Ziemi 
  popMatrix();                                                      // Wypchnięcie macierzy współrzędnych 
  
  xSol=SUN_ORBIT*cos(tSol);                                         // Określenie pozycji pozycji X środka Słońca
  ySol=SUN_ORBIT*sin(tSol);                                         // Określenie pozycji pozycji Y środka Słońca
  tSol+=TWO_PI/360;                                                 // Ustalenie azymutu Słońca
  if (tSol>TWO_PI) tSol=0;                                          // Reset azymutu po zakreśleniu przez słońce całej orbity
  
  pushMatrix();                                                     // Wepchnięcie macierzy współrzędnych
  translate(xSol,ySol,zSol);                                        // Przesunięcie środka układu współżędnych do miejsca położenia Słońca
  shape(SUN);                                                       // Wyświetlenie obrazu Słońca
  popMatrix();                                                      // Wypchnięcie macierzy współrzędnych 

}

Efekt jest przyzwoity, ale czegoś w nim brakuje… Ależ, tak! Światła i cieni!

ambientLight(), directionalLight() i lights()

Po uporaniu się z mechaniką obrotu Słońca wokół Ziemi oraz określeniem ich wzajemnej pozycji (oczywiście przymykając oko na zastosowane grube uproszczenia – naprawdę nie warto akurat przy tej okazji, zagłębiać się w matematyczne niuanse długości perycentrum i jej przekształceń na system geocentryczny) nadszedł czas na dodanie do modelu nieco ożywiającego go światła. Jak można się domyślać Processing oferuje naprawdę długą listę funkcji operowania światłem. W programie skorzystano tylko z kilku z nich. 

Patrząc na aktualny wygląd modelu, rzuca się w oczy brak zaakcentowania dnia i nocy. Słońce nie oświetla Ziemi, a tylko wokół niej krąży. Również sam wygląd Ziemi pozostawia wiele do życzenia. Jej światło jest płaskie, dwuwymiarowe i mało rzeczywiste. Ciekawym zabiegiem byłoby dodanie do obrazu Ziemi obrazu jej atmosfery. Pozostawiam to już jednak, zainteresowanemu Czytelnikowi. Można to zrobić na przykład zamykając obraz sfery Ziemi w obrazie drugiej sfery o odpowiednio dobranym parametrze alpha i dopiero wtedy zastosować wybrane funkcje oświetlenia. Na koniec sam obraz Słońca. Jest zbyt ponury. Teksturę należy rozświetlić. 

Zacznijmy od nadania jasności Słońcu. W tym celu można wykorzystać funkcję ambientLight(). Funkcja prawie zawsze występuje z innymi funkcjami oświetlenia. W tym programie występuje jednak samotnie, jako wygodne narzędzie rozjaśnienia Słońca. 

ambientLight(255, 255, 210);                                     // Rozświetlenie Słońca

Funkcja nie przyjmuje kolorów w zapisie heksadecymalnym. W zależności od wybranego trybu pracy z kolorami konieczne jest podanie wartość RGB lub HSB. Zadaniem funkcji jest równomierne oświetlenie obiektu rozproszonym światłem o zadanym kolorze.

Ponieważ Ziemia będzie oświetlana w inny sposób niż Słońce, konieczne jest zadbanie, aby po rozświetleniu Słońca nie zostały rozświetlone rozproszonym jasnożółtym kolorem również inne obiekty na ekranie. Funkcja lights() może posłużyć do przywrócenia wszystkim pozostałym funkcjom światła ustawień domyślnych. Została zatem umieszczona bezpośrednio po wywołaniu Słońca. Wywołanie obrazu Słońca przyjmie więc ostatecznie następującą formę: 

 pushMatrix();                                         // Wepchnięcie macierzy współrzędnych
 translate(xSol,ySol,zSol);                            // Przesunięcie środka układu współrzędnych do miejsca położenia Słońca
 ambientLight(255, 255, 210);                          // Rozświetlenie Słońca
 shape(SUN);                                           // Wyświetlenie obrazu Słońca      
 lights();                                             // Reset ustawień funkcji światła
 popMatrix();                                          // Wypchnięcie macierzy współrzędnych

Podobnie jak Słońcu należy nadać nieco rozproszonego światła Ziemi, głównie w celu podkreślenia różnicy pomiędzy nocą, a dniem, po oświetleniu Ziemi światłem kierunkowym pochodzącym ze Słońca. Bez tego zabiegu, obraz Ziemi w nocy byłby zdecydowanie zbyt ciemny (praktycznie czarny). Wywołanie obrazu Ziemi w świetle rozproszonym będzie wyglądało następująco:

  pushMatrix();                                                     // Wepchnięcie macierzy współrzędnych
  rotateX(-TWO_PI/4);                                               // Obrót środka układu współrzędnych o -90 stopni wokół osi X
  rotateY(PI);                                                      // Obrót środka układu współrzędnych o 180 stopni wokół osi Y
  ambientLight(28, 28, 28);                                         // Przyciemnienie Ziemi
  shape(EARTH);                                                     // Wyświetlenie obrazu Ziemi 
  lights();                                                         // Reset ustawień funkcji światła
  popMatrix();                                                      // Wypchnięcie macierzy współrzędnych  

Do wywołania efektu dnia i nocy w programie zostanie wykorzystana funkcja directionalLight(). Pozwala ona na emitowanie światła z konkretnego, zadanego kierunku. Natężenie światła jest tym większe im bardziej prostopadła do jego kierunku jest powierzchnia, na którą pada. Podobnie jak w przypadku ambientLight() funkcja przyjmuje tylko kolory wyrażone w RCB lub HSB. W naszym programie funkcji nie zamykamy w nawiasach pushMatrix()-popMatrix(). Jest ona wykonywana z poziomu głównego układu współrzędnych. 

directionalLight(255, 255, 210, -xSol, -ySol, -zSol);             // Oświetlenie Ziemi światłem jasnożółtym padającym ze Słońca 

Należy zwrócić uwagę, że zadeklarowane w funkcji „współrzędne” Słońca przyjmują wartości ujemne. Dzieje się tak dlatego, że w rzeczywistości nie są to współrzędne, a wektory padania światła, skierowane z jego źródła w kierunku rozświetlanego obiektu. 

Na koniec, grafitowe do tej pory tło warto byłoby zastąpić bardziej atrakcyjnym obrazem. Ciekawym rozwiązaniem byłoby dodanie do Słońca innych obiektów Sfery Niebieskiej i umieszczenie obserwatora pomiędzy Ziemią a Sferą. Pomimo, że efekt byłby interesujący, stracilibyśmy jednak możliwość oglądania modelu z obecnej perspektywy. Dlatego w programie przyjęto, że umowna sfera rozciąga się 4000 jednostek od Ziemi i jest podobnie jak Ziemia nieruchoma. Jest to więc raczej teatralne tło niż element modelu. Sfera niebieska jest kolejnym trzecim już obiektem PShape, a jego tworzenie i wyświetlanie nie odbiega od tego w jaki sposób wyświetlone zostały Ziemia i Słońce. Do kształtu sfery przypisany został obraz Drogi Mlecznej pochodzący ze strony https://www.eso.org

Ostateczny efekt jaki uzyskaliśmy zasługuje na coś więcej niż schematyczne .gify. Wygląda już całkiem nieźle i to przy minimalnych nakładach pracy. 🙂

 

Kod programu:

 int EARTH_RADIUS=150;                                              // Promień Ziemi
 int SUN_RADIUS=10;                                                 // Promień Słońca
 int SUN_ORBIT=300;                                                 // Promień orbity Słońca;
 int CELESTIAL_SPHERE_RADIUS=4000;                                  // Promień Sfery Niebieskiej
 
 float xSol=0;                                                      // Chwilowa współrzędna x środka Śłońca 
 float ySol=0;                                                      // Chwilowa współrzędna y środka Śłońca
 float zSol=0;                                                      // Chwilowa współrzędna z środka Śłońca
 float tSol=0;                                                      // Chwilowy azymut Słońca liczony od południka 0 w radianach  

 PShape EARTH;                                                      // Deklaracja kształtu przechowującego informacje o kształcie Ziemi
 PImage EARTH_TEXTURE;                                              // Deklaracja obrazu przechowującego informacje o teksturze Ziemi

 PShape SUN;                                                        // Deklaracja kształtu przechowującego informacje o kształcie Słońca
 PImage SUN_TEXTURE;                                                // Deklaracja obrazu przechowującego informacje o teksturze Słońca
 
 PShape CELESTIAL_SPHERE;                                           // Deklaracja kształtu przechowującego informacje o kształcie Sfery Niebieskiej
 PImage CELESTIAL_SPHERE_TEXTURE;                                    // Deklaracja obrazu przechowującego informacje o teksturze Sfery Niebieskiej
 
void setup() {
  
  size(1800,1000,P3D);                                              // Rozmiar okna 1800/1000 pixeli. Rendering trójwymiarowy
  frameRate(30);                                                    // Ilość klatek na sekundę(ftp/s)
  background(22);                                                   // Tło
  smooth(4);                                                        // Ustawienie poziomu anty-aliasingu
 
  sphereDetail(120);                                                // Szczegółowość rysowania sfer
  
  EARTH=createShape(SPHERE,EARTH_RADIUS);
  EARTH_TEXTURE=loadImage("1_earth_8k.jpg");
  //EARTH_TEXTURE=loadImage("http://shadedrelief.com/natural3/ne3_data/8192/textures/1_earth_8k.jpg");
   
  SUN=createShape(SPHERE, SUN_RADIUS);
  SUN_TEXTURE=loadImage("320px-Map_of_the_full_sun.jpg");
  //SUN_TEXTURE=loadImage("https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Map_of_the_full_sun.jpg/320px-Map_of_the_full_sun.jpg");
  
  CELESTIAL_SPHERE=createShape(SPHERE, CELESTIAL_SPHERE_RADIUS);
  CELESTIAL_SPHERE_TEXTURE=loadImage("eso0932a.jpg");
  //CELESTIAL_SPHERE_TEXTURE=loadImage("https://cdn.eso.org/images/large/eso0932a.jpg");
  
  EARTH.setStroke(false);                                           // Brak wyświetlania obrysu
  EARTH.setTexture(EARTH_TEXTURE);                                  // Przypisanie tekstury kształtowi Ziemi
  
  SUN.setStroke(false);                                             // Brak wyświetlania obrysu
  SUN.setTexture(SUN_TEXTURE);                                      // Przypisanie tekstury kształtowi Słońca
  
  CELESTIAL_SPHERE.setStroke(false);                                // Brak wyświetlania obrysu   
  CELESTIAL_SPHERE.setTexture(CELESTIAL_SPHERE_TEXTURE);             // Przypisanie tekstury kształtowi Sfery Niebieskiej 

}

void draw() {
  
  background(22);
  
  shape(CELESTIAL_SPHERE);

  translate(width/2,height/2,0);                                    // Przesunięcie środka układu współrzędnych do centrum ekranu/okna programu
  rotateX(TWO_PI/4);                                                // Obrót środka układu współrzędnych o 90 stopni wokół osi X
  rotateZ(TWO_PI/4);                                                // Obrót środka układu współrzędnych o 90 stopni wokół osi Z
  
  directionalLight(255, 255, 210, -xSol, -ySol, -zSol);             // Oświetlenie Ziemi światłem jasnożółtym padającym z kierunku Słońca
   
  pushMatrix();                                                     // Wepchnięcie macierzy współrzędnych
  rotateX(-TWO_PI/4);                                               // Obrót środka układu współrzędnych o -90 stopni wokół osi X
  rotateY(PI);                                                      // Obrót środka układu współrzędnych o 180 stopni wokół osi Y
  ambientLight(28, 28, 28);                                         // Przyciemnienie Ziemi
  shape(EARTH);                                                     // Wyświetlenie obrazu Ziemi 
  lights();                                                         // Reset ustawień funkcji światła
  popMatrix();                                                      // Wypchnięcie macierzy współrzędnych 
  
  xSol=SUN_ORBIT*cos(tSol);                                         // Określenie pozycji pozycji X środka Słońca
  ySol=SUN_ORBIT*sin(tSol);                                         // Określenie pozycji pozycji Y środka Słońca
  tSol+=TWO_PI/360;                                                 // Ustalenie azymutu Słońca
  if (tSol>TWO_PI) tSol=0;                                          // Reset azymutu po zakreśleniu przez słońce pełnej orbity
  
  pushMatrix();                                                    // Wepchnięcie macierzy współrzędnych
  translate(xSol,ySol,zSol);                                       // Przesunięcie środka układu współrzędnych do miejsca położenia Słońca
  ambientLight(255, 255, 210);                                     // Rozświetlenie Słońca
  shape(SUN);                                                      // Wyświetlenie obrazu Słońca      
  lights();                                                        // Reset ustawień funkcji światła
  popMatrix();                                                     // Wypchnięcie macierzy współrzędnych 

}
 

Na tym kończy się część trzecia. Zachęcam do eksperymentów z teksturami, światłem, rodzajami predefiniowanych i własnych obiektów, mechaniką ich wzajemnego ruchu oraz tłem. To wciąga! W części #4 postaramy się jeszcze bardziej uatrakcyjnić scenę poruszając w inny sposób obiektami oraz samym obserwatorem. Być może wystarczy też miejsca na wprowadzenie obiektów dwuwymiarowych symulujących trójwymiarowe. Szybkość pojawienia się kolejnej części zależy od zainteresowania tematem wyrażonym ilością łapek i komentarzy. 

Żartuję. Część czwarta już czeka na edycję. 🙂 

  • Lubię! 2
Link to post
Share on other sites

@Adder właśnie zatwierdziłem artykuł, więc jest już widoczny publicznie. Dzięki za kolejny ciekawy poradnik!

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.