Moje korzenie w modelowaniu 3D – a wszystko zaczęło się od filmu!

Pewnie niektórzy zastanawiają się, jak facet, który od lat pisał programy związane z drogownictwem, a w technikum liznął trochę geodezji, na końcu studiów, zamiast brać poważny temat związany z programowaniem (np. jakiś system rozpoznawania obrazu albo system obsługi fizyki), bierze na temat rzecz pasującą do studiów architektonicznych?

Otóż około 2003 roku, jeszcze na studiach, przeżywałem dość mocną fascynację filmem „Powrót do przyszłości”. Stwierdziłem, że fajnie by było mieć własny „wehikuł czasu”.

Kadr z Powrótu do Przyszłości - część II.

Kadr z Powrótu do Przyszłości – część II.

Na taki w skali 1:1 nie było mnie wtedy stać, więc sprowadziłem z zagranicy model redukcyjny (1:18).

DeLorean - model

DeLorean – model

No jednak dalej czułem, że coś więcej można by zrobić.I w którymś momencie pojawiła się myśl: „a może by tak zrobić cyfrowy model 3D”?

Czyżby to jeden z tych pomysłów?

Czyżby to jeden z tych pomysłów?

To jest to!

Ale nie miałem pod ręką odpowiedniego edytora. Oprogramowania do modelowania 3D były bardzo drogie, ja chciałem natomiast zrobić to tak, aby przy okazji nabyć dodatkowej wiedzy z programowania. Najlepsza nauka to nauka przez zabawę – więc jeśli pojawia się okazja, trzeba z niej korzystać 🙂

W tamtym czasie dopiero poznawałem C++, natomiast już dość biegły byłem w Delphi (czyli Object Pascalu). Więc stwierdziłem – napiszę prosty program do rekonstrukcji 3D ze zdjęć (na bazie fotogrametrii).

Niestety temat był złożony, ponieważ zdjęcia są obarczone wpływem perspektywy i stworzenie odpowiedniego algorytmu byłoby mocno kłopotliwe (a przynajmniej mocno dla kogoś, kto chciał to zrobić jak najszybciej). Udało mi się jednak znaleźć rzuty DeLoreana (blueprints), które wykorzystałem jako podstawę.

DeLorean - rzut z przodu

DeLorean – rzut z przodu

DeLorean - rzut z boku

DeLorean – rzut z boku

Po prostu stwierdziłem, że zacznę od modelowania z rzutów, a na metody ściśle fotogrametryczne (rekonstrukcja z kalibracją orientacji zdjęć) przyjdzie czas kiedyś. Tak więc po jakimś czasie powstała aplikacja, którą zatytułowałem „BluePrint Modeler”.

