INF{3 4}320 - Obligatorisk oppgave 3

Like dokumenter
INF Obligatorisk oppgave 2

MAT-INF 1100: Obligatorisk oppgave 1

Om plotting. Knut Mørken. 31. oktober 2003

MAT-INF 1100: Obligatorisk oppgave 1

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

UNIVERSITETET I OSLO

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

MAT-INF 1100: Obligatorisk oppgave 1

Forelesning, 23.februar INF2400 Sampling II. Øyvind Ryan. Februar 2006

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Forelesning, 17.februar INF2400 Sampling II. Øyvind Ryan. Februar 2005

INF1510 Oblig #1. Kjetil Heen, februar 2016

INF Innleveringsoppgave 6

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Utførelse av programmer, metoder og synlighet av variabler i JSP

2 Om statiske variable/konstanter og statiske metoder.

Obligatorisk oppgave 4: Lege/Resept

UNIVERSITETET I OSLO

INF 2310 Digital bildebehandling

Innlevering 2b i INF2810, vår 2017

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

UNIVERSITETET I OSLO

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

Obligatorisk oppgave 1: Regneklynge

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

Kodetime for Nordstrand barneskole

Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

INF100 INNLEVERING 3 HØSTEN 2004

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

Oppgaver uke 1: Løsningsforslag

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Et større programeksempel. Hvordan løse et reelt problem med en objektorientert fremgangsmåte

Obligatorisk Innlevering 2

TDT4102 Prosedyreog objektorientert programmering Vår 2016

INF Ekstrainnlevering

Kanter, kanter, mange mangekanter

Fig1. Den konvekse innhyllinga av 100 tilfeldige punkter i planet (de samme som nyttes i oppgaven.)

INF Obligatorisk innlevering 5

Obligatorisk oppgave nr. 3 (av 4) i INF1000, våren 2006

Hvordan angripe en større oppgave? (og hva skal jeg gjøre i oblig 7!?)

Litt om Javas håndtering av tall MAT-INF 1100 høsten 2004

Obligatorisk oppgave 1 i INF 4130, høsten 2008

UNIVERSITETET I OSLO

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

Innlevering i FORK Matematikk forkurs OsloMet Obligatorisk innlevering 3 Innleveringsfrist Onsdag 14.november 2018 kl. 10:30 Antall oppgaver: 13

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Obligatorisk oppgave 1 INF1020 h2005

TEP 4160 AERODYNAMIKK. Program VortexLattice; brukerveiledning

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Et lite oppdrag i bakgrunnen

TMA4100 Matematikk 1 Høst 2014

MAT-INF 1100: Obligatorisk oppgave 1

Programmeringsspråket C Del 3

UNIVERSITETET I OSLO

INF 1040 Løsningsforslag til kapittel

Brukerkurs i Gauss feilforplantning

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Løsningsforslag øving 6

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Ingen. Elektronisk (WiseFlow) Robert Pettersen

Programmeringsspråket C Del 3

TDT4110 IT Grunnkurs Høst 2016

( x+ π 2) Bakgrunn: Sinus og cosinus. Bakgrunn: Samplet sinus i 1D. Bakgrunn: Samplet sinus i 2D. Bakgrunn: Sinus i 2D. sin( x)=cos.

Matematikk Øvingsoppgaver i numerikk leksjon 4 m-ler

Litt om Javas class-filer og byte-kode

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Oblig3Pi- en matematisk rettet obligatorisk oppgave nr. 3 (av 4) i INF1000 ett av to alternativer for oblig 3.

Generiske mekanismer i statisk typede programmeringsspråk

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Oppsummering Assemblerkode Hopp Multiplikasjon Kode og data Array Oppsummering

UNIVERSITETET I OSLO

INF januar 2018 Ukens temaer (Kap og i DIP)

MEK1100, vår Obligatorisk oppgave 1 av 2. Torsdag 28. februar 2019, klokken 14:30 i Devilry (devilry.ifi.uio.no).

Programmeringsspråket C Del 3

IN1010 V18, Obligatorisk oppgave 5

Programmeringsspråket C Del 3

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Lineærtransformasjoner

Obligatorisk oppgave 1

IN1010 V19, Obligatorisk oppgave 2

UNIVERSITETET I OSLO

Komplekse tall og komplekse funksjoner

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

