Tämä sivu on muokattu kopio vuosien 2019-2020 kurssitoteutuksista. Myös vuonna 2021 tehtiin tämän mukaan. Sen jälkeen 2022 alkaen on tehty vielä uudemmalla tavalla.
"rästitehtävänä" vähän yhteen toiseen juttuun liittyen palasin asioihin 27.4.2023 ja rapsasin synopsiksen luentoon 15. Myöhemmistä luennoista synopsikset edelleen puuttuu, koska TODO-lista tämän kurssin osalta näyttää lyhenevän yhdellä luennolla 4 vuodessa. Tällä estimaatilla vuonna 2035 tulisi sellainen tilanne, että luentojen 16-18 synopsikset olisi kirjattu ylös.
Pikalinkit tämän sivun alempiin kohtiin:
HUOM: Tällä sivulla on julkinen osuus. Kurssin aikana kurssin opiskelijoille tarkoitetut ei-julkiset polkuavaimet / kutsulinkit viestikanaville ym. ovat Moodle-ympäristössä.
Kurssilla tarvitaan seuraavia:
Tällä kurssilla ei tarvita seuraavia, vaikka ne vastaavat joihinkin kysymyksiin elämän ja maailmankaikkeuden joidenkin paikallisten piirteiden suhteen:
Teknisesti vaaditaan seuraavat pakolliset suoritteet:
Lukuvuonna 2021-2022 kurssille on ilmoittautuminen auki itsenäistä suorittamista varten. Lukuvuosikohtaiset ohjeet ja muu mahdollinen tiedotus opiskelijoille tapahtuu Moodle-alueella, johon kurssille ilmoittautuneilla on pääsy.
Linkki tehtäväohjeisiin: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-837-computer-graphics-fall-2012/assignments/
Jos koodeissa on uutta ongelmaa 2021, niin korjaillaan niitä tarvittaessa. Omat pohjakoodimme vuodelle 2020 (tarkistettu toimiviksi Agoran mikroluokassa Visual Studio 2019:ssä ja mun omalla läppärillä Fedora 31:ssä GNUn komentorivityökaluilla):
git clone https://github.com/puavous/tiea311-assn0Koodin työkopio putoaa työskentelyhakemiston alihakemistoon nimeltä
tiea311-assn0
. Muutkin Assignmentit otetaan samalla tavoin keväällä 2020.
git clone https://github.com/puavous/tiea311-assn1
git clone https://github.com/puavous/tiea311-assn2
git clone https://github.com/puavous/tiea311-assn4
HUOM 1: Yllä mainituissa paketeissa ei ainakaan vielä ole käännettyjä mallivastauksia. Teen niiden toiminnallisuudesta tarpeen mukaan videoita moniviestimeen (Assignment 0:sta siellä jo on, ja muista tehtävistä muistelen olevan aika hyvät asteittain kehittyvät esimerkit viime vuoden luentovideoissa).
HUOM 2: Syyt omaan uudelleenjulkaisuun ovat, että alkuperäisten tehtävien hakemistorakenteet eivät olleet keskenään yhdenmukaiset ja että Assignment 2:n alkuperäinen käyttöliittymäkirjastobinääri Visual Studio 2010:n ajoilta ei ole enää yhteensopiva Visual Studio 2017:n kanssa. Windows on hyvin taaksepäin yhteensopiva, mutta sen kehitystyökalut eivät niinkään.
Tällä kurssilla käydään läpi MIT OCW:n täyden lukukauden mittaisesta kurssista noin 50%.
Alkuperäisistä ohjelmointitehtävistä, nimiltään "Assignment 0-5" jätetään pois puolet Assignment 2:sta, Assignment 3 kokonaan ja Assignment 5 kokonaan. Täkäläisittäin tehdään Assignment 0, 1, 2 (osittain) ja 4, joihin liittyvä teoria ehditään käydä läpi. Vuoden 2019 uutuutena Assignment 4 aloitetaan heti; sitä tehdään pikkuhiljaa samaan aikaan muiden tehtävien kanssa.
Omat tehtävämme ovat koodinimiltään T1, T2, T3 ja T4. Niistä jokainen arvostellaan skaalalla 1-5 alla olevien, pääasiassa määrällisten kriteerien mukaan. Paikallisen kurssimme arvosanaksi tulee neljän tehtäväsetin keskiarvo.
Deadline: pe 14.2.2020 (3.5 kalenteriviikkoa kurssin aloitusluennosta)
Palautustapa:
main.cpp
ja Itsearvio.txt
Itsearvio.txt
-tiedoston sisältö korvataan
plaintext-formaatissa (UTF-8 -koodauksella, opettele säätämään
koodaus tekstieditorisi asetuksista!) tekstillä, jossa on vähintään
seuraavat asiat:
# Assignment 0:n hakemistossa tämä: git diff v2020.1 > vastaus_T1_assn0.patch # Assignment 4:n hakemistossa tämä: git diff v2020.1 > vastaus_T1_assn4.patch
vastaus_T1_assn0.patch
Moodlesta tietokoneelleni git checkout 'v2020.1'; git apply vastaus_T1_assn0.patch
, käännän koodit Linuxillani ja varmistan, että koodisi toimii myös käytännössä siten, kuin Itsearvio.txt lupaa.vastaus_T1_assn4.patch
jos (toivottavasti) olet palauttanut myös sen.Tavoitteet:
Vaatimukset:
Täysiin pisteisiin tulee jo aika paljon tekemistä ja näpräämistä. Kokonaisuuden kannalta esimerkiksi 2/5 Assignment 0:sta +1 piste Assignment 4:stä on nominaalisti "hyvä", eli numeroilla ilmaistuna 3/5.
Deadline: Ohjeellinen, Moodlen palautuslaatikossa (noin 3 kalenteriviikkoa edellisestä deadlinesta)
Palautustapa:
git add swp/paavon_hieno_kahvikuppi.swp git commit -m "Ope lisäsi hienon kahvikuppimallin." swp/paavon_hieno_kahvikuppi.swp
# Assignment 1:n hakemistossa tämä: git diff -w v2020.1 > vastaus_T2_assn1.patch
Vaatimukset:
Deadline: Ohjeellinen, tarkka päivä Moodlen palautuslaatikossa (noin 1 kalenteriviikko edellisestä deadlinesta, ts. lyhyt välipala!!)
Palautustapa: (olennaisesti sama kuin aiemmin)
# Assignment 2:n lähdekoodihakemistossa tämä: git diff -w v2020.1 > vastaus_T3_assn2.patch # Assignment 4:n lähdekoodihakemistossa tämä: git diff -w v2020.1 > vastaus_T3_assn4.patch
Vaatimukset:
Deadline: Deadline-track -suoritusmoodissa "Hard and non-negotiable", tarkka päivä Moodlen palautuslaatikossa (noin 2.5 kalenterikuukautta työskentelyn aloituksesta, vastaten 1 opetusperiodin ohjeellista aikajännettä) Ohjauksen osalta kioski menee tässä kohtaa kiinni, koska opettajien on siirryttävä seuraavia työsuunnitelman tehtäviä kohti! Teknisesti palautuksia saa tehdä myöhemminkin, sitten kun on omasta mielestä valmista. Käytännössä silloin on tapahtunut jouheva siirtyminen Undeadline-trackiin (ks. suoritustapojen esittelyt yllä)
Palautustapa: (olennaisesti sama kuin aiemmin)
# Assignment 4:n lähdekoodihakemistossa tämä: git diff -w v2020.1 > vastaus_T4_assn4.patch
Vaatimukset:
HUOM: Handoutin listan kohta 16 eli tekstuurikartta ei kuulu maksimitavoitteeseen, tosin se on aika triviaali lisäys, jos siihen asti on saatu tehtyä ja haluaa brassailla.
Kurssille ilmoittautuneet voivat katsoa luennot Moniviestimestä kurssin hakemistosta. Ilmoittautuneet näkevät polkuavaimen Moodlen työtilasta!
Kalvosarjat ja videot tulevat aikakoneella vuodelta 2019. Loppupuolen luentojen sisältökuvaukset ovat näköjään yhä jonkun tulevan vuoden nakkihomma opettajalle tai jollekin muulle, joka ehtisi tehdä niihin sellaiset:
Luento 1: tiea311_2019_lec01.pdf Paikalliset alkuinfot vuodelle 2019 ja alustus aikakonevideoihin. Tärkeimpien voimatyökalujen esittely.
Luento 2: tiea311_2019_lec02.pdf Kurssin syvällisemmistä tavoitteista, "piilo-OPSista", joka ei ole enää piilossa. Ohjelmoinnin oppimisesta, C++:sta, tehtävän ratkaisustrategioista ja Assigment 0:sta. Mikroluokassa tarvittavia hakemisto- ja kirjastosäätöjä. HUOM: Luennolla kävi juttelemassa myös toinen opettaja, joka ei vuoden 2019 jälkeen ole ollut mukana. Ihan fiksuja jutteli silloin 2019.
Luento 3: tiea311_2019_lec03.pdf Terveiset APO-opinnoista; kriittistä pedagogiikkaa, kehollista oppimista ja kynän ja paperin tärkeys. Reflektio ensimmäisen viikon aikana opitusta. Keskustelussa nousi esiin mm. C++ -perustaidot ja OBJ-formaatti, kolmioverkon rakenne ja englanninkielinen terminologia. Ryhmäkeskustelu: Mikä hyödyttäisi parhaiten omaa tai kavereiden oppimista juuri nyt? Sitten käytiin luennolla läpi niitä asioita ja joitain, mitä ope oli halunnut ujuttaa mukaan. Esiin nousi Assignment 0:n tehtäväohjeen lukemiseen ja C++:aan liittyviä asioita. Mm. älä käytä pointtereita vielä! Ne tulevat vastaan Assignment 2:ssa eli parin viikon päästä vasta. Myös näkemys, että peesataan kavereita luennolla, vaikka koodamaan olis hinku. Git bash -esimerkki ja selitys tavasta, jolla tänä vuonna palautetaan tehtävät (jos teknisiä ongelmia ei tule). Yleisön pyynnöstä päädyttiin näyttämään mm. nämä: esimerkkiä Assignment 0 ohjeen lukemisesta, C++, standardisyöttövirta, IDEn käyttöä esimerkkinä hyvin ja ei-niin hyvin. Vahvoja vinkkejä tehtävän aloittamiseen. C++:n konstruktorista ja olion elinajasta kysymys ja vastaus. Assignment 0:n ensimmäistä askelta tehtäväohjeen mukaan ja lopulta C++: speksistä oppien nätimmin kuin tehtäväohjeessa. Koulumatematiikan kertaus ja yhtymäkohtia kurssilla myöhemmin vastaan tuleviin asioihin. Oman osaamisen tunnistamista.
Luento 4: tiea311_2019_lec04.pdf Toisen asteen yhtälon ratkaiseminen ja yhtymäkohta kurssin loppupuoleen. Ensimmäinen esimerkki koordinaatiston piirtämisestä paperiin. Ray tracing -esimerkki. Esimerkki kynän ja paperin käytöstä. Demotehtävien tekemisen tärkeydestä ja riskeistä, jos ei tee. Matematiikan opiskelusta. Tavoitepiste mallinnuksessa: Näkymän useiden koordinaatistojen ja niiden suhteiden esittäminen hierarkkisena mallina. Grafiikan perusolioita: piste, vektori, normaali, koordinaatti. (Tauko) Matemaattisen aihepiirin opiskelusta, kynän ja paperin käytöstä. Lisälukemiston esittely; kotitehtäväksi katsoa Härnäys, Avaus ja varsinkin koko matriisilaskentaosio. Esimerkkiharjoitus paperille piirrettynä: johdattelu vektoreihin, koordinaatteihin ja matriiseihin. Syytä tehdä itse perässä samanlainen harjoitus. Ohje TIM-monisteen puolella matriisiosion jälkeen. Lopussa lupaus jatkaa ensi kerralla matriiseista ja kerrata sitä, mitä on jo luettu prujun puolelta.
Luento 5: tiea311_2019_lec05.pdf:
Tarkkailtiin oppimisprosessia: Tähän mennessä on opittu C++:n perusteita uutena asiana tai kertauksena. Opittu, mitä normaalit ovat. Hyötynäkökulmasta oli pohdintaa siitä, kuinka yleisesti käytetty C++ on maailmalla. Ope tarkisti faktan, tai itse asiassa Antti-Jussi Lakanen tarkisti tämän kevään Ohjelmointi 1 -kurssia varten: TIOBE indexin mukaan C++ on maailman neljänneksi käytetyin kieli heti Javan, C:n ja Pythonin jälkeen. Tätä havaintoa voit käyttää muodostaessaasi omaa käsitystä siitä, onko C++:n perusteita hyvä ymmärtää. Oli opittu ratkaisemaan teknisiä ongelmia Visual Studiossa mm. Googlen avulla. Open näkemys on, että tämä on tärkeä taito riippumatta siitä, mikä tekninen ympäristö on ongelmanratkaisun kohteena. "Opittu oppimaan uudestaan unohtuneita asioita". Matematiikan merkityksestä tietotekniikan eri sovelluksissa on saatu jotakin alustavia havaintoja. Ope lupasi tuoda kurssin aikana esiin lisää laajempaa kontekstia vektorilaskennan sovelluskohteista.
Käsiteltiin läsnäolijoiden esiin nostamia teemoja:
C++:n tietovirrat, tietovirtaoperaattorit ja operandit, virran tila, C++:n dokumentaation lukeminen, STL:n perintähierarkia virtojen osalta, Ohjelmointi 2:n terminologian kertausta ja suhdetta C++:n terminologiaan (esim. "metodi==jäsenfunktio"), IDE:n pikanäppäinten käyttö, suhde ihmisen toimintaa tukeviin "välimuisteihin" kuten selainhistoria, C++:n nimiavaruudet. Ennakoiva vinkki Assignment 2:n alkuvaiheeseen, jossa std::vector -dokumentaation lukeminen on avain helppoon toteutukseen.
Miten OpenGL tekee asioita konepellin alla mm. suoritusjärjestyksen suhteen? Avain on sen luonne massiivisena "tilakoneena". Käytiin tätä läpi koodiesimerkkien kautta ja juttelin siitä, miten sama idea toteutuu modernissakin OpenGL:ssä. Lisäkysymys: Onko olemassa jotakin selkeätä paikkaa vanhan OpenGL:n spesifikaatiosta? Vastaus live-esimerkin kera: Lyö Googleen mikä vaan glJotain() -kutsun nimi, niin ensimmäiset hitit on johonkin paikkaan, josta speksi olennaisesti löytyy.
Mikä on "facen" luonne, mikä on "face" OBJ-formaatissa, mitä se tarkoittaa? Esimerkkiä ja raapustusta. Olennaisesti kärkipisteiden koordinaatit, ulkopuolen suunnat eli normaalit ja muut ominaisuudet kuten "väri". Käytännössä tehdään taulukoina, joissa on OBJ-tiedoston tapaan kärkipisteittäiset tiedot, ja facet annettu indekseinä.
Millä työkaluilla voi tehdä OBJ-tiedostoja? Esimerkiksi avoimen lähdekoodin Blender on hyvä mallinnusohjelma.
3-ulotteisen maailman geometrian kertaamista (tulee koko kurssin ajan:)).
Taukojumppa, aivoalueiden aktivointi mystisillä liikkeillä ja mindfulness-mielentyhjennys pistettä tuijottamalla.
Korostus vecmath-kirjaston lähdekoodien lukemisen tärkeydestä tällä kurssilla. Yhtymäkohtia moderniin OpenGL:ään ja Vulkaniin.
Johdatus lineaariavaruuden käsitteeseen. Kehotus (uudestaan!) lukea suomenkielinen lisämatsku TIMistä ja opetella laskemaan matriiseilla.
Luento 6: tiea311_2019_lec06.pdf
MIT:n slideja oli ladattuna 113. Osa ehdittiin käydä läpi. Alussa jälleen suositus ryhtyä lukemaan suomenkielistä lisämatskua. Tuliset hiilet pään päälle, jos ei vielä ole opetellut mekaanista laskemista matriiseilla! Tekemään se! Esimerkkejä ja selostusta matriisilaskennasta. Pystyvektori, vaakavektori.
HUOM: Kohdassa 1:28 opettajan olisi pitänyt pitää legopalikat paikoillaan ja kääntää joulupapereita, niin olisi ollut se, mitä hän puhui samalla (eli koordinaatisto muuttuu pisteiden pysyessä samana).
Kehotus ryhtyä lukemaan vecmath-kirjastoa, josta näkee rajapinnan ja toteutuksen lineaarialgebran operaatioille.
Lineaarikuvauksen ja affiinin kuvauksen ero. Tiiseri ensi viikon sisällöistä. Kehotus levätä välillä, koska ideat syntyvät siitä, että mieli on välillä tyhjä.
Luento 7: tiea311_2019_lec07.pdf
Fiiliskierros, havainnot tähän asti opitusta. Tämän hetken tarpeiden kartoitus.
Opittua: Matriisilaskentaa, kuten opettajan toive oli :). Assignment 0:ssa kameran hallintaa harjoiteltu. C++:n perusteita.
Tarpeita: T1:n viimeisen vaatimuksen tarkennuspyyntö. Täsmennettiin sanamuotoa (ks. tehtävänanto Demot-osiossa). "Miten matriiseja käytetään, että kierrot, skaalaukset ja siirrot ynnä muut saadaan tehtyä järkevästi". Loppukurssi on tämän asian juurruttamista. Tässä vaiheessa on hyvä, että tämä kysymys tuntuu avoimelta. Esitettiin myös tarve, että saisi sen "tyhmyyskokemuksen" ja löytäisi kysymyksen. Tämäkin on oikein hyvä tarve. Opettaja yrittää saada tätä aikaan tavalla tai toisella.
Viime kerran kertaus ja pieni paikkaus. Yrite toteuttaa "kehollista oppimista". Affiinien (eli siirtoja sisältävien) kuvausten toteuttaminen 3D-vektoreille 4x4-matriiseilla: kehys (engl. "frame") eli suuntakannan ja origon yhdistelmä, 4x4-muunnosmatriisin lineaarinen ja siirtävä osamatriisi, siirtomuunnos ja affiini muunnos suhteessa alkuperäiseen kehykseen. Kehotus tutustua vastaaviin toteutuksiin vecmath-kirjaston koodissa.
Tauko.
Opettaja seisoo päällään. "Välikoe", ei oikeesti, vaan yhteisöllinen laskuharjoitus. Tärkeä. Pitää ymmärtää ja osata tehdä vaikka unissaan. Niinpä harjoiteltiin luennolla (nukkumista vai laskemista vai molempia yhtä aikaa? Katso videolta, ja kokeile tehdä itse ennen kuin spoilaat oppimisen mallivastauksella, joka siellä sitten tulee..)
Ohjelmoivalle luonnontieteen kandidaatille suunnattua filosofiaa (näkemys).
Luento 8: tiea311_2019_lec08.pdf
Jatkettiin "matematiikan APIin" tutustumista käytännön harjoitteen kautta: Kuutiolliset eli kolmannen asteen polynomit vektoriavaruutena, monomikanta ja polynomin derivointi derivoimalla pelkästään monomikanta.
Ope lähti näyttämään ja juttelemaan, miten T2-tehtävä saadaan meillä läpi, ja toisaalta mikä on ensimmäinen mahdollinen askel myös korkeampien pistetavoitteiden ja laadukkaan koodin saavuttamiseksi. Tehtäväohjeen mukaisten tavoitteiden ja mallikoodin toiminnan selittäminen auki.
Kotona harjoiteltu kahden minuutin koodausharjoite muodostui luennolla vähän pidemmäksi setiksi, jossa havaittiin tärkeä seikka deadlineista ja paineen alla tekemisestä. Eli jätetään paine ja turha häslinki pois debuggauksesta, niin ratkaisu tulee minuutissa. Loppuosa (eli viimeinen minuutti opettajan tekemästä kotiharjoitteesta) jäi ensi viikkoon - stay tuned!
Johdanto käyrien muotojen mallintamiseen ja Bezier-käyriin, kontrollipisteet, käyrän parametriesitys mallia P(t)=[x(t),y(t)]^T. Ope väänsi rautalankaa, tehtiin kamera-ajoja ja puolivahingossa "hyvien puolella" olevien organisaatioiden tuotesijoittelua.
MIT:n kalvosarjaa eteenpäin, selostaen ja havainnepiirroksia raapustellen. Ohjeita Assignment 1:n aloittamisesta ja grafiikan opiskelusta ensi viikon kysymystuokiota ajatellen.
Luento 9: tiea311_2019_lec09.pdf
Fiiliskierros, havainnot tähän asti opitusta. Tämän hetken tarpeiden kartoitus.
Opittua: Ei "massiivisia hyppyjä", mutta asiat jäsentyy pikkuhiljaa mm. käyrien luonteesta. Splinet edelleen yhtä epäselviä kuin aiemmalla kurssilla. Matriisien pyörittelyä opittu. Kysymyksiä tulevasta on tullut mieleen. Opettajan mielestä tämä on optimaalinen tilanne tässä kohta kurssia.
Tarpeita: Käyristä pitäisi saada lisää täsmennystä Sattuu olemaan luentosuunnitelmassa:). Mitä liittyy Bezierien ja B-splinejen tekemiseen. Entä pintojen luomiseen. Tämäkin tulossa luonnostaan, mutta käyrien jälkeen, koska tämän kurssin proseduraaliset pinnat perustuvat käyriin.
Käytännön esimerkki mm. graafikon näkökulmasta Bezier-käyrien piirtämisessä: Inkscape -sovellus eli "graafikon IDE". Bezier-käyrän kontrollipisteet ja ominaisuudet käytännössä. Työkalusto, joka graafikolle on kiva tarjota. Terävien ja jatkuvien käyräpisteiden määrittäminen. Tangentti. Bezier-pätkien jakaminen (de Casteljaun algoritmi). Vektorigrafiikkaformaatin ilot esimerkiksi opinnäytteiden tai teknisten raporttien kaaviokuvissa. Esimerkki opinnäytteen aloittamisesta LaTeX-järjestelmällä ja infografiikasta tikz-kielellä. "Porkkanat ja IT-ammattilaisuus": filosofiaa yliopisto-opiskelusta. Ensimmäinen havainto ristitulosta, binormaalin laskeminen.
Tauko, syvähengitysharjoitus. Kaikkea ne opettaa opettajille.. hyödyllistä tosin tämäkin.
Suositus lukea suomenkielistä TIM-järjestelmään tehtyä matskua. Siitä tuli yllättävän hyödyllisen oloista.
Lineaarinen riippumattomuus 3D-avaruudessa oikean käden sormilla.
Polynomit ja potenssikanta, plottailua desmos.com'illa. Jälleen myös esimerkki ajattelua hyödyttävien työkalujen etsimisestä ja toivottavasti löytämisestä syvästä ja hyvästä Internetistä. Katsottiin plottia luennoilla aiemmin aukilasketusta ja derivoidusta polynomista. Kannanvaihtomatriisit. Bezier-käyrän painofunktiot lineaarikombinaatioina (matriisirivilaskuina) potenssikannasta. Yleinen "GBT(t) -formulointi" polynomiapproksimaatiolle. Hyvä tietää -osastoa: Muut kuin kuutiolliset Bernsteinin polynomit. De Casteljaun algoritmi.
Luento 10: tiea311_2019_lec10.pdf
Kertausta GBT(t):stä ja lisää Inkscapen ja vektorigrafiikan ylistystä. Ohjelmoijan näkökulma maailmaan numeroina, lähdekoodina, tiedostoformaatteina, automaationa. Lineaarialgebra ja paikalliset koordinaatistot taiteilijan työkalussa. Johdattelua hierarkkiseen mallinnukseen ja näkymägraafiin. Tietokonegrafiikan sovellusalueista: origamit ja avaruusteknologia. Akateemiset lähteet ja tieteellinen inspiraatio, esimerkiksi Google scholar.
Jatkossa (ja grafiikassa jatkuvasti) tarvittavia matemaattisia työkaluja: Pistetulo, vinkkiä T2:n 5/5 -arvosanatavoitteen tehtävään. Vektorin pituus eli normi. Kertausta ohjelmoinnista: staattinen metodi. Staattisen metodin kutsuminen C++:ssa, esimerkiksi vecmath-kirjaston pistetulo. Sisätulo (tällä kurssilla vain Euklidisen avaruuden sisätuloja, joka on sama kuin pistetulo). Normalisointi. Avainsana "const" C++:n, C#:n ym. sukuisissa oliokielissä metodin määritelmässä.
Tauko. Kahvin ylistys.
Ristitulo vecmath-kirjastossa ja matemaattisesti. Ristitulon ominaisuuksia, oikean käden sääntö, pinnan normaalivektorin määrittäminen ristitulolla. Ortonormaali suuntavektorikolmikko. Algoritmi, jolla saadaan kahdella ristitulolla ja kolmella normalisoinnilla aikaan ortonormaali vektorikolmikko, jos käytössä on kaksi lineaarisesti riippumatonta. Yhteys kameran parametrisointiin. VAROITUS: Huomaat kyllä katsoessa, että opettaja näytti ja selitti kaavan oikein, mutta kirjoitti sitten paperiin väärin päin (oikealla kädellä selvitettiin ja suullisesti sanottiin oikein "c ruksi a", mutta paperiin tuli väärin "a ruksi c"!). Homogenointi ja Möbiuksen projektiiviset, homogeeniset koordinaatit. VAROITUS: Jo vähän väsynyt ope selitti puutaheinää homogenized()-metodin toteutuksesta; korjaus tulee myöhemmällä luennolla.
Käyrän affiinit kuvaukset kontrollipisteiden kuvauksena. Lopussa "luovaa ohjelmointia lonkalta" ja hätiköity kuvitelma siitä, miten koodi toimi. Tangentti käyrän derivaattana. Käyrän derivointi derivoimalla potenssikanta GBT(t):ssä. Käyrän kaareutuminen, tangentin derivaatta, Frenet-kehys ja ongelma pintojen rakentamisessa. Yksi mahdollinen korjaus kuvaillaan Assignment 1:n ohjeissa; muutama sana siitä.
Luento 11: tiea311_2019_lec11.pdf
Fiiliskierros, havainnot tähän asti opitusta. Tämän hetken tarpeiden kartoitus.
Opittua: Bezier-käyrät ja B-splinet. Tänään vielä jatketaan aiheesta. Matriisilaskentaa saatu kerrattua. Tuntuu helpolta, mutta työläältä.
Tarpeita: Pintojen mallintamiseen olisi hyvä mennä. Näin tapahtuu, kun ensin vielä B-splinen teoria.
Jatkuvuusluokista. Indeksien määrittämisestä Bezier-käyrille. Yleisökommentissa hyvä vinkki koodin analysointityökaluihin: valgrind ja cppcheck.
Pieni paikkaus asioihin, joista opettaja höpötti innoissaan epätarkasti edellisellä kerralla: homogeeniset koordinaatit, suunnat "äärettömän kaukaisia pisteitä" jolloin w=0 täysin perusteltu. Painotettu Bezier.
Jatkettiin malliesimerkkiä Bezierin ja B-splinen koodauksesta perille pistetavoitteeseen 1/5 T2:ssa. Yksityiskohtia C++:sta.
Tauko.
Kuutiollisen B-splinen idea kaava ja erot Bezieriin, mm. ikkunointi. B-splinen ominaisuuksia. B-splinen ja Bezierin ikkunakohtaisten kontrollipisteiden vaihtaminen päikseen kannanvaihdolla. Matemaatikoiden ensimmäinen kikka paljastuu: ykkösellä kertominen, eli tässä matriisikertolaskun neutraalialkiolla eli identiteettimatriisilla. Yleisökommentissa mainittiin myös matemaatikon toinen kikka: nollan lisääminen. Itse asiassa sama kikka: laskutoimituksen tekeminen kyseisen laskutoimituksen neutraalialkiolla. Opettajan kokemus: näillä kikoilla pärjää melkein pari vuotta matematiikan opintojen alkupuolta.
NURBS-käyrät, joissa on mukana painot ja solmut eli ikkunoiden tiheydet. Internetistä löydetty interaktiivinen demo.
Kohti pintojen mallinnusta. Kolmioverkoista vielä: normaalivektorit ja kärkipisteiden luettelujärjestys OpenGL:ssä. Huomisen luennnon slidet esikatseluna 2 minuutissa läpi.
Luento 12: tiea311_2019_lec12.pdf
Pintojen mallinnusmenetelmiä MIT:n kalvosarjan mukaan: Bezier-tilkut, tensorin idea. Displacement mapping. Korkeuskartat. Shadertoy-nettisaitti ja sen tekijän CV. Elevated-tuotoksen varjostinkoodi.
Stanfordin pupu - kuka hän on, mistä hänet voi ladata ja mitä hänelle saa tehdä. Proseduraaliset käyrät ja meidän Assignment 1. Implisiittipinnat. Muistutus siitä, että opiskeluaikana on opintopisteiden myötä lupa ja mahdollisuus lukea matematiikkaa kaikessa rauhassa. Työelämässä ei enää ehdi yhtä hyvin, valitettavasti.
Tauko.
Tärkeän laskuharjoituksen alkuosa. Tee tämä. Varmistu, että ymmärrät asian ja pystyt toistamaan saman milloin vain! Tehtävä jatkuu ensi kerralla heti akuuttien kysymysten käsittelyn jälkeen. Assignment 2 pikaesittely ja lupa aloittaa.
Luento 13: tiea311_2019_lec13.pdf
Alkuun juttua lähestyvästä Instanssista. Tervetuloa työpajaan tekemään omaa lisäopintopistettä ja/tai ohjaamaan vasta-alkajia grafiikan hauskuuteen. Kurssiilogo-javascriptiin liittyviä kysymyksiä.
Fiiliskierroksella todettiin etenemistä tapahtuneen. Kiva.
Kysymys ja tarkennus MatrixStackiin Assignment 2:ssa.
Tauko.
Assignment 0
Tärkeän laskuharjoituksen loppuosa. Tee tämä. Varmistu, että ymmärrät asian ja pystyt toistamaan saman milloin vain! Tehtävän lopussa on vähän jännitysmomenttia, johon tulee loppuratkaisu seuraavan luennon alussa.
Luento 14: tiea311_2019_lec14.pdf
Tärkeän laskuharjoituksen viimeistely ja tarinan opetukset. Varmistu, että ymmärrät asian ja pystyt toistamaan saman milloin vain!
Hierarkisen mallin ja näkymägraafin idea. Suunnattu syklitön graafi. Tietorakenteen serialisointi. Kysymys Assigment 2:n skel-tiedoston formaatista.
Tauko.
Suunnittelumalleista: näkymägraafi voidaan toteuttaa rekursiokooste -mallina. Mallikoodissa käytetään ainokainen -mallia. Luennolla mainittiin mm. visitor ja tehdasmetodi -mallit. Ohjelmointiuralla yksi seuraavia askeleita on tutustua suunnittelumalleihin, joiden nimet ja merkitykset oletetaan alan töissä tutuiksi.
Näkymägraafin läpikäynti, muunnostila ja matriisipino. OpenGL:n kutsut matriisilaskuina eli kehyksen muuntamisina. OpenGL:ssä on oma matriisipino. Syitä toteuttaa kuitenkin oma. Näkymägraafin rekursiivinen läpikäynti ja rekursion käynnistäminen juurisolmusta. C++:n osoittimet ja new-operaattori tulevat tässä vaiheessa käyttöön. Joitakin vinkkejä ja mallivastauksen osien vilautuksia Assignment 2:een.
Luento 15: tiea311_2019_lec15.pdf
Tätä luentoa seuraavana päivänä alkoi Instanssi 2019 -tapahtuma, jota oli syytä mainostaa. Sitten käytiin läpi keskustelukierros ja reflektiohommelit, kuten käytäntönä oli. (Muistanet kelailla ja nopeutella videoita soveltuvista paikoista! Kirjoitan tätä, kun katselen 4 vuoden jälkeen nauhoituksesta, ja huvituttaa, kun ei ole leikattu pois välipätkiä, joissa vain odoteltiin ryhmätöiden edistymistä... Ei mitään ongelmaa sinänsä, eikä näitä vaan silloin osannut ajatella, kun kaikki fokus oli luentosalin ihmisissä eikä videota katsovassa kotikatsomossa...) Joo... oli tässä videossa varmaan jotain asiajuttujakin... Niistä tähän nyt sitä synopsista.
Kovakoodatun kameran hahmottelu paperille. Vaiheittain tekeminen. Avustusta meneillään olevien demojen tekemiseen (raytracer). Perspektiivikamera aliluokkana kamerasta. Puolivalmiin koodin tutkiminen siten, että koodin toiminta jatkuvasti vastaa omaa mielikuvamallia. Juonipaljastuksia meneillään olevista harjoitustehtävistä. Piirtämisen, mielikuvamallin ja yksinkertaisten testitapausten tärkeys. Tärkeintä on pysyä kartalla. Tikun piirtäminen kahden pisteen väliin. Vahvoja juonipaljastuksia ohjelmointitehtävien suhteen. Spoilattiin, jee, ja eteenpäin. Tauon jälkeen uutta. Ja siinähän olikin sitten opettan perinteinen pöytäjumppa eli Forward Kinematics -esimerkki. Juttua käänteiskinematiikasta. ACM SIGGRAPH konferenssisarjasta ja muusta tutkimuksesta linkkejä. Päästiin siis lopulta asiaan: tiede, johon pääsee tutustumaan esimerkiksi kanditutkielmassa. Sitten seuraava osuus: Renderöinti eli kuvanmuodostus. Virtuaalinen kamera ottaa kuvan. Säteenheitto. Opettajan askartelema hehtopikselinäyttö havainnollistamaan säteenheittoa. Perusalgoritmi lähimmän leikkauspisteen löytämiseksi (ray cast + ray trace). Varjostaminen.
Luento 16: tiea311_2019_lec16.pdf
Lisää kuvanmuodostuksesta säteenseurannalla. Säteen esittäminen lähtöpisteen ja katselusuuntavektorin avulla. Historia 1500-luvulta alkaen. Neulansilmäkamera. Perspektiivi. Katkaistu näkymäpyramidi. Virtuaalinen kamera. Kameran kehys ja lookat(). Erilaisia tapoja heittää säteitä. Tauon jälkeen perspektiiviprojektio ja homogeeniset koordinaatit. Ja sitten leikkauspisteiden määrityksiä kohti: Säteen ja pinnan leikkauspiste.
Luento 17: tiea311_2019_lec17.pdf
Alussa aiempien (ja sittemmin opettajaksi muuttuneiden) kurssilaisten työnäytteitä ja luentoa edeltäneen Instanssi-tapahtuman tuotoksia. Kurssin käytänteiden toteuttamista, josta voi joko kelata yli tai toteuttaa kaverin kanssa simulaationa tänä päivänä. Uskomatonta, mikä rauha tässä luentotapahtumassa 2019 oli... hienoa, että se on nauhalla. Tapahtuuko tällaista enää.. voiko toistaa tällaista enää koskaan 2020-luvulla tai sen jälkeen? Yritetään, mutta saa nähdä, onnistuuko se...
Sitten mentiin asiaan, paremmin kuin edellisillä yrityksillä: Paikkausta edelliseen (säteen ja pinnan leikkaus). Jälleen kerran 4 vuoden jälkeen videotarkistusta tehdessä: mikä ihme rauha tässä vallitsikaan selittäessä auki sitä tärkeintä tai ainoaa opittavaa asiaa, eli "piirrä, laske ja varmistu itse".
Säteen ja pallon leikkaus. Todetaan, kuinka kurssin alussa esitietona varmistetulla matemaattisella osaamisella saadaan se ratkottua. Koodiesimerkki. Tauko, joka kannattaa aina pitää.
Tauon jälkeen: Säteen ja kolmion leikkaus. Painopistekoordinaatit ja niiden määrittäminen. Cramerin sääntö pikkumatriisin kääntöön ja toteutus C++:lla. Painopistekoordinaattien käyttö arvojen interpolointiin kolmion sisäpisteessä, esimerkiksi tekstuurikoordinaattien määrittämiseksi. Näkymägraafin toteutus olioilla perimällä yleinen 3D-esineluokka ja koostamalla puurakenne. Huomioita liukulukujen tarkkuudesta, välttämättömistä "epsiloneista" ja kompromisseista. Säteiden muuntaminen näkymäpuun läpikäynnin yhteydessä. Kertaus: pisteet, vektorit, koordinaatit. Normaalit. Normaalin muuntaminen yleisessä tapauksessa, jossa on mukana vääntö tai anisotrooppinen skaalaus. Ennakointia viimeisen luennon aiheista.
Luento 18: tiea311_2019_lec18.pdf
Puhetta aikatauluista ja niiden hallinnasta. Katsaus taaksepäin kurssiin: mitä on käsitelty tähän asti? Jäljellä enää varjostaminen. Yleiskuva valaistuksesta ja väreistä. Spektri. Hyperspektrikuvantaminen ja paikallinen tutkimus aiheesta. Valon lähde, heijastus, värisignaali ja sen havainnointi. Wikipedian käyttö jonkin asian muistuttamiseksi mieleen - esimerkkinä vaikka nyt silmän tappisolu (vai sauva; tarkista sieltä Wikipediasta itse esimerkin mukaisesti). Värisokeus ja käytettävyys. RGB-värikoodauksen idea. Ja havainto siitä, että värit ovat yksi helekkarin iso tutkimusalue itsessään, kuten kaikki muutkin osa-alueet tietokonegrafiikassa. Valaistusfunktiot ja huijaaminen. Kosinilaki perusteluineen. Sovellus spottivalojen ja vastaavien mallinnukseen. Kaksisuuntainen heijastusjakaumafunktio BRDF, mittaaminen ja simulointi. Matta ja peiliheijastus. Klassinen Phongin heijastusmalli. Esimerkkejä siitä, mitä muuta grafiikka ja grafiikkatyökalut ovat. Massive Software ja örkit taidenäyttelyssä. Pisteet, jouset ja kankaat. Hierarkkiset optimointitietorakenteet. Loppukeskustelu: Miten kurssilla kävi keväällä 2019? Vertaa omaan kokemukseesi tänään. Mahdollisten jatkokurssien nykyisestä tilanteesta kysy rohkeasti opintoneuvojalta ja opetussuunnitelmassa nimetyiltä vastuuopettajilta.
Luento 18 osuus väreistä: tiea311_2019_color_full.pdf
Vuonna 2018 näytettyjä kalvoja, jotka pudotettiin prioriteettisyistä 2019: tiea311_2019_dropped.pdf
MIT:n kalvosarjoista muita jänniä poimintoja, jotka ohitettiin paikallisella kurssillamme: tiea311_2019_montecarlo.pdf tiea311_2019_rasterization.pdf
(alkuperäisessä MIT OCW:n setissä on toki vielä paljon muuta...)