BluePrint Modeler - pierwsza wersja aplikacji z motywem DeLorean`a

BluePrint Modeler – pierwsza wersja aplikacji

BluePrint Modeler w pierwszej wersji pozwalał na pobranie współrzędnych z dwóch rzutów (np. z boku i z przodu) i wstawienie punktu w przestrzeń 3D. Wstawiając poszczególne punktu i łącząc je liniami uzyskiwało się siatkowy model obiektu.  Zastanawiając się, co zrobić z teksturowaniem – przy okazji zacząłem się wprawiać przy programowaniu z użyciem OpenGL.

BluePrint Modelere - DeLorean - model siatkowy

BluePrint Modelere – DeLorean – model siatkowy

BluePrint Modelere - DeLorean - model bez tekstury - cieniowany

BluePrint Modelere – DeLorean – model bez tekstury – cieniowany

 

BluePrint Modelere - DeLorean - również model cieniowany, ale w bardziej stonowanym kolorze

BluePrint Modelere – DeLorean – również model cieniowany, ale w bardziej stonowanym kolorze

BluePrint Modelere - DeLorean - model z ustawionymi planami z włączoną przezroczystością

BluePrint Modelere – DeLorean – model z ustawionymi planami z włączoną przezroczystością

W międzyczasie, rozwijając program, okazało się, że Delphi mi już nie wystarcza. Może to był wpływ C++, który zaczął mnie coraz bardziej wciągać ze względu na jego elegancję? Trudno ocenić co, w każdym razie w efekcie postanowiłem przeportować (przepisać) kod z Delphi/Pascala na C++. Akcja ta się udała, aczkolwiek kodowanie w Delphi a kodowanie w C++ to czasem dwa różne światy. C++ wydawał się językiem mającym większego „powera” (wybaczcie, entuzjaści Delphi i Pascala 🙂 ).

Zostawiając kod w tym momencie tak jak jest, skazywałbym go na małą elastyczność. Podjąłem więc decyzję o zaprojektowaniu pewnych rzeczy od nowa, projektując już pod mechanizmy silnie związane z C++.

Powstała trzecia wersja programu, która do końca jego rozwoju służyła mi bardzo dobrze. Modele można było eksportować do VRMLa, do formatu z którego można było oglądać modele w przeglądarce (po zainstalowaniu odpowiedniej wtyczki).

BluePrint Modeler - w trakcie rekonstrukcji dworku

BluePrint Modeler – w trakcie rekonstrukcji dworku

Wracając do modelowania i rzutów. Wszytko byłoby fajnie gdyby nie to, iż rzuty trzeba było przygotować (przeskalować, odpowiednio ustawić). Z forów dot. modelowania 3D (np. w 3D studio) osoby zajmujące się tym tematem z reguły robiły to ręcznie.

Ja zapragnąłem, aby zrobił to za mnie automat.

Wykorzystując wiedzę nabytą w Technikum Geodezyjnym, opracowałem odpowiednie metody kalibracji i wstawiłem je do programu. Dzięki temu nie musiałem już się martwić o ręczne przypasowywanie rzutów.

Moduł kalibracji planów architektonicznych w BPM

Moduł kalibracji planów architektonicznych w BPM

Po pewnym czasie okazało się, że praca nad projektem jest bardzo wciągająca. Będąc na trzecim roku studiów i mając mnóstwo różnych, czasem mało przydatnych, ale zabierających czas przedmiotów, czasu było coraz mniej i powoli trzeba było myśleć o wyborze specjalizacji i wyborze promotora pracy dyplomowej. Tematy prac z reguły bywają narzucane, a mnie przerażała myśl robienia jakiegoś nudnego projektu, skoro pracowałem nad tak ciekawym tematem.

Postanowiłem zatem zaryzykować i zgłosić się z BluePrint Modelerem i tematem rekonstrukcji 3D jako tematem pracy dyplomowej. Na szczęście trafiłem na naprawdę wyrozumiałego i obytego w temacie grafiki mentora.

Dr. inż. Sławomir Nikiel nie tylko zgodził się na ten projekt, ale bardzo entuzjastycznie podszedł do tematu i również pomógł mi w weryfikacji pewnych aspektów pracy (także w pomocy w zakresie j. angielskiego). Z tego miejsca  pozdrawiam go i dziękuję, że mogłem dzięki niemu hobbystyczny temat zamienić w poważne, naukowe wypracowanie. Obyśmy mieli więcej takich wykładowców na uczelniach.

Wracając jednak do angielskiego – dlaczego właśnie angielskiego?Dlaczego nie mogłem pisać pracy zwyczajnie po polsku? Ponieważ jak przystało na zakręconego programistę, postanowiłem jeszcze bardziej utrudnić sobie temat i napisać pracę w całości w języku angielskim (przy okazji trochę go szlifując). Angielski zresztą jest językiem narzucającym samo przez się, bo kod pisany jest i tak w angielskim i zwykle staram się stosować nazewnictwo w języku Szekspira.

Tak więc jeszcze w 2003 roku zacząłem rozwijać projekt, koncentrując się mniej na DeLoreanie, a bardziej na tematach związanych z architekturą. Dostałem parę planów architektonicznych (m.in. schemat nieistniejącego już Dworku w Laskach Odrzańskich) i zacząłem przystosowywać oprogramowanie tak, by rekonstrukcja była możliwie najprostsza, ale żeby system był możliwie jak najbardziej przydatny pod kątem przygotowywania zdjęć i traktowania ich jak rzuty.

W niby prostym zagadnieniu (łączenie współrzędnych punktów z różnych rzutów, teksturowaniu) jak grzyby po deszczu zaczęły się pojawiać kolejne pytania i potrzeby. A to usunięcie perspektywy, a to usunięcie dystorsji sferycznej (która wydatnie potrafiła wpływać na wyniki rekonstrukcji). Bywały momenty, iż musiałem odsunąć projektowanie głównego modułu (edytora), na rzecz pomniejszych, choć nie mniej skomplikowanych modułów, rozwiązujących problemy (np. usuwając zniekształcenia sferyczne..itd).

Stanowisko do zbierania pomiaru do usuwania dystorsji

Stanowisko do zbierania pomiaru do usuwania dystorsji

Wziąłem się za temat usuwania dystorsji sferycznej. Opracowałem planszę kalibracyjną oraz odpowiednie procedury rozpoznawania markerów – w celu sprawdzenia jak bardzo zdjęcie jest zniekształcone. Okazało się, że kalibracja ręczna jest bardzo żmudna, więc łącząc wiedzę pozyskaną na studiach (algorytmy neuronowe i genetyczne), postanowiłem zaangażować do tematu kolegę (Maćka Gawła), z którym wspólnie (przy okazji realizując to jako projekt na zaliczenie) opracowaliśmy automatyczną kalibrację bazującą na algorytmie genetycznym. Moduł został opracowany jako osobny program, ale później udało mi się go zintegrować z BluePrint Modelerem.

BPM - moduł kalibracji dystorsji sferycznej ,już zintegrowany

BPM – moduł kalibracji dystorsji sferycznej ,już zintegrowany

Zaciekawiło mnie również, jak bardzo wygląda kwestia dystorsji w odniesieniu do będących na rynku aparatów. Postanowiłem udać się do salonu sprzedającego aparaty (FotoJokera) i poprosić o możliwość wykonania zdjęć plansz kalibracyjnych. Dzięki uprzejmości Panów z salonu, udało się pozyskać odpowiednią ilość materiałów do badań. Wykonałem odpowiedni moduł, który pozwolił na przygotowanie profili i dokonywanie korekcji przy pomocy plików z wcześniej wykonaną kalibracją.

Korekcja dystorsji - aparat Canona

Korekcja dystorsji – aparat Canona

 

Stwierdziłem, że fajnie by było aby inni wiedzieli o tym, jak dystorsja wpływa na obraz. Badania upubliczniłem na stronie: Korekcja Dystorsji Soczewki. Razem z profilami i bezpłatną wersją programu, pozwalającą na użycie profili do kalibracji obrazu lub filmów/video. Od czasu do czasu zdarza się, iż kontaktują się ze mną osoby zajmujące się fotografią, którym przeszkadza taki efekt. Odbieram więc zdjęcia, bezpłatnie przygotowuję profil i umieszczam na stronie – gdzie każdy, posiadający dany model aparatu, może je pobrać i użyć.

Osobny program do korekcji dystorsji sferycznej

Osobny program do korekcji dystorsji sferycznej

W tamtym czasie pracowałem również nad metodami przygotowywania tekstur ze zdjęć. Jeśli chcemy zrekonstruować obiekt ze zdjęć, to usunięcie wpływu perspektywy jest dość istotne. Podobnie jak w przypadku dystorsji, tak i tutaj trzeba było pochylić się nad tematem, spędzić odpowiednią ilość czasu nad dobraniem odpowiednich metod.

Po pewnym czasie udało mi się wyprowadzić wzór (to bardzo fajny moment, gdy mamy taki wzór i cieszymy się, że działa 🙂 ), który pozwalał na wykorzystanie w procedurze przetwarzania obrazu.

BluePrint Modeler - etap korekcji perspektywy na przykładzie ścian budynku Uniwersytetu Zielonogórskiego

BluePrint Modeler – etap korekcji perspektywy na przykładzie ścian budynku Uniwersytetu Zielonogórskiego

Jeszcze trochę czasu spędzonego przy edytorze i mogłem przygotowywać tekstury w łatwy sposób. Dodałem też moduł wizualnego kompletowania modułów korekcji.

Moduł przepływu danych pomiędzy modułami BluePrint Modelera

Moduł przepływu danych pomiędzy modułami BluePrint Modelera

Zbliżał się termin oddania prac i był już 2005 rok. Ja zacząłem dość wcześnie, bo w 2003, więc przez ten czas, zbierając dane, udało mi się zebrać odpowiedni materiał do pracy. Wykonałem też parę rekonstrukcji, ale przyznam, iż zawsze dążyłem do perfekcji, więc siłą rzeczy zawsze znajdowałem coś, co możnaby ulepszyć w oprogramowaniu. Zamiast koncentrować się na rekonstrukcji, koncentrowałem się na oprogramowaniu – w efekcie rekonstrukcji mam dość mało 🙂

Na kanale umieściłem filmiki, wykonane w oparciu o modele, zrekonstruowane w programie:

Dworek:

Rekonstrukcję budynku GDDKIA (teraz już mają dobudowane kolejne piętro 🙂 ) – rekonstrukcja wykonana w ciągu 1h.

Rekonstrukcję „budy” wagonu piętrowego PHP:

Finalnie praca miała ponad 140 stron i dość myślę, że wystarczająco kompleksowo opisałem temat. Praca została obroniona, gustowna książeczka powędrowała na półkę, a ja zacząłem szukać pracy w zakresie oprogramowania dla fotogrametrii.  Niestety było to  bardzo niszowe zagadnienie, więc nie udało mi się znaleźć ciekawej opcji.

Postanowiłem zatem spróbować sił w dziale IPTV korporacji ADB ,produkującej nowoczesne rozwiązania SetTopBox (czyli rzeczy związane z dekoderami tv cyfrowej). Tam zapoznałem się w praktyce m.in. z PHP, MySQLem, CSSem  które są podstawą bardzo dużej ilości serwisów na świecie. Poznałem również wielu fachowców, specjalizujących się w różnych dziedzinach związanych z rozwojem technologii tv – był to bardzo pouczający i ciekawy etap rozwoju. Z miejsca mogę pozdrowić wszystkie życzliwe osoby, z jakimi współpracowałem w tym czasie 🙂

Jednakże wtedy znów ujawniła się moja tendencja do kompleksowego rozwiązywania problemów i stworzyłem FastChecka (PHPowy serwis do pomocy przy testach jakościowych w sekcji QA). Podejrzewam, że przygodę z rozwiązaniami IPTV kontynuowałbym dalej, gdyby nie „zew natury” i chęć powrotu do korzeni.

Po prostu w pewnym momencie człowiek czuje, że jest nie na miejscu – że powinien realizować rzeczy związane ze swoim „powołaniem”. A wtedy zdałem sobie sprawę, że moim powołaniem są rzeczy związane z programowaniem modułów związanych z 3D (np. fotogrametria/geodezja/CAD). Nie opiszę ile bezsennych nocy miałem, zastanawiając się nad wyborem – czyli decyzją o rezygnacji z dobrze płatnej, rokującej i stabilnej pracy w korporacji.

Większość osób w moim otoczeniu (łącznie z rodziną) odradzała mi rezygnację – prawie każdy robił co najmniej bardzo zdziwioną minę, gdy dowiadywał się o moich dylematach w tym czasie. Myślę, że tą sytuację najlepiej zrozumie osoba, która kiedyś zdecydowała się na ten krok. Większość osób zapewne uzna taki krok za zbyt ryzykowny/odważny.

Był rok 2006 – lecz niestety wciąż rozwiązania 3D w zakresie TV nie były specjalnie pożądanym elementem.

Przygoda, przygoda, każdej chwili szkoda :) - Kraków już tuż, tuż (zdj. z samochodu).

Przygoda, przygoda, każdej chwili szkoda 🙂 – Kraków już tuż, tuż (zdj. z samochodu).

Któregoś słonecznego dnia opuściłem mury firmy, aby za parę miesięcy znaleźć się kilkaset km dalej (w Krakowie, w firmie tworzącej oprogramowanie fotogrametryczne) i kontynuować zawodowo tematy związane z fotogrametrią, modelowaniem i aplikacjami CAD – ale to temat na osobną historię.

Wracając do filmu, w pewnym momencie, pod koniec filmu, jeden z bohaterów (ojciec Marty’ego) mówi Marty’emu, że może osiągnąć wszystko, jeśli się do tego przyłoży – wskazując na swoją, świeżo wydaną książkę o „najeźdźcy z kosmosu”.

Może w prawdziwym życiu nie do końca tak bywa, ale bardzo dużo jest w tym prawdy.

Jeśli nie próbujesz – nigdy nie osiągniesz założonego celu. Popełnianie błędów i nauka z nich prędzej czy później doprowadzi, jeśli nie do celu, to w jego okolice. Czego życzę wszystkim programistom – oraz odwagi w rozwijaniu i publikowaniu swoich projektów 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Current ye@r *