INF Algoritmer og datastrukturer

INF1010 notat: Binærsøking og quicksort

INF februar 2017 Ukens temaer (Kap og i DIP)

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet. Obligatorisk innlevering 1 i emnet MAT111, høsten 2016

Litt om numerisk integrasjon og derivasjon og løsningsforslag til noen ekstraoppgaver MAT-INF 1100 uke 48 (22/11-26/11)

INF1020 Algoritmer og datastrukturer

DAFE ELFE Matematikk 1000 HIOA Obligatorisk innlevering 2 Innleveringsfrist Mandag 2. mars 2015 før forelesningen 10:30 Antall oppgaver: 17

INF100/INF100-F - INNLEVERING 2 HØSTEN 2005

x 2 + y 2 z 2 = c 2 x 2 + y 2 = c 2 z 2,

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse. INF 5110, 10/5-2011, Stein Krogdahl

Kapittel 1 En oversikt over C-språket

Transkript:

INF{3 4}320 - Obligatorisk oppgave 3 Innleveringsfrist: 14. oktober 2003 (Revisjon 25. september 2003) I denne oppgaven skal vi utvide koden som ble laget for oblig2. I stedet for å tegne en enkel kube med linjer skal vi tegne en teksturert og sjattert kube, og teksturen skal vi lage selv. 1 Prosedyral teksturering Å teksturere vil si å tilordne en farveverdi for hvert punkt på en flate. Man kan se på dette en funksjon som tar et punkt på flaten som argument og returnerer en farveverdi. Dette punktet på flaten er ofte enten parameterkoordinatene eller posisjonen til punktet i rommet, henholdsvis 2D- og 3D-teksturer. 3D-teksturer kalles ofte volumetriske teksturer fordi parameterområde er et volum. Ofte bruker man et bilde som klistres eller projiseres ned på flaten som tekstur. Teksturfunksjonen finner da hvilken pixel i bildet punktet på flaten tilsvarer og (efter eventuell filtrering) returnerer farveverdien til denne pixelen. I denne oppgaven skal vi se på teksturer som ikke er definert som bilder, men definert med en matematisk funksjon. Vi skal lage et sett med volumetriske teksturer over (x, y, z) [ 1, 1] [ 1, 1] [ 1, 1], det vil si over en kube med sidelengder lik 2 som er sentrert om origo. 1.1 RGB-kuben Vi starter å definere farvene til RGB-kuben som en volumetrisk tekstur. Idéen er å la x-koordinatet være mengden rødt i teksturen, y-koordinatet mengden grønt og så videre. RGB-kuben er definert når R, G, B [0, 1], mens x, y, z [ 1, 1]. Derfor må vi skalere og translatere posisjonen slik at rekkevidden til de to settene med koordinater sammenfaller. Dette gir ( x + 1 (r, g, b) = color_cube(x, y, z) =, 2 ) y + 1 2, z + 1, (1) 2 og en kube med denne teksturen kan sees på figur 1. 1

1.2 Støy og turbulens Figur 1: rgb-kuben Vi definerer altså teksturen som matematiske uttrykk av variabelene x, y og z. Det er mye man kan gjøre ved hjelp av vanlige matematiske operatorer, men problemet er at det teksturene blir ofte veldig strukturerte og følgelig er vanskelig å definere organiske og naturlige teksturer. Vi skal derfor introdusere en kvasi-støyog kvasi-turbulens-funksjon som gir oss muligheten til å introdusere uregelmessigheter i teksturen på en kontrollerbar måte. 1.2.1 Egenskaper I motsetning til en ekte støy-funksjon vil vi ha en funksjon som er båndbegrenset, amplitudebegrenset og repetérbar. Disse egenskapene gir oss den ønskede kontroll over støyen. I tillegg ønsker vi at støyen er minst mulig periodisk, slik at man ikke ser åpenbare strukturer, samt stasjonær og isotropisk, slik at støyens karakter ikke endrer seg med posisjon og retning. Det finnes mange varianter av Perlin-støy som oppfyller kriteriene i varierende grad. 1.2.2 Oppbygning Selv om vi skal bruke en 3D-versjon av støyen i oppgaven, bruker vi for enkelhets skyld 1D-versjonen for å forklare hvordan støyfunksjonen er bygget opp. 2

