Høsten 2001 startet Anders Rindal, Arne Magnus Bakke og Ståle Kopperud prosessen som skulle munne ut i et hovedprosjekt våren etter. Etter grundig konsultasjon kom vi frem til at dette kun var en av oppgavene som tiltalte oss.
Oppgavedefinisjon / problem / avgrensning
Prosjektorganisering
Han vil ha ansvar for å innkalle til møter, fungere som kontaktperson for gruppen i forhold til oppdragsgiver/veileder og holde gruppen oppdatert og motivert. Dersom dette ikke er mulig, må den enkelte gi beskjed om dette i relativt god tid, slik at det blir mulig for gruppen å løse oppgaven sammen.
Målgruppe, rapport og oppgave / produkt
Alle deltakere er bevisst det ansvaret hver enkelt har både for seg selv og for resten av gruppen i løpet av prosjektet. Problemstillingen i denne oppgaven vil være mer knyttet til et forskningsprosjekt i motsetning til mange andre typer prosjekter.
Formål / hvorfor dette emnet
Egen bakgrunn og kompetanse. Hva må læres
Det er også med på å definere målgruppen som vil ha mest nytte av produktet og dets funksjonalitet. Dette vil være vesentlig for prosjektets suksess, og er også med på å påvirke valget av utviklingsmodellen vi skal følge.
Utviklingsmodell
Kollektivt eierskap til kode: Koden som skrives må kunne redigeres av alle personer i utviklingsteamet. I samarbeid med oppdragsgiver og veileder utarbeider vi brukerhistorier og utvikler deretter tidsanslag som danner utgangspunkt for en utgivelsesplan.
Arbeidsformer
Parprogrammering: All programmering bør gjøres i par, den ene skriver koden, mens den andre gjør strategiske vurderinger for neste del av koden som skal lages og verifiserer koden som skrives. For å sikre at alle holder seg motiverte og oppdatert på prosjektets fremgang, prøver vi vårt beste for å møte Extreme Programmings krav til delt eierskap av kode.
Organisering av rapporten
Vi har forsøkt å utnytte disse forslagene, da de er et resultat av andres erfaring med hva som er lønnsomt i andre utviklingsprosjekter av tilsvarende karakter. Månedlige statusmøter inkluderer detaljerte beskrivelser av hva som ble fullført og hva som ville være viktig i fremtiden.
Rapportlayout
Senteret skal kunne velges av brukeren eller beregnes av programmet ut fra plasseringen av punktene. Segmentets maksimale punkter skal kunne flyttes og alle punkter i segmentet skal skaleres i forhold til radius.
Java3D vs OpenGL - Utdypning av analysefasen
Et gruppemedlem foreslo å utforske muligheten for å bruke OpenGL i tillegg til Java. JNI ville komplisere modulariseringen av produktet, og det var ingen ekstreme ytelsesforskjeller mellom de to løsningene.
Kildekode / kommentering
Versjonshåndtering
Web
Katalogstrukturen og sikkerhetskopifilene er navngitt med en dato for å unngå misforståelser om hvilken som er den nyeste versjonen. Lenker til andre programvarepakker som vi bruker og som er nødvendige for å kjøre applikasjonen.
Plattformuavhengighet
Vi har valgt en person i gruppen til å ha ansvar for å oppdatere og utforme nettsiden for å unngå konflikter på denne måten. På denne måten klarer vi å håndtere flere ulike bilder og 3D-visninger samtidig, og brukeren får større fleksibilitet i arbeidet sitt.
Layout, style, fonter
- Generelt
- Vinduene
- Ikoner
- Fonter
For å endre innstillinger på en 3D-modell (n), må du først aktivere dette vinduet slik at kontrollpanelet vet hvilket vindu (n) som skal jobbes med. Hvis du lukker 3D-modellen og den er borte (ikke fra samme eller andre økter), lukkes også kontrollpanelet automatisk.
Fargerom
Struktur
Aksesystem
Det er imidlertid viktig at den kun lagrer bildet og ikke har informasjon om bevegelsene som gjøres i 3D (det endelige resultatet av pikselverdiene, men ikke posisjonen som for øyeblikket finnes på 3D-lerretet). Funksjonen henter originalbildet og fjerner all informasjon om hva som ble gjort før.
Dynamisk klasseloading og modularitet
Generelt
Her snakker vi om filnavn, filtype, størrelse på bildet, men også om fargerom og fargedybde. Dette er mer eller mindre en sammenstilling av informasjon som kommer inn når bildet lastes og vil ikke endres under kjøringen av programmet.
Virkemåte
Det er her du lagrer bildet når du er ferdig med å redigere eller vil fortsette senere. Det samme gjelder hvis du ønsker å fjerne en funksjonalitet; fjern klassen fra riktig katalog og programmet vil ikke gi den gitte funksjonaliteten neste gang det startes. Hvis nye klasser legges til mens programmet kjører, vil de ikke være tilgjengelige før applikasjonen lukkes og startes på nytt.
Struktur
Interaksjoner
Globale transformasjoner
De oppfører seg på samme måte som om et punkt ble flyttet med konstant høydebegrensning på, dvs. med konstant L. Derfor beveger de seg med en felles vektor, som beregnes ut fra forskyvningen i forhold til L-aksen. Tilten er nyttig hvis det hvite punktet in image ikke er på rett plass i forhold til svart, vil det være viktig å vippe alle objektene slik at du kan endre dette.
Visualiseringer
Den deler punktene på midten av L-aksen (L=50), slik at de over midten går mot maks L og de under mot min L. Forskjellen er generelt at her finner man ikke en felles vektor , men hold separate vektorer A og B. Resultatet er at hvis brukeren flytter det valgte objektet bort fra L-aksen i +A-retningen, vil alle objekter strekke seg bort fra L-aksen i +A- eller -A-retningen avhengig av hvilken side av LB-planet de er på. i.
Visualiseringer og interaksjoner - en studie i samhandling
Målet er at interaksjonene ikke skal ta hensyn til hvilken visualisering som er i bruk, så lenge scenestrukturen støtter de operasjonene som er nødvendige for å flytte objektene på ønsket måte. Dette betyr at en interaksjon basert på for eksempel interpolering av tetraederinndelingen ikke er avhengig av en spesifikk visualisering, men krever kun at visualiseringen i bruk har skapt objekter med ønsket tetraederinndeling. Visualiseringen som bygger strukturen avgjør hvordan operasjonen skal utføres, for eksempel om endring av posisjonen til et objekt skal føre til at koordinatene til flere trekanter flyttes, eller om det er midten av en kule som skal flyttes.
Begrensninger
Utstyrsgamut
- Java
- Java3D
- JAI - Java Advanced Imaging
- JMF - Java Media Framework
Dette ble løst med utgivelsen av JavaVM (Java Virtual Machine) eller kjøretidsmiljø for nesten alle plattformer som er tilgjengelige i dag. Alle Java-programmer kjører på denne VM og trenger derfor ikke å rekompileres fra plattform til plattform. 2Merk: Dette er basert på vår erfaring og testing, og vi har ikke funnet noen dokumentasjon fra verken BlackDown eller andre på at dette er et generelt problem.
Plattformer
- Microsoft Windows
- Linux
- Apple Macintosh
- Foretrukket system
Dette er absolutt noe ingen ønsker å oppleve og det kan virke som at problemet har blitt mindre med Java2 1.4.0, XFree 4.2.0 og bruk av direkte gjengivelse i X. Andre problemer er at noen av de såkalte Windows Ledere på Linux (det betyr WindowMaker, KDE, Sawfish, Enlightenment, Afterstep, etc.) har en tendens til å få informasjon om vinduer på forskjellige måter. Vi har riktignok ikke testet ICC3D på andre Unix-varianter (vi har ikke hatt tilgang til slike maskiner), og det er grunn til å tro at programmet vil kjøre tilfredsstillende på SUNs eget Solaris-system.
Fargerom
- Generelt
- Utvidelse
- Konvertering av fargeverdier
- Formler / kode for konvertering
- sRGB sRGB
- sRGB CIEXYZ
- CIEXYZ sRGB
- Lab sRGB
- Lab CIEXYZ
- CIEXYZ Lab
- CIEXYZ sRGB
- XYZ CIEXYZ
- CIEXYZ XYZ
Konverteringen til og fra de forskjellige fargerommene implementeres av funksjonene public abstract float[] toCIEXYZ(float color[]);. Disse funksjonene vil deretter konvertere til og fra CIEXYZ med funksjonene toCIEXYZ(..) og fromCIEXYZ(..) for henholdsvis srgb og lab. Konverteringen fra sRGB til sRGB vil være for å sikre at RGB-verdiene ligger i riktig intervall: 00 RGB 10.
Oppbygning av 3D struktur
Generelt
Når det gjelder oppdatering av selve bildet, har vi gjort vårt beste for å få det til å skje så raskt som mulig. Det er verdt å merke seg at kun pikslene som er endret oppdateres i bildet. Et Canvas 3D-objekt har fått direkte tilgang til informasjon i et enkelt image2D-objekt, og å oppdatere et image2D-objekt blir en fornuftig sak.
Struktur
Implementasjon
Parsere
Generelt
Filformater
- IT8.7/2 - Parser.Java
- Regulært - Parser2.Java
- ICC profiler - IccReader.Java
Oppgaven til denne og de tilhørende filene er å trekke ut gamutdata fra ICC-profiler hvis dette er tilgjengelig i den aktuelle ICC-filen. Alle ICC-profiler vil ikke inneholde gamutdata, og det vil derfor ikke være mulig å trekke ut relevante data. Dette betyr at du vil spare mye behandlingstid ved først å slå opp i tag-tabellen før du leser data, da mange ICC-profiler vil være veldig store og kompliserte.
Eksportering av data
Tag-tabellen vil fungere som en innholdsfortegnelse for en gitt profil, og det er her du finner plasseringen av relevante data i profilen.
Forandring av posisjon og zoom i 3D
Visning av aksesystemer i 3D
Visualiseringer
- Standard
- Kvantisert
- Segment maxima
- Algoritmen
- Unøyaktighet
- Problemer
- Interpolering
- Implementasjon
- Convex Hull (3D)
- Alpha Shapes
- Delaunaytriangulering i 3D (ved flipmetoden)
- Delaunaytriangulering i 3D (via convex hull i 4D) . 67
Det er imidlertid noen tilfeller der store kuler dekker mindre kuler som er i nærheten, noe som ikke er heldig. Hvis punktene er plassert inne i alle hyperplanene, kan punktet forkastes da det ikke er en del av overflaten til det konvekse skroget. En punktliste indikerer at disse punktene er på utsiden av overflaten, og dermed vil ikke overflaten være en del av det konvekse skroget.
Generell posisjon
Interaksjoner
- Interaksjoner generelt
- Standard interaksjon
- Segmentinteraksjon
- Tetraederinterpolasjon
Vi inverterer så denne for å finne den motsatte transformasjonen, og bruker deretter denne matrisen til å beregne hvor 4 imaginære objekter befinner seg. Pikslene som endres vil endre seg for mye sammenlignet med pikslene som er i nærheten. Denne interpolasjonen krever å dele opp rommet i tetraeder, samt å beregne vektene som brukes for å finne ut hvor mye en endring i hjørnepunktet endrer punktene inne i tetraederet.
Globale transformasjoner
Når brukeren prøver å flytte et objekt, blir alle tetraedrene som har objektet som et toppunkt funnet. For å rotere om en vilkårlig akse, gjør man først en translasjon slik at spissen er i origo. Så gjør du det hele i motsatt rekkefølge, så du gjør om alle operasjonene med unntak av den ene rotasjonen.
Begrensninger
Capture
Rotasjonene og translasjonene som er lagt inn i den gjeldende oppgaven vil da bli utført som en operasjon på det angitte antallet bilder. Selve videokodingen overlates til en klasse som er i stand til å lage filmer fra alle typer bildedata. Koderen er i stand til å støtte komprimeringsalgoritmene installert på datamaskinen der den kjører, slik at den for eksempel kan lage videoer i DivX-format.
Generell optimalisering av kode
Selve køen er begrenset i størrelse for å unngå store minnekrav, og håndteringen er synkronisert slik at kun én tråd får tilgang til køen om gangen. Hvis koderen er ferdig med de gitte dataene og køen er tom, vil den vente på flere bilder eller eventuelt andre ting som vi har valgt, selv om gevinsten som sagt ikke er stor, bruk av logiske operasjoner der det er hensiktsmessig har bevist.
Installasjon
Windows
I menyen som da kommer opp kan brukeren velge å installere Java, Java3D, JMF, JAI, og hovedprogrammet. Derfor var det naturlig å forberede produktet for nettbasert distribusjon slik at det ble automatisert. Dette ble gjort ved hjelp av PackageForTheWeb, som lar brukeren pakke filer til en kjørbar fil.
Linux (x86)
Selve GUI-en er mer eller mindre lik den i Windows-versjonen, men likheten slutter der. Java-pakkene for Linux har som sagt ikke et spesielt brukervennlig installasjonsprogram, så det var her vi måtte endre litt. Ved å omdirigere utdataene som faktisk går til terminalvinduet til en tekstvisning, og gi to knapper valget om brukeren godtar Suns lisensavtale eller ikke, har vi klart å lage nærmest et grafisk installasjonsprogram for Java-pakkene å lage.
InstallAnywhere
For å ende opp med et stabilt produkt som oppfører seg som forventet, er det viktig at du utfører testing og kvalitetssikring gjennom hele utviklingsprosessen. Kravet om at du alltid fokuserer på et enkelt design, så lenge som mulig, reduserer muligheten for at deler av programmets kode kan bli tungvint etter hvert som applikasjonen utvides. I utviklingsfasen brukte vi mange andre tester som ble lagt til koden, som sørget for at vi fikk meldinger dersom det oppsto uventede situasjoner.
Backup
Maskin nummer to sto på Sørbyen Studenthjem, hvor koden kopieres over skolens eget nettverk (selv om IT-avdelingen nesten klarte å forhindre det også). Den siste maskinen som inneholdt koden var en utvikler som var på skolen hele tiden mens han jobbet. Når koden ble kopiert til andre maskiner varierte avhengig av hvor mye som ble gjort, men mellom utviklermaskinen og den bærbare datamaskinen ble koden kopiert flere ganger om dagen.
Kritikk av oppgaven
Videre arbeid, nye (hoved)prosjekter
Evaluering av gruppens arbeid
- Innledning
- Organisering
- Fordeling av arbeidet
- Prosjekt som arbeidsform
- Subjektiv opplevelse av hovedprosjektet
Når det gjelder gruppen vår skal det sies at vi jobbet veldig godt sammen. Vi har hatt våre problemer, men dette var kun knyttet til selve oppgaven og hvordan et problem skulle/bør løses. Vi ble introdusert for nye arbeidsmetoder, men også for et felt som var helt ukjent for oss.
Utviklingsmodellen XP, eXtreme Programming
ICC3D og alle dets vinduer
Tittel i “2D Image” vinduet
Tittel i hovedvinduet til ICC3D
Dynamisk lasting av plugins
Eksempel på et BranchGroup subtre
Eksempel på et “virtuelt univers”
Kontrollpanel og valg tilknyttet fargerom
Konvertering av fra sRGB til CIEXYZ fargerom
Konvertering fra CIEXYZ til sRGB fargerom
Arvehierarki for visualiseringer
Kontrollpanel og valg tilknyttet gamut for IT7.8/2 formatet
Kontrollpanel og valg tilknyttet regulært filformat
Kontrollpanel og valg tilknyttet ICC profiler
Organiseringen i en ICC profil
Kontrollpanel og valg tilknyttet synsvinkel
Kontrollpanel og valg tilknyttet visualiseringer
Standard visualisering
Kvantisert visualisering
Segment maxima oppdeling
Segment maxima visualisering
Convex hull visualisering
Alpha shapes visualisering. Øverst: stor alphaverdi. Nederst: liten al-
Kontrollpanel og valg tilknyttet constraints/begrensninger
Arvehierarki for fargerom
Arvehierarki for klasser som lastes dynamisk
Funksjonsoppbygning av 3d struktur
Arvehierarki for transformasjoner
Arvehierarki for begrensninger