Warsztat.GDCompo!ProjektyMediaArtykułyQ&AForumOferty pracyPobieranie

Opisz napotkaną sytuację, a redakcja niezwłocznie znajdzie rozwiązanie!

wyślij anuluj

ASCII Raytracer

Stworzenie prostego raytracera w konsoli chodziło mi już od dłuższego czasu po głowie. Jak widać, można uzyskać całkiem przyzwoite efekty bazujące nawet na najprostszych algorytmach. Efekt dla mniejszej ilości znaków również jest zadawalający. Zrobione tylko podstawowe rzeczy, mam zamiar trochę to jeszcze rozwinąć. Kod po polsku, aby mógł potwierdzić fakt, że nie jest żywcem wzięty z internetu.


  • Wojciech Kasperczyk (@rethil) 16 maja 2014 09:52
    Uwielbiam ASCII ART, ale takiego czegoś jeszcze nie widziałem:) Tylko informacja ze kod jest po polsku jakoś powoduje u mnie bóle brzucha:/
  • marcin (@noxy) 16 maja 2014 10:32
    Fajna woda :)
  • deshan (@strateg) 16 maja 2014 11:18
    @rethil No niestety, takie warunki studenckie. Ćwiczeniowiec zatrzymał się na programowaniu w Vim, zaś ja koniecznie chciałem zrobić coś ciekawszego niż zadane obiektowe kółko i krzyżyk. Choć i do tego projektu nie przykładam jakiegoś szczególnego przywiązania, jeśli chodzi o jakość kodu - więc mnie to aż tak to nie boli ;D
  • Aleksander Nitecki (@Xender) 16 maja 2014 11:59
    "Kod po polsku, aby mógł potwierdzić fakt, że nie jest żywcem wzięty z internetu."

    japie[...].jpg
  • Zyper (@Zyper) 16 maja 2014 17:06
    Lepiej powiedz jak wydajność i daj demko. Serio takie wypisywanie do konsoli cmd daje dobre wyniki? Wydawało mi się to dość wolne, chyba, że obrazek jest statyczny.
  • marcin (@noxy) 16 maja 2014 17:38
    To jest symulacja oceanu ale w skali 1:1000000000 :D
  • deshan (@strateg) 16 maja 2014 17:54
    @noxy Skłamałbym, gdyby moją pierwszą myślą związaną z ułożeniem sfer nie była cząsteczka wody. Więc masz sporo racji ;D

    @Zyper Wydajność zależy przede wszystkim od konsoli, która jest już wolna sama w sobie. Także fakt, czy efekt jest płynny zależy przede wszystkim od rozmiaru renderowanego okna. Aktualnie obrazek jest statyczny, ale zamierzam dopisać poruszanie się kamerą po ścieżce.

    Jeśli chodzi o demo to jeszcze zdecydowanie za wcześnie. Przede mną dopisanie renderowania trójkątów, stworzenie obiektów z meshami (ograniczę się pewnie to samych sześcianów xd). W planach (ale nie wiem, czy realnych czasowo) są jeszcze odbicia światła i przejście przez obiekty przeźroczyste. Wszystko zależy od tego, czy efekty w ogóle będą widoczne w konsoli.

    Rozważam jeszcze dodanie kolorów, ale wtedy muszę się ograniczyć tylko do pokazu slajdów, takie realnie konsolowe ;/

    Program chciałbym oddać do środy przyszłego tygodnia, więc najpóźniej wtedy pojawi się demko ;)
  • sebas86 (@sebas86) 17 maja 2014 23:53
    Polskie nazwy to pikuś, pierwsze wersje mojego Raytracera radośnie egzystowała w jednym pliku. Tylko ~600 linijek kodu, a już potrafiło mocno skłonić ku przemyśleniu i zastosowaniu ogólnie przyjętych, dobrych praktyk kodowania (chociażby złota zasada jedna klasa/struktura - jeden plik). Więc ode mnie plus za rozsądne podejście do tematu od początku. ;)
  • sebas86 (@sebas86) 17 maja 2014 23:56
    PS. Z resztą efektów już jest z górki (bo coś widać i można wizualnie debugować). Tylko jeśli jeszcze tego nie zrobiłeś ustal jednorodną skrętność, chyba, że korzystasz z gotowej biblioteki do matmy.
  • kapustman (@kapustman) 18 maja 2014 09:30
    http://www.tomshardware.co.uk/forum/65918-13-technique-fast-win32-console-drawing

    To powinno pomóc w renderowaniu. Ta metoda jest zdecydowanie szybsza niż strumienie.
  • Aleksander Nitecki (@Xender) 18 maja 2014 09:35
    2014. Wbudowana konsola Windows.

    Naprawdę?

    Ściągnijcie sobie emulator terminala, który nie jest ułomny i przy okazji czyta ANSI escape sequences jak reszta świata (Windowsowy też dawno temu czytał, dopóki ktoś z M$ nie wpadł na pomysł, żeby porzucić ten standard i zrobić własne API).
  • Aleksander Nitecki (@Xender) 18 maja 2014 09:36
    Z tego co pamiętam, Console2 daje radę.
  • deshan (@strateg) 18 maja 2014 11:19
    @Xender Masz całkowitą rację, escape sequences faktycznie byłyby zbawieniem - na szczęście zamierzam przenieść kod na linuxa. Z jakiegoś powodu praktycznie wszyscy na uczelni nie lubią się z windowsem, choć ten egzystuje na każdym komputerze. Ja za to uwielbiam VS i jego możliwości ;p

    / Wtrącony przykład: na 1 wykładzie z C++ nikt nie wymienił wśród edytorów C++ Visual Studio, ale za to padł bardzo dobry, użyteczny i w ogóle świetny DevC++ (Polecamy) /

    Jeśli chodzi o dalsze rozwijanie wszystkiego - chcę doprowadzić aktualny stan projektu do działania real-time na linuxie. Czas goni i muszę zrezygnować z renderowania innych figur niż sfery, a odbicia i załamania światła są praktycznie niezauważalne, a bardzo obciążają procesor.

    Nic dziwnego, skoro Anupadaka na GPU (wielki ukłon w stronę autora) potrzebuje czasem kilku godzin, to odpowiednio skalując rozdzielczość i zmniejszając ilość promieni dalej otrzymujemy przynajmniej kilka sekund na render (a ja używam jeszcze podstawowych, niezoptymalizowanych podstaw).

    @seba86 Przymusowo korzystam z własnych klas, które jednak musiały być napisane na pokaz. W tej chwili w moich oczach projekt ma więcej wad niż zalet i jeśli zajmę się za jego rozwój w przyszłości to koniecznie zacznę wszystko od początku (angielski i biblioteka do matmy koniecznie).

    Z drugiej strony, chłopaki :), to zwykły, ułomny raytracer, tyle, że jasność pikseli zamieniam na ASCII. Mała rzecz, a cieszy ;p
  • sebas86 (@sebas86) 18 maja 2014 11:36
    @deshan nie widzę nic złego we własnych klasach. IMO jedna z lepszych metod zbadania problemu od podszewki.

    I czy tylko zwykły, ułomny raytracer? Zawsze to własny raytracer. Robiąc go samemu, na pewno napotkałeś kilka problemów i jesteś bogatszy o tę wiedzę w przeciwieństwie do ludzi, którzy tylko o tym czytali lub korzystają z gotowego oprogramowania. ;)
  • Wojciech Kasperczyk (@rethil) 18 maja 2014 13:26
    Jak dla mnie fakt, że ci się chce to już sporo! Jak miałem nieprzyjemność prowadzić ze studentami laboratoria własnie z raytracerów to trzeba było naprawdę sporo czasu poświęcić na to żeby im wyjaśnić jak to się właściwie liczy (oczywiście nikt nie czytał instrukcji przed laborkami, bo po co). Dla większości studentów informatyki (3 rok) zaimplementowanie funkcji liczącej przecięcia kuli i promienia przy podanych i wyprowadzonych wzorach to wyższa szkoła jazdy.
  • deshan (@strateg) 18 maja 2014 16:20
    @rethil Jeśli masz może jeszcze materiały z tych zajęć, bardzo chętnie bym się z nimi zapoznał. Ja na razie jestem na pierwszym roku, także takie przyjemności są dopiero przede mną ;) Jeśli zaś chodzi o samą informatyką, to chyba każdy wie, że trzeba to zwyczajnie pokochać, inaczej niewiele się uda...
  • Wojciech Kasperczyk (@rethil) 18 maja 2014 19:10
    Chciałbym, ale materiały są własnością uczelni:/ Zresztą jeśli sam napisałeś raytracera to materiał z tej labki nic by ci pomógł:) Uwierz mi, uczelnia nie da ci wiedzy, a jedynie wspomni o jej istnieniu. To na tobie jako studencie spoczywa obowiązek jej zgłębienia. Wiem, że to zalatuje wyświechtanym frazesem, ale tak po prostu jest - każda praca własna jest dużo więcej warta niż setka laborek z których wyniesiesz tylko wstęp z instrukcji i pytania na wejściówkę (mi wyparowywały z głowy zanim wsiadłem do pociągu powrotnego wiec raczej i tak nie za długo z nich mogłem korzystać:P)
  • deshan (@strateg) 18 maja 2014 19:33
    No cóż, masz całkowitą rację. Niemniej jednak i tak czuję się przytłoczony materiałem, szczególnie dlatego, że czuję, że jest mi on niepotrzebny. Przykładowo, ja jestem w stanie sam wejść na internet, poszukać i znaleźć odpowiedź na moje pytanie. Za to uczelnie skutecznie pokazuje, aby tego nie robić, lepiej uczyć podstaw (szczególnie tych teoretycznych). Na przykład, na mojej uczelni egzamin z C++ jest bardziej zlepkiem zagadek programistycznych niż faktycznego kodu. A praktyka pokazała mi już, że różne kompilatory kompilują inaczej (np. cygwin i gnu).
  • sebas86 (@sebas86) 18 maja 2014 19:50
    Uczelnia o wielu rzeczach nie wspomina, akurat różnice między Cygwinem, Mingw (oba korzystają z narzędzi GNU), etc. rozumiem, to jest problem użytkownika z jakiego zestawu narzędzi ma zamiar korzystać, a nie uczelni, uczelnia może zaproponować wybrane rozwiązanie aby na nim przedstawić problem i móc przygotować materiał (nie wyobrażam sobie, żeby profesor siedział i przygotowywał materiał na setki różnych środowisk). Zresztą taka wiedza szybko się dezaktualizuje, więc i pożytek z niej marny, lepiej przekazywać podstawy i wiedzę o szeroko przyjętych standardach.

    Inna sprawa, że uczelnia mogłoby przykładać większą wagę do jakości, debugowania, metodologi, etc. Niestety większość musi przebrnąć przez to sama, nieraz nabierając niezbyt dobrych nawyków i wywarzając otwarte drzwi albo włażąc kominem…
  • deshan (@strateg) 18 maja 2014 22:18
    Jak na razie jedyny "uczelniany" sposób debugowania to używanie instrukcji warunkowych z printf-ami. Nikt nie słyszał o IDE, a jeśli nawet, to z jakiegoś powodu się go boi/unika. Zresztą jedyny obecny NetBeans to i tak nie jest wymażone narzedzie do pracy (ale z całą pewnością lepsze od czystej konsoli, osobno pisanego makefile i przeskakiwania między terminalami). Ale koniec już narzekania ;D
  • Aleksander Nitecki (@Xender) 19 maja 2014 12:06
    @strateg - dobrze ogarnięty terminal + edytor tekstu może być zdecydowanie wygodniejszy niż jakiekolwiek IDE.

    Co do Makefile, to pisania go z palca ma dokładnie tyle sensu, co klikanie w IDE, żeby dodać nowy plik do projektu. PITA. Dlatego powstały takie projekty jak

    a) vfnmake - https://github.com/Vifon/vfnmake - trochę do niego kontrybuowałem. Obecna wersja działa, ale raczej przerzucamy się na następną opcję.

    b) GenericMakefile - https://github.com/mbcrawfo/GenericMakefile - jeszcze nie testowałem, wygląda na to, że vfnmake był po prostu niepotrzebnym roundtripem, bo gcc -MM samo wypluwa listę zależności plików cpp od headerów tak, że można bezpośrednio zasource'ować (odpowiednik #include) ją do Makefile.
  • Aleksander Nitecki (@Xender) 19 maja 2014 12:11
    A w ogóle to nie uczą gdb na studiach?
  • deshan (@strateg) 19 maja 2014 12:39
    Nie wiem, jak jest na kolejnych latach, ale na moim pierwszym roku nic o nim nie wspominali. A uczelnia przecież jedna z bardziej cenionych, w końcu UJ, więc nie sądzę, a poziom bardzo odstawał od innych uczelni.

    Jakby nie było w trakcie 3 lat podstawowych studiów jest około 30 przedmiotów, więc na pewno takie zaległości nadrobią. Z drugiej strony, niepotrzebnie utrudniają czasem życie.

    Jeśli zaś chodzi o wspomniany terminal - być może masz rację, nie będę zaprzeczał. Ale dzięki IDE byłem w stanie zacząć programować już w podstawówce i stało się to dla mnie naturalne, zaś patrząc, jak większość osób nie potrafi dosłownie nic, nie sądzę, by terminal był dla nich najlepszym środowiskiem rozwojowym.
  • Aleksander Nitecki (@Xender) 19 maja 2014 13:38
    @strateg - A czy ja mówię, że to środowisko rozwojowe dla początkujących? W podstawówce uczyłem się C++ z książki z serii "Biblioteczka Komputer Świata" i używałem załączonego na płycie Dev-C++. Tylko potem z tego wyrosłem. ;)
  • Programistagd (@programistagd) 19 maja 2014 21:22
    Najbardziej realistyczna woda na warsztacie chyba :) Nawet Anupadaka nie schodzi do pojedynczych cząsteczek.

    A tak na serio, fajny projekt. Pisanie ray-tracera może wiele nauczyć.

    Fajny pomysł z użyciem konsoli/tekstu jako wyjścia programu zamiast klasycznej grafiki, przypomina mi renderer sześcianu do terminala jaki ktoś swego czasu umieszczał na warsztacie.
  • deshan (@strateg) 20 maja 2014 00:30
    @Programistagd To właśnie było inspiracją do stworzenia tego projektu. Przyszedł czas chęci i stworzyłem dawne zamierzenie. Z drugiej strony jeszcze wtedy moje umiejętności nie były wystarczająco wysokie - tak to jest, rozwijamy się cały czas ;D

    Co do wody: nie chcę myśleć jak skomentujecie kolejną scenę ze sferami, którą stworzyłem do testowania nowego oświetlenia i cieni ;) Filmik, albo screen już niedługo. No i niestety, zapowiadane wstrzymanie projektu... Ale najważniejsze, że wyszło realtime, choć nic szczególnego nie renderuje ;p
  • Napisz komentarz:
    Aby dodać swój komentarz, musisz się zalogować.
Screen dodał:
deshan
16.05.2014 02:26:22

Kategoria:
Efekt graficzny

Punkty:
1688

Ocenili na plus:

Warsztat używa plików cookies. | Copyright © 2006-2017 Warsztat · Kontakt · Regulamin i polityka prywatności
build #ff080b4740 (Tue Mar 25 11:39:28 CET 2014)