Støyfunksjonen består av en sum av lag, kalt oktaver. Hver oktav har mesteparten av energien i et veldig smalt frekvensbånd, og det er ved å velge ut hvilke oktaver vi vil bruke i summen vi kan båndbegrense den resulterende støyfunksjonen. Oktavfunksjonen All tilfeldigheten i støyen er bakt ned i en ordnet rekke V av N tilfeldige tall mellom 1 og 1, V = {v 0, v 1,..., v N 1 }. (2) Vi har altså tilordnet en tilfeldig verdi til hvert heltall fra 0 til N 1. For å utvide dette til å gjelde for alle heltall definerer vi ˆv i til å være ˆv i = v i%n, (3) hvor % er modulo-operatoren. Det betyr at rekken av tall gjentar seg selv for hvert N te tall, det vil si ˆv 0 = ˆv N = ˆv 2N =.... Ut ifra denne rekken har vi definert hva oktav-funksjonen er på hvert heltall. Så gjenstår det å definere hva oktav-funksjonen er mellom heltallene. Vi ønsker i alle fall at støyen er en kontinuerlig funksjon, gjerne med flere kontinuerlige deriverte. Ved å benytte en interpolasjonsfunksjon kan vi interpolere verdiene ved hvert heltall og slik definere en funksjon for alle reelle tall. For enkelhets skyld benytter vi her lineær interpolasjon (lerp), lerp(t, a, b) = (1 t)a + tb, (4) selv om den har diskontinuiteter i første deriverte. Et vanlig valg for interpolasjonsfunksjon er et kubisk polynom, så kan gi kontinuitet i både første- og andrederiverte. Vi har altså gitt x som er et reelt tall, og vi skal finne hvilket heltallsintervall dette tallet ligger i. Vi lar i(x) være intervallnummeret definert som det største heltallet som er mindre enn x. Vi er nå klare til å definere oktavfunksjonen, octave(x) = lerp ( x i(x), ˆv i(x), ˆv i(x)+1 ). (5) Støyfunksjonen Støyfunksjonen består av, som nevnt innledningsvis, en sum av oktaver. Vi skalerer hver oktav med 1/f, hvor f er hovedfrekvensen i oktaven, noise(x) = 1/f octave(x f), (6) f=1,2,4,...,g og g er maksimumsfrekvensen. Frekvensen f løper altså fra 1 og dobler verdien sin til den når g. 3

Figur 2: Tretekstur Turbulensfunksjonen Vi introduserer også en turbulensfunksjon. Den har samme oppbygning som støyfunksjonen, men istedenfor å summere hver oktav så summerer vi absoluttverdien til oktavene, turbulence(x) = 1/f octave(x f). (7) f=1,2,4,...,g Denne funksjonen blir åpenbart ikke negativ, og ligger i hovedsak i området [0, 2]. Absoluttverdiene introduserer noen diskontinuiteter i den førstederiverte, og det resulterer i at funksjonen ser mer sky-aktig ut. 1.3 Treverk Vi skal bruke radien r fra z-aksen som utgangspunkt for treteksturen. Vi vil at årringene skal være tykkest inni og tynnere jo lengre ut man kommer, derfor kvadrer vi r. Vi lar én årring være intervallet mellom to heltall. For å justere tykkelsen (og implisitt antallet årringer pr. areal) multipliserer vi r 2 med en passelig konstant før vi sjekker hvilket heltallsintervall radien ligger innenfor. Teksturen slik som den er beskrevet hittil ser utrolig strukturert og unaturlig ut. For å gjøre den mer organisk, perturberer vi radien med litt støy. Uttrykket vi får blir da, r 2 (x, y, z) = 15(x 2 + y 2 ) + 1.7noise(x, y, z). (8) 4

