Zaawansowana grafika komputerowa

Wykład rozpoczyna się o 15:30 a ćwiczenia o 17:10 w poniedziałki, sala G-1-03. Zapraszam również na konsultacje (pokój C-2-29 lub online, terminy w USOSwebie).

Na ćwiczeniach można mieć trzy nieusprawiedliwione nieobecności bez ponoszenia konsekwencji. Przy większej ich liczbie proszę się spodziewać dodatkowych projektów, przepytywania sprawdzającego znajomość zagadnień poruszanych na opuszczonych zajęciach, itp. rzeczy.

W razie nieobecności proszę sprawdzić na tej stronie, co Państwa ominęło i nadrobić braki. Podobnie jeśli nie zdążycie zrobić w trakcie zajęć wszystkich zadań — stają się one wtedy automatycznie zadaniami domowymi. Możecie nad nimi pracować zdalnie po zalogowaniu się do linii komend na serwerze spk-ssh.if.uj.edu.pl, albo na domowym komputerze po zainstalowaniu na nim potrzebnego oprogramowania.

Oceny z ćwiczeń wystawiane są na podstawie:

Przykładowe projekty 2D, od banalnego (dla tych, którym wystarczy dst) do bardziej skomplikowanych:

Projekt 3D powinien bazować na bibliotece OSG. Musi zawierać dwie rzeczy, modyfikowanie stanu sceny (skokowe lub w postaci płynnej animacji) oraz reagowanie na akcje użytkownika (klawiatura i / lub myszka). Przykładowe tematy:

Aby zaliczyć przedmiot trzeba zaliczyć ćwiczenia i zdać egzamin ustny. Wpisywana do indeksu ocena z egzaminu może być co najwyżej o jeden stopień wyższa od oceny z ćwiczeń (a więc osoba, która zaliczy ćwiczenia na +dst nie ma szans na bdb jako ocenę końcową).

Egzamin zaplanowany jest na poniedziałek 2 lutego 2026, sala G-1-03. Egzaminuję po dwie osoby na raz. Proszę samodzielnie wpisać się na listę (Galla Anonima oczywiście można z niej usunąć).

Literatura

Materiały do zajęć

Po zalogowaniu się w pracowni do Linuksa można je znaleźć w katalogu /home/palacz/ZGK/. W miarę postępu zajęć będę tam uaktualniał slajdy z wykładu, dodawał przykładowe programy, pliki danych, itp.

Materiały są również widoczne po zalogowaniu się na wydziałowy serwer zdalnego dostępu, czyli spk-ssh.if.uj.edu.pl.

Zajęcia 2025-10-06

Przypomnienie podstawowych informacji o fizjologii wzroku i rastrowych formatach grafiki 2D. Rasteryzacja figur geometrycznych, biblioteka GD jako przykład prostego narzędzia służącego do tworzenia obrazów rastrowych, zarządzanie pamięcią w takich bibliotekach (ppm*.c).

Jeśli ktoś z Państwa nie ma aktywnego konta linuksowego, musi je sobie odnowić u pana Damiana Lisa. A na dzisiejszych zajęciach może pracować pod Windows i zrealizować tyle z poniższych punktów, ile się da.

Zajęcia 2025-10-13

Wykład: przypomnienie podstawowych informacji o językach PostScript, PDF i formacie SVG, oraz o używanym w nich modelu tworzenia grafiki wektorowej. Zapoznanie się z podstawami biblioteki Cairo.

Ćwiczenia:

Zajęcia 2025-10-20

Wykład: mini-kurs Octave’a (open-source’owy odpowiednik MATLAB-a) i omówienie używanej w tym środowisku reprezentacji obrazów rastrowych.

Ćwiczenia:

A teraz coś z zupełnie innej beczki: naukowcy z AGH proszą wszystkich chętnych o wypełnienie ankiety „Sztuczna inteligencja w obliczeniach i symulacjach”. Warto kilka minut poświęcić aby pomóc im w badaniach.

Zajęcia 2025-10-27

