TIEA311 - Tietokonegrafiikan perusteet - kevät 2019

Tällä sivulla ilmoitetaan kevään 2019 kurssin yksityiskohdat sitä mukaa kuin ne kurssin aikana muovautuvat:

Aikataulut ja hallinnolliset kuviot ovat kurssin Korppi-sivulla. Kurssin etenemisestä tiedotetaan sähköpostilistalla tiea311_kevat2019@korppi.jyu.fi, jonka viestit jäävät Korppiin julkiseen arkistoon.

Kurssimateriaalin kehitysversio on avoimessa git-repositoriossa (päivittyy koko kevään kurssin ajan). Luentovideot tulevat, jos tallennustekniikka toimii kunkin luennon kohdalla, Moniviestimeen kurssin kansioon, jonka salainen polkuavain toimitetaan vain kurssia suorittaville opiskelijoille.

Tänä vuonna uutta ja kokeellista suomenkielistä lisämateriaalia TIM-sivulla: https://tim.jyu.fi/view/users/nieminen/kokeiluja/grafiikan-perusteita


Vertaistukikanavat

Sähköpostilista tiea311_kevat2019_keskustelu@korppi.jyu.fi on kurssin virallinen ja Jyväskylän yliopiston tukema kanava vertaistukea eli vinkkien pyytämistä ja antamista varten! Se arkistoituu Korppiin, mutta vain listan jäsenille. Ei tarvitse siis jännittää saavansa kummempaa julkisuutta keskustelulistan kautta :). Kaikki kysymykset ja vastaukset sinne vaan, antaa palaa!!

Ideoita ja keskustelua muista (epävirallisista) vertaistukikanavista voi heittää tuonne mainitulle listalle. Monissa (esim. Whatsapp, Slack, IRC, ...) on se probleemi, että kaikkia ei vaan saa liittymään niihin millään ilvellä, joten osa porukkaa jää katveeseen.


Pakolliset ja arvioitavat suoritteet

Teknisesti vaaditaan seuraavat pakolliset suoritteet:


Aikataulutus ja ohjaustarjonta

Opiskelijalle tarjotaan kolme vaihtoehtoista suoritusmoodia tai "trackia". Mieti tarkkaan, mikä soveltuu itsellesi kokonaisuuden kannalta parhaiten:

Vaihtoehto 1/3: "Fast-track"

Suoritus viime vuoden kurssin mukaisesti omaan tahtiin, mutta nopeammin kuin tämä kurssikerta etenee tai omasta mielestäsi "matelee". Deadline kaikille tehtäville on 10.2.2019. Tässä tapauksessa on suositeltavaa siirtyä seuraamaan viime vuoden materiaalia kokonaisuudessaan eli käydä kurssi kokonaan viime vuoden mukaisesti. Ohjausta ei tarjota, koska uusi kurssi etenee omaan, hitaampaan, tahtiinsa. Jos kuitenkin olet varma, että homma hoituu itsenäisesti, niin emmepä estele.

Fast-track soveltuu, jos asia sattuu olemaan esimerkiksi harrastusten kautta hanskassa jo aiemmin. Kaikki tehtävät palautetaan kerralla. Palauttamisen ajankohdasta ja palautustavasta sovitaan ennakkoon vastuuopettajan kanssa, ja palautuksen yhteydessä keskustellaan vastauskoodiin liittyvistä yksityiskohdista kasvotusten - täten opettaja varmistuu kontrollikysymysten kautta siitä, että opiskelija on itse tehnyt vastauksensa. Sanottakoon tätä vaikkapa "suulliseksi kuulusteluksi". Oletettavaa on, että fast-trackissä onnistuneiden kanssa keskustelu lipeää kuitenkin "kuulustelun" sijasta nopeasti niihin töihin, harrastuksiin tai muihin kokemuksiin, joiden kautta osaaminen on aiemmin muodostunut.

Jos Fast-track ei yrityksestä huolimatta onnistukaan, voit siirtyä Deadline-trackiin palauttamalla 10.2.2019 mennessä normaalin Deadline-trackin mukaisen T1-palautuksen (ks. alla)

Vaihtoehto 2/3: "Deadline-track"

Normaali, suositeltava, suoritustapa: seuraile tämän vuoden luentoja ja niihin nivellettyjä demoja aktiivisesti. Ohjaus tarjotaan tämän suoritustavan mukaisesti. Kurssin etenemistahtia tai demojen vaatimuksia voidaan skaalata tarvittaessa dynaamisesti sen mukaan, miltä tilanne näyttää tämän kurssikerran aktiivisten suorittajien ja tehtäviä deadlineihin mennessä palauttaneiden kohdalla. Kaikkien tehtävien tiukka deadline on opetusperiodin loppu eli 10.3.2019.

Tämä suoritustapa soveltuu HOPSin mukaiseen tekemiseen, jossa tämä kurssi aktuaalisesti päättyy ja seuraavan periodin kurssit alkavat lukuvuoden aikataulutuksen mukaisesti. Mikroluokkaohjauksissa pusketaan demot läpi vähintään 1/5 -tasolla kädestä pitäen (edellyttäen tietysti riittävän määrän omaakin toimintaa ohjausten välillä; kurssi on mitoitettu 135 tunnin laajuiseksi ja ohjausta voidaan tarjota kuitenkin yhteensä vain joitain kymmeniä tunteja). Suoritustavalla ja kohtuullisella viikottaisella panostuksella voi melko suurella varmuudella kuitata kurssin 5 opintopistettä ennalta tunnetun aikataulun mukaisesti ja mittauttaa arvosanalla kyvykkyytensä suhteessa muihin samanaikaisiin suorittajiin.