Figur 3: Marmortekstur Vi bruker i(x) til å finne det største heltallet som er mindre enn x. Vi lar årringene alternere mellom en gulfarve og en brunfarve og får da uttrykket { ( 1 wood(x, y, z) = (, 1, 1 2 2 10) ) hvis i(r 2 (x, y, z))%2 = 0 1, 1, 1 hvis i(r 2 (x, y, z))%2 = 1. 2 Resultatet av denne teksturen kan sees på figur 2. (9) 1.4 Marmor Til slutt skal vi lage en marmor-lignende tekstur ved hjelp av turbulensfunksjonen. Vi drar koordinatene i x og y retning litt for skape en retning i materialet. Utifra dette definerer vi marble(x, y, z) = ( Resultatet av denne teksturen kan sees på figur 3. sin(0.45 turbulence(3x/2, 2y, z)), sin(1.00 turbulence(3x/2, 2y, z)), sin(0.55 turbulence(3x/2, 2y, z)) ) (10) 2 Oppgaven Vi skal som sagt lage en teksturert kube. OpenGL støtter ikke prosedyrale teksturer per se (men det kan implementeres i fragmentshadere), så vi må sample 5

teksturen og lagre teksturene som bilder i minnet. Vi lager et bilde for hver firkant, altså totalt seks bilder. For å vite hvor sample-punktene skal være, så må vi definere kuben vi skal klistre teksturene på. Først definerer vi de 8 hjørnenepunktene, GLfloat cube_vertices[3*8] = { -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0 }; Så definerer vi firkantene. Disse er definert som indekser inn i arrayet med hjørnepunkter cube_vertices, GLuint cube_indices[] = { 0, 3, 2, 1, 1, 2, 6, 5, 5, 6, 7, 4, 4, 7, 3, 0, 0, 1, 5, 4, 2, 3, 7, 6 }; Hver av firkantene skal må ha en normalvektor som brukes for lyssetting, GLfloat cube_normals[] = { 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0 }; Og vi bruker samme sett med teksturkoordinater for hver av flatene, GLfloat cube_texture_coords[] = { 0.0, 0.0, 0.0, 1.0, 6

}; 1.0, 1.0, 1.0, 0.0 For å finne x, y, z-koordinatene til en pixel i en tekstur bruker vi følgende programsnutt float texture_mem[texture_size][texture_size][3]; for(t=0; t<6; t++) { /* for hver tekstur */ for(j=0; j<texture_size; j++) { /* for hver linje */ for(i=0; i<texture_size; i++) { float u, v; float P[3], C[4], B[4]; /* finn tekstur-koordinater */ u = (float)i/((float)texture_size-1.0); v = (float)j/((float)texture_size-1.0); /* bi-lineaere basisfunksjoner */ B[0] = (1.0-u)*(1.0-v); B[1] = (1.0-u)*v; B[2] = u*v; B[3] = u*(1.0-v); for(k=0; k<3; k++) { P[k] = 0.0; /* bi-lineaer interpolasjon av * de fire hjørnene av firkanten */ for(r=0; r<4; r++) { int ix = 3*cube_indices[4*t+r]+k; P[k] += B[r]*cube_vertices[ix]; } /* P inneholder x,y,z-koordinatene */ texture(c,p); /* C inneholder farven */ for(r=0; r<3; r++) texture_mem[j][i][r] = 255.0*C[r]; } } } /* load texture_mem to OpenGL etc. */ 7

} Programmet skal kunne lage minst tre teksturer, hvor minst én av teksturene skal bruke støy og eller turbulensfunksjonen. Programmet skal ta ett argument, et heltall, som spesifiserer hvilken tekstur som skal brukes. Hvis programmet kalles uten argumenter skal det skrives ut hvilke verdier argumentet kan ha, og programmet skal avslutte. Teksturen skal visualiseres med en teksturert kube som er lyssatt med minst én lysskilde. Koden fra forrige oblig for å rotere kuben skal også benyttes. I tillegg er det et krav at en perspektivprojeksjon benyttes. 3 Innlevering Oppgaven er individuell og alle skal programmere hvert sitt program, dog er det lov til å samarbeide, men dette skal presiseres i så fall. Programmet skal være programmert i enten C eller C++ og visualiseringen skal gjøres i OpenGL. Utover dette står man fritt til å velge om man vil bruke glut, Qt eller et annet vindusbibliotek. Dokumentasjon av oppgaven gjøres ved at kildekoden kommenteres. Innlevering av oppgaven består i at man sender en epost til gruppelærer med et tar-arkiv som heter brukernavn3.tar.gz hvor brukernavn er brukernavnet ditt. Arkivet skal inneholde fullstendig kildekode, men ikke kompilerte objekt (*.o)-filer (kjør make clean før du lager arkivet). Hvis det er noen spørsmål eller kommentarer angående oppgaven kan disse rettes til gruppelærer enten på gruppeøvningene eller pr. epost. Lykke til! 8