Wykład: obraz rastrowy jako macierz próbek ciągłej funkcji dwuargumentowej, wybrane operacje na rastrach (skalowanie czyli resampling, filtry splotowe, filtry nieliniowe: gradient Sobela, filtr medianowy, filtry adaptacyjne), LUT.

Ćwiczenia:

Zajęcia 2025-11-03

Binaryzacja, przekształcenia morfologiczne. GIMP jako przykład aplikacji korzystającej z filtrów rastrowych. Wstępny rzut oka na bibliotekę OpenCV.

Ćwiczenia najpierw z Octave’a, potem z OpenCV:

Zajęcia 2025-11-17

OpenCV ma w nazwie „computer vision”, dzisiejszy wykład jest więc ogólnym rzutem oka na problemy, którymi zajmują się specjaliści od wizji komputerowej (patrz slajdy prof. Torralby). Wykracza to poza zakres naszego przedmiotu, ale warto zobaczyć jak wykorzystywane są idee, o których mówiliśmy na zajęciach (obraz jako macierz liczb, filtrowanie obrazów, itd.).

Na ćwiczeniach wybór tematów projektów 2D. Najlepiej byłoby, gdyby te projekty udało się Państwu oddać już w grudniu lub ewentualnie na początku stycznia, bo potem do zrobienia macie jeszcze projekt 3D.

Ćwiczenia (proszę pisać w C++, nie w Pythonie):

Zajęcia 2025-11-24

Krótkie przypomnienie podstawowych wiadomości o aplikacjach 3D.

Ćwiczenia (można pisać w C++ albo w Pythonie, jak kto woli):

Zajęcia 2025-12-01

Podstawy biblioteki OpenSceneGraph (OSG). Analiza przykładów osg01.cpp i osg02.cpp.

Dyskusja nad tym, jak analizować obraz z kamery obserwującej parking.

Ćwiczenia:

Zajęcia 2025-12-08

Krótki wykład o matematycznych narzędziach używanych w animacji, m.in. omówienie metod pozwalających tworzyć naturalnie wyglądające animacje ruchu i obrotów.

Ćwiczenia:

Podczas wykonywania ćwiczeń prawdopodobnie znajdziesz część odpowiedzi na pytania z przyszłotygodniowego quizu.

Zajęcia 2025-12-15

Przypomnienie podstawowych informacji o OpenGL, a potem analiza sposobów przekazywania z aplikacji do karty graficznej danych opisujących renderowaną bryłę. Wiedza o tym, jak to na niskim poziomie działa, czasem się przydaje — OpenSceneGraph jest przecież nakładką na OpenGL, więc jeśli wiemy co jest optymalne z punktu widzenia OpenGL, to będziemy też wiedzieć jak efektywnie używać OSG.

W drugiej części wykładu, już bez slajdów: sposoby wyświetlania grafiki 2D / 3D w przeglądarce internetowej. Możliwości rozciągają się od klasycznego wstawiania w środek strony plików grafiki rastrowej lub wektorowej (SVG w formie odrębnego pliku lub wplecione w kod HTML), przez animowanie tej grafiki (animowane GIF-y, animacje CSS, SMIL, interaktywne animacje kontrolowane z poziomu JavaScript), do pisania w JavaScripcie programów rysujących dowolne rzeczy na kanwie HTML5. Kanwa wymaga utworzenia kontekstu rysowania, dopiero za jego pośrednictwem można wywoływać operacje graficzne. Współczesne przeglądarki udostępniają trzy typy kontekstów: 2D, WebGL 1.0, WebGL 2.0. Czwarty typ, WebGPU, jest ciągle trochę eksperymentalny ale od połowy 2025 r. Firefox i Chrome / Edge go obsługują.

Generowanie rysunków wewnątrz przeglądarki często jest robione przy pomocy jakiejś wyspecjalizowanej javascriptowej biblioteki. Dostępnych jest np. wiele bibliotek do tworzenia dynamicznych wykresów biznesowych, i kto wie czy nie jeszcze więcej bibliotek wspomagających pisanie przeglądarkowych gier.