Vaihtoehto 3/3: "Undeadline-track"

Keväällä 2019 tapahtunutta kurssia voi suorittaa omaan tahtiin seuraavan kurssitoteutuksen alkamiseen asti eli käytännössä mitä todennäköisimmin kalenterivuoden 2019 ajan. Ohjausta ei tarjota enää 10.3.2019 jälkeen, koska tämä kurssi ei ole opettajien työsuunnitelmassa muina aikoina. Kaikki tehtävät palautetaan kerralla sitten, kun on omasta mielestä valmista. Palauttamisen ajankohdasta sovitaan vastuuopettajan kanssa sitten, kun tehtävät ovat omasta mielestä valmiit, ja palautuksen yhteydessä keskustellaan vastauskoodiin liittyvistä yksityiskohdista kasvotusten - täten opettaja varmistuu kontrollikysymysten kautta siitä, että opiskelija on itse tehnyt vastauksensa ja että ne vastaavat ominaisuuksiltaan itsearviota.

Tämä suoritustapa voi onnistua, jos opiskelijalla on aiemmin kehittynyttä tai varsin pikaisesti syntyvää kykyä itsenäiseen tiedonhankintaan ja ajanhallintaan. Jos koet itselläsi yhtään puutteita mainituissa kyvyissä, on syytä yrittää mieluummin ensisijaisesti Deadline-trackiä.

Deadline-trackistä voi siirtyä Undeadline-trackiin 10.3.2019, mikäli muut kurssit/asiat elämässä ajoivat ohi prioriteeteissa Deadline-trackin suhteen alkukeväästä 2019. Se kuitenkin tarkoittaa, että täytyy löytyä tai noin kalenterivuoden aikana kehittää itselleen edellisessä tekstikappaleessa mainittua kykyä itsenäiseen tiedonhankintaan ja ajanhallintaan.


Demot

Linkki tehtäväohjeisiin: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-837-computer-graphics-fall-2012/assignments/

Omat pohjakoodimme vuodelle 2019:

HUOM 1: Yllä mainituissa paketeissa ei ainakaan vielä ole käännettyjä mallivastauksia. Niitä voi kokeilla alkuperäisistä paketeista. Voitte myös muistuttaa luennolla, että katsottaisiin livenä, miten Windowsille käännetyt mallivastaukset toimivat.

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.

T1: Assignment 0 ja Assignment 4 aloitus

Deadline: ke 30.1.2019 (3 kalenteriviikkoa kurssin aloitusluennosta; viivästyi "Moodle-kouluttautumisteknisistä syistä")

Palautustapa (kokeellinen; katsotaan miten toimii käytännössä):

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.

T2: Assignment 1

Deadline: to 21.2.2019 (3 kalenteriviikkoa edellisestä deadlinesta)

Palautustapa:

Vaatimukset:

T3: Assignment 2 ja Assignment 4 jatko

Deadline: pe 1.3.2019 (n. 1 viikko edellisestä deadlinesta, ts. lyhyt välipala!!)

Palautustapa: (olennaisesti sama kuin aiemmin)

Vaatimukset:

T4: Assignment 4

Deadline: ma 11.3.2018 (kevään 1. opetusperiodin loppu). Ohjauksen osalta kioski menee edeltävänä perjantaina kiinni, koska opettajien on siirryttävä kevään 2. periodin kursseja 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)

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.


Kevään 2019 luennot

Kurssille ilmoittautuneet voivat katsoa luennot Moniviestimestä kurssin hakemistosta. Polkuavaimen saa opettajalta, jos on päässyt unohtumaan.

Tähän kertyy kevään aikana linkit luentojen kalvosarjoihin:

Luento 1: tiea311_2019_lec01.pdf Paikalliset alkuinfot. Aloitus- ja tähtäyspisteitä. Tärkeimpien voimatyökalujen esittely. Luentovideosta valitettavasti leikattiin kuulemma tekijänoikeussyistä YouTube-pätkät pois. Puolen tunnin kohdalla katsottiin otteita näistä: Viime vuoden Assignment 1 -vastaus "hieman" jatkokehitettynä, viime vuoden Instanssin pikkiriikkisten kisaa.

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.

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

Synopsis tulee, kun ehdin tarkastaa videon

Luento 16: tiea311_2019_lec16.pdf

Synopsis tulee, kun ehdin tarkastaa videon

Luento 17: tiea311_2019_lec17.pdf

Synopsis tulee, kun ehdin tarkastaa videon

Luento 18: tiea311_2019_lec18.pdf

Synopsis tulee, kun ehdin tarkastaa videon

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...)


Ja sitten jotain aivan muuta eli ekalla Google-haulla löytynyt kello luentotyökaluksi:

See the Pen Stopwatch (JavaScript) by Billy Brown (@_Billy_Brown) on CodePen.

(by Billy Brown; link to source).