Istnieje też javascriptowa wersja OSG, choć w 2018 r. autor przestał ją dalej rozwijać. Zainteresowani mogą mimo wszystko rzucić okiem na witrynę OSG.JS (szczególnie ważne są przykłady użycia, bo OSG.JS nigdy nie miała porządnej dokumentacji) oraz przejrzeć kod źródłowy w repozytorium na GitHubie. Autor starał się zachować jak największe podobieństwo do oryginalnej biblioteki, choć oczywiście OSG.JS nie jest zaimplementowana w C++ i zamiast OpenGL używa WebGL.

Quiz sprawdzający znajomość OSG API (lub umiejętność sprawnego wyszukiwania potrzebnych informacji w dokumentacji OSG, na jedno wychodzi):

  1. Graf sceny nie zawsze jest drzewem, wierzchołki czasem mają więcej niż jednego rodzica. Co za tym idzie w klasie Node musi być jakiś bardziej skomplikowany mechanizm niż hipotetyczna metoda Node * getParent(). Jaki i jak działa?

  2. W jaki sposób OSG reprezentuje stan kontekstu OpenGL, czyli położenie tych rozmaitych przełączników, które można przestawiać przez glEnable / glDisable?

  3. Jak obliczyć prostopadłościan ograniczający (ang. bounding box) dla danej Geode?

  4. Czy MatrixTransform ma jakieś metody, które ułatwiłyby tworzenie macierzy reprezentujących złożone transformacje (obróć o 45°, potem przesuń o 0.8 wzdłuż osi X)?

  5. Co reprezentują klasy Light i LightSource?

  6. W jaki sposób w OSG jest reprezentowana kamera patrząca na scenę? Czy możemy sami ustawić jej parametry, zamiast zdawać się na to jak ją automatycznie skonfiguruje Viewer?

  7. Jaka jest różnica pomiędzy ref_ptr a observer_ptr? Z jakimi inteligentnymi wskaźnikami wprowadzonymi w C++11 można je porównać?

  8. W podręczniku opisana jest dość skomplikowana procedura znajdowania obiektu, w który kliknięto myszką. Wynik zwracany jest nie jako Node *, lecz jako NodePath. Dlaczego?

Ćwiczenia:

Zajęcia 2026-01-12

Ogólny rzut oka na zastosowanie grafiki komputerowej w projektowaniu inżynierskim. Omówienie podobieństw i różnic w stosunku do podejścia używanego w aplikacjach, gdzie grafika pełni rolę czysto dekoracyjną (np. w grach). Częścią wykładu są dwa filmy z Youtube’a:

Na dzisiejszych ćwiczeniach macie Państwo wybór: można pracować nad projektami albo zająć się poniższymi zadaniami dotyczącymi OpenGL.

Ćwiczenia:

Zajęcia 2026-01-19

Wykład o typach krzywych i powierzchni używanych w systemach CAD. Do tego kilka poglądowych filmów z Youtube’a:

Ćwiczenia:

Zajęcia 2026-01-26

Zamiast normalnego wykładu i ćwiczeń będzie oddawanie projektów oraz wystawianie zaliczeń. Mam nadzieję, że trzy godziny zegarowe nam na to wystarczą. Spóźnialscy będą mogą oddać swoje projekty na dowolnym dyżurze w sesji.

Przypominam, że w następny poniedziałek, czyli 2 lutego, jest pierwszy termin egzaminu. Można do niego podejść nawet jeśli ćwiczenia nie są jeszcze zaliczone z powodu nieoddania projektów, ale oczywiście oficjalne wpisanie oceny z egzaminu do USOSweb nastąpi dopiero po zaliczeniu ćwiczeń.

Post factum: trzy godziny nie wystarczyły. Osoby, od których nie zdążyłem odebrać projektów zapraszam więc w piątek na Teams, zapiszcie się na listę na odpowiadającą Wam godzinę.