ADD 1.1
18 mars, 2003
Mobile3D
Författare och projektmedlemmar:
Anders Samuelsson
Erik Tigerholm
Gunnar Höyland
Mario Fredriksson
Mats Svensson
Mikael Olsson
Rickard Strand
Robin Dyer
Stefan Wikell
MM & M
Mini Me and Me
Sammanfattning
Projektgruppen Mini Me and Me har för avsikt att utveckla ett
funktionabellt 3D-modellerande program för mobila handdatorer.
Mobile3D ADD 1.0 är ett dokument fyllt med fakta om hur detta
program ska implementeras, vilka krav som ställs på mjukvaran,
beskriver programmets komponenter och i vilken ordning dessa bör
implementeras.
1
2
3
4
5
Introduktion .................................................................................................................. 7
1.1 Syfte..................................................................................................................... 7
1.2 Kort beskrivning av produkten ............................................................................ 7
1.3 Definitioner och förkortningar ............................................................................ 7
1.4 Referenser ............................................................................................................ 9
1.4.1 Böcker ..................................................................................................... 9
1.4.2 Webbsidor ............................................................................................. 10
1.5 Överblick över dokumentet ............................................................................... 10
System översikt .......................................................................................................... 13
2.1 System design .................................................................................................... 13
System innehåll .......................................................................................................... 14
3.1 Externa gränssnitt .............................................................................................. 14
3.1.1 Exportering ........................................................................................... 14
3.1.2 Konvertering ......................................................................................... 14
System design ............................................................................................................. 15
4.1 Design metoder.................................................................................................. 15
4.1.1 Klass diagram ....................................................................................... 15
4.1.2 Sekvens diagram .................................................................................. 15
4.1.3 MVC .................................................................................................... 15
4.2 Beskrivning av enskilda komponenter .............................................................. 16
4.2.1 GraphicalObject ................................................................................... 17
4.2.2 UserCommand ..................................................................................... 17
4.2.3 Controller ............................................................................................. 17
4.2.4 ToolbarHandler .................................................................................... 17
4.2.5 Renderer ............................................................................................... 18
4.2.6 View ..................................................................................................... 18
4.2.7 Camera ................................................................................................. 18
4.2.8 DataModel ............................................................................................ 19
4.3 Spara till ett internt filformat ............................................................................. 19
4.3.1 Specifikation för Mobile3D Format (M3F) ......................................... 20
Komponentbeskrivning .............................................................................................. 23
5.1 Mobile3DMain .................................................................................................. 23
5.1.1 Typ ....................................................................................................... 23
5.1.2 Syfte ..................................................................................................... 23
5.1.3 Funktion ............................................................................................... 23
5.1.4 Delkoponenter ...................................................................................... 23
5.1.5 Beroenden ............................................................................................ 24
5.1.6 Interface ............................................................................................... 24
5.1.7 Resurser ................................................................................................ 24
5.1.8 Referenser ............................................................................................ 24
5.1.9 Metod ................................................................................................... 24
5.1.10 Data ...................................................................................................... 24
5.2 DataModel ......................................................................................................... 24
5.2.1 Typ ....................................................................................................... 24
5.2.2 Syfte ..................................................................................................... 25
5.2.3 Funktion ............................................................................................... 25
5.2.4 Delkomponenter ................................................................................... 26
5.3
5.4
5.5
5.6
5.2.5 Beroenden ............................................................................................ 26
5.2.6 Interface ............................................................................................... 26
5.2.7 Resurser ................................................................................................ 27
5.2.8 Referenser ............................................................................................ 27
5.2.9 Metod ................................................................................................... 27
5.2.10 Data ...................................................................................................... 27
Camera............................................................................................................... 27
5.3.1 Typ ......................................................................................................... 27
5.3.2 Syfte ..................................................................................................... 27
5.3.3 Funktion ............................................................................................... 28
5.3.4 Delkomponenter ................................................................................... 28
5.3.5 Beroenden ............................................................................................ 28
5.3.6 Interface ............................................................................................... 29
5.3.7 Resurser. ............................................................................................... 29
5.3.8 Referenser ............................................................................................ 29
5.3.9 Metod ................................................................................................... 29
5.3.10 Data ...................................................................................................... 29
GraphicalObject ................................................................................................. 30
5.4.1 Typ ....................................................................................................... 30
5.4.2 Syfte ..................................................................................................... 30
5.4.3 Funktion ............................................................................................... 30
5.4.4 Delkomponenter ................................................................................... 31
5.4.5 Beroenden ............................................................................................ 31
5.4.6 Interface ............................................................................................... 31
5.4.7 Resurser. ............................................................................................... 31
5.4.8 Referenser ............................................................................................ 32
5.4.9 Metod ................................................................................................... 32
5.4.10 Data ...................................................................................................... 32
Controller........................................................................................................... 32
5.5.1 Typ ....................................................................................................... 32
5.5.2 Syfte ..................................................................................................... 32
5.5.3 Funktion ............................................................................................... 33
5.5.4 Delkomponenter ................................................................................... 34
5.5.5 Beroenden ............................................................................................ 34
5.5.6 Interface ............................................................................................... 34
5.5.7 Resurser ................................................................................................ 35
5.5.8 Referenser ............................................................................................ 35
5.5.9 Metod ................................................................................................... 36
5.5.10 Data ...................................................................................................... 36
UndoStack ......................................................................................................... 36
5.6.1 Typ ....................................................................................................... 36
5.6.2 Syfte ..................................................................................................... 36
5.6.3 Funktion ............................................................................................... 36
5.6.4 Delkomponenter ................................................................................... 37
5.6.5 Beroenden ............................................................................................ 37
5.6.6 Interface ............................................................................................... 37
5.6.7 Resurser ................................................................................................ 38
5.6.8 Referenser ............................................................................................ 38
5.6.9 Metod ................................................................................................... 38
5.6.10 Data ...................................................................................................... 39
5.7 Undo .................................................................................................................. 39
5.7.1 Typ ....................................................................................................... 39
5.7.2 Syfte ..................................................................................................... 39
5.7.3 Funktion ............................................................................................... 40
5.7.4 Delkomponenter ................................................................................... 40
5.7.5 Beroenden ............................................................................................ 40
5.7.6 Interface ............................................................................................... 40
5.7.7 Resurser ................................................................................................ 40
5.7.8 Referenser ............................................................................................ 41
5.7.9 Metod ................................................................................................... 41
5.7.10 Data ...................................................................................................... 41
5.8 UserCommand ................................................................................................... 41
5.8.1 Typ ....................................................................................................... 41
5.8.2 Syfte ..................................................................................................... 41
5.8.3 Funktion ............................................................................................... 42
5.8.4 Delkomponenter ................................................................................... 43
5.8.5 Beroenden ............................................................................................ 44
5.8.6 Interface ............................................................................................... 44
5.8.7 Resurser ................................................................................................ 44
5.8.8 Referenser ............................................................................................ 45
5.8.9 Metod ................................................................................................... 45
5.8.10 Data ...................................................................................................... 45
5.9 View .................................................................................................................. 45
5.9.1 Typ ....................................................................................................... 45
5.9.2 Syfte ..................................................................................................... 45
5.9.3 Funktioner ............................................................................................ 46
5.9.4 Delkomponenter ................................................................................... 46
5.9.5 Beroende .............................................................................................. 46
5.9.6 Interface ............................................................................................... 46
5.9.7 Resurser ................................................................................................ 47
5.9.8 Referenser ............................................................................................ 47
5.9.9 Metod ................................................................................................... 47
5.9.10 Data ...................................................................................................... 48
5.10 Renderer ............................................................................................................ 48
5.10.1 Typ ....................................................................................................... 48
5.10.2 Syfte ..................................................................................................... 48
5.10.3 Funktioner ............................................................................................ 48
5.10.4 Delkomponenter ................................................................................... 49
5.10.5 Beroende .............................................................................................. 49
5.10.6 Interface ............................................................................................... 49
5.10.7 Resurser ................................................................................................ 49
5.10.8 Referenser ............................................................................................ 49
5.10.9 Metod ................................................................................................... 49
5.10.10 Data ...................................................................................................... 50
5.11 ToolbarHandler ................................................................................................. 50
5.11.1 Typ ....................................................................................................... 50
5.11.2 Syfte ..................................................................................................... 50
5.11.3 Funktion ............................................................................................... 50
6
7
5.11.4 Delkomponenter ................................................................................... 51
5.11.5 Beroende .............................................................................................. 51
5.11.6 Interface ............................................................................................... 51
5.11.7 Resurser ................................................................................................ 51
5.11.8 Referenser ............................................................................................ 52
5.11.9 Metod ................................................................................................... 52
5.11.10 Data ...................................................................................................... 52
5.12 Toolbar .............................................................................................................. 52
5.12.1 Typ ....................................................................................................... 52
5.12.2 Syfte ..................................................................................................... 52
5.12.3 Funktioner ............................................................................................ 52
5.12.4 Delkomponenter ................................................................................... 53
5.12.5 Beroende .............................................................................................. 53
5.12.6 Interface ............................................................................................... 53
5.12.7 Resurser ................................................................................................ 53
5.12.8 Referenser ............................................................................................ 53
5.12.9 Metod ................................................................................................... 54
5.12.10 Data ...................................................................................................... 54
5.13 Button ................................................................................................................ 54
5.13.1 Typ ....................................................................................................... 54
5.13.2 Syfte ..................................................................................................... 54
5.13.3 Funktioner ............................................................................................ 54
5.13.4 Delkomponenter ................................................................................... 54
5.13.5 Beroende .............................................................................................. 55
5.13.6 Interface ............................................................................................... 55
5.13.7 Resurser ................................................................................................ 55
5.13.8 Referenser ............................................................................................ 55
5.13.9 Metod ................................................................................................... 55
5.13.10 Data ...................................................................................................... 55
Resursuppskattning och riskanalys. ............................................................................ 56
6.1 Resursuppskattning ........................................................................................... 56
6.2 Riskhantering..................................................................................................... 57
6.2.1 Arbetet med riskanalysen ..................................................................... 58
6.3 Resursuppskattning ........................................................................................... 58
Spårningsmatris .......................................................................................................... 60
1 Introduktion
1.1 Syfte
Syftet med det här dokumentet är att tolka mjukvarukraven för att
kunna skapa en design som motsvarar produktens syfte. Detta vill vi
göra heltäckande så att alla krav i SRD:n kommer med.
Informationen behöver inte skrivas lika lättillgängligt i ADD:n som i
URD:n då vi inte avser att visa upp ADD:n för någon annan än
projektgruppen. I detta dokument ingår också en lite noggrannare
analys av risker som kan påverka projektet i alla avseenden, samt en
planering över de olika komponenterna.
1.2 Kort beskrivning av produkten
Mobile3D är ett program för handdatorer som kan användas av 3Dprogrammerare och 3D-designers för att lätt kunna skapa enkla
tredimensionella bilder på resande fot. Det är enkelt för nya
användare att komma igång med programmet. Den version som
kommer att hinna bli klar under det här projektet kommer att vara en
nedbantad forskningsversion. Därför duger den endast till att
utforska vad som är möjligt att genomföra med java på handdatorer.
Produkten kommer dock att vara utbyggbar för vidare utveckling
efter projektets slut.
1.3 Definitioner och förkortningar
Java
Programspråk som används för att göra program
för olika ändamål. Man måste använda sig av en
virtuell maskin för att köra ett javaprogram.
Detta för att programmet ska vara
plattformsoberoende.
Plattformsoberoende Oberoende av vilket operativsystem
programmet körs på.
Virtuell maskin
Program som används för att tolka och köra
javaprogram.
J2SE
Standardversionen av programspråket java som
används för att göra plattformsoberoende
program för stationära datorer.
J2ME
Reducerad javaversion som används för att
programmera handdatorer och andra bärbara
enheter.
VRML
Virtual Reality Modeling Language – Filformat
som används för att spara tredimensionella
grafiska bilder i form av text.
MIDP
Mobile Information Device Profile – En
javaomgivning som gör det möjligt att skapa
och köra javaprogram på bärbara enheter.
OpenGL
Ett slags hjälpmedel för att göra grafiska bilder
och spel genom att programmera.
Palm
Den handdator som har flest marknadsandelar.
Den är liten men inte lika snabb som en Pocket
PC. Den har Palm OS som operativsystem.
Palm Vx
En handdator som är tillverkad av Palm. Den
har en processorhastighet på 20 MHz, en
skärmstorlek på 160x160 och 8 MB i
internminne.
Pocket PC
Lite större handdator än Palm. Den är snabbare
och har dessutom en version av Windows,
Windows CE, som operativsystem.
HotSync
Program som används för att koppla ihop en
Palm och en stationär eller bärbar PC. Detta
görs för att synkronisera informationen i
adressboken, kalendern och mailboxen och i
eventuella andra program. Dessutom används
HotSync till att överföra filer och program till
och från handdatorn.
ActiveSync
Pocket PC´s motsvarighet till Palmens HotSync.
Palm OS
Operativsystemet som Palm använder sig av.
Det är fönsterbaserat och kan bara köra program
som är anpassade för Palm OS.
Emulator
Ett program för PC eller Mac för att simulera en
Palm eller Pocket PC. Detta är ett nyttigt
hjälpmedel när man programmerar handdatorn.
Windows CE
Operativsystemet som används i Pocket PC. Det
är en variant av Windows vilket gör att många
användare känner igen sig.
KVM
K Virtual Machine – En ny virtuell maskin som
byggts upp från grunden. Det är anpassat för att
kunna köras på bärbara enheter med litet
minnesutrymme.
MVC
Model-View-Controller – Objektorienterad
struktur som används för att dela upp
programmet i olika delar. Dessa delar är
modellen som är själva funktionaliteten, vyn
som är gränssnittet och controllern som
bestämmer vad som ska göras.
Conduit-program
Pluginprogram som körs när HotSync startas.
Detta program kan t.ex. kopiera filer från
handdatorn till stationära datorn.
Klassdiagram
Ett diagram som i det här dokumentet beskriver
vilka klasser vi har och hur de relaterar till
varandra.
Use Case
En beskrivning av hur arbetsgången hos
specifika funktioner vanligtvis går till vid
användandet av programmet.
SD
Sequence Diagram – Ett sekvensdiagram är ett
diagram som beskriver ett use-case grafiskt.
1.4 Referenser
1.4.1 Böcker
Ames, A., Nadeau, D. & Moreland J. 1996. The VRML
Sourcebook. ISBN 0-471-14159-3
Angel, E. 2000. Interactive Computer Graphics. Andra
upplagan. ISBN 0-201-38597-X
Enrique Ortiz, C. & Giguère, E. 2001. Mobile
Information Device Profile for Java2 Micro Edition.
ISBN 0-471-03465-7
Kalwick, D. 1996. 3D Graphics - Tips, tricks, &
techniques. ISBN 0-12-394970-X
Pogue, D. 1998. PalmPilot - The Ultimate Guide.
ISBN 1-56592-420-7
Gamma, E., Helm, R., Johnson, R., Vlissides, J. 1994.
Design Patterns. ISBN 0-201-63361-2
1.4.2 Webbsidor
http://java.sun.com/products/midp/
http://java.sun.com/products/cldc/
http://wireless.java.sun.com/
http://wireless.java.sun.com/j2me/index.html
http://www.gamedev.net/
http://www.palm.com
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html
http://www.nada.kth.se/projects/proj03/minime/
http://www.opengl.org/
http://www.vrml.org/
http://www.palm.com/developers/
http://www.palmsource.com/developers/
http://www.palmos.com/dev/tools/
1.5 Överblick över dokumentet
Kapitel 1: Introduktion
1.1
Syfte – En beskrivning av syftet med det här dokumentet och
vad vi får ut av det.
1.2
Kort beskrivning av produkten – En kort beskrivning av
produktens omfattning efter det här projektet.
1.3
Definitioner och förkortningar – Förklaringar på tekniska
termer och förkortningar som används i detta dokument.
1.4
Referenser – Samling av böcker och webbsidor från vilka vi
har fått information till detta dokument.
1.5
Överblick över dokumentet – Den här avdelningen som
beskriver mer i detalj vad man hittar under varje rubrik.
Kapitel 2: Överblick över systemet
2
Överblick över systemet – Beskriver hur produkten
kommunicerar med externa system. Beskriver också systemdesignen
på ett lite mindre detaljerat sätt. (Systemdesignen beskrivs mer
detaljerat i kap 3 och 4.)
Kapitel 3: Systeminnehåll
3
Systeminnehåll – Beskriver vad systemet innehåller och hur
systemet använder sig av externa program.
Kapitel 4: Systemdesign
4.1
Designmetod – Beskriver vilken designmetod som använts.
4.2
Uppdelning av komponenter – Ger en överblick över de
största komponenterna. Identifierar dataflödet mellan komponenter.
(Komponenterna kommer att beskrivas i detalj i kap 5).
Kapitel 3: Systeminnehåll
5.n
Komponentnamn – Ett passande namn för komponenten.
5.n.1
Typ – Beskriver vilken typ komponenten är. Detta kan vara
t.ex. en klass eller ett program.
5.n.2
Syfte – Beskriver syftet med komponenten och hänvisar till
ett numrerat krav från SRD:n.
5.n.3
Funktion – Beskriver komponentens funktionalitet samt
dess gränssnitt.
5.n.4
Delkomponenter – Listar alla delkomponenter som
används av denna komponent.
5.n.5
Beroenden – Beskriver de logiska villkoren för att använda
komponenten.
5.n.6
Interface – Beskriver hur komponenten kommunicerar
med andra komponenter.
5.n.7
Resurser – Listar kraven som komponenten ställer på de
externa systemen.
5.n.8
Referenser – Referenser till dokument som behövs för att
förstå komponenten.
5.n.9
Metod – Beskriver hur denna komponent kommunicerar
med sina delkomponenter.
5.n.10
Data – Beskriver i detalj (så väl det går) värden på de
lokala variablerna och datastrukturerna som hör till komponenten.
Kapitel 6: Resursuppskattning och riskanalys
6.1
Prioritet – Ger en överblick över komponenternas prioritet.
6.2
Riskanalys – En noggrannare analys av riskerna och vad man
kan göra för att minska dem.
6.3
Resursuppskattning – Ger en planering av återstoden av
projektet. Där framgår också i stora drag vilka i gruppen som ska
göra vad.
Kapitel 7: Överblick över systemet
7
Spårningsmatris – Ger en tabell över vilka komponenter i
ADD:n som kommit från vilka mjukvarukrav i SRD:n.
2 System översikt
Vårat system är baserat på MVC (Model/view/Controller) konceptet.
Ytterligare systeminehåll är externa system så som
Exporteringsprogram och Konverteringsprogram.
2.1 System design
Vårat system består I huvudsak av följande komponenter.
 GraphicalObject
 UserCommand
 Controller
 ToolbarHandler
 Renderer
 View
 Camera
 DataModel
För en mer ingående beskrivning av dessa komponenter se 4.2.
3 System innehåll
Här ges en beskrivning av system innehållet. Externa system så som
exportering och konvertering.
3.1 Externa gränssnitt
Här nedan beskrivs exporttering av vårt program. Samt hur det
görs.
3.1.1 Exportering
Vi kommer att utveckla ett system för att kunna synkronisera våra
data mellan en handdator och en vanlig dator.
3.1.1.1 HotSync
Detta behöver vi för att kunna överföra våra 3d filer från palm Vx till
andra plattformar.
HotSync Conduit-program för att exporttera till VRML. Vi kommer
att göra en conduit-program till HotSync. Den kommer exporttera 3dobject på palmpilot till VRML .
Previllkor: Vi har en plattform som stödjer HotSync.
Postvillkor: Vi har konverterat alla våra 3d-object på handdatorn till
VRML på den stationära datorn.
(1) Stoppa handdatorn i dockan.
(2)Tryck på HotSync knappen.
(3) HotSyncManager startas på datorn.
(4) HotSyncManager startar vårt program på datorn.
(5) Vårt program läser in 3d-objektet från handdatorn omvandlar det
till VRML.
3.1.2 Konvertering
Vi kommer att använda oss av ett VRML konverteringsprogram.
Detta program kommer att konvertera vårt interna dataformat till
VRML.
4 System design
Här pressenteras de metoder vi använt oss av under våran
konstruktion till systemdesignen.
4.1 Design metoder
Som grund har vi använt oss av MVC (Model/View/Controller) för
att få struktur på vårat program.
Vi har också använt oss av UML sekvens diagram för att kunna
visualisera hur olika komponenter samverkar med varandra. Vi har
även använt oss av modifierade klass diagram för att visa vilka
komponenter som ingår i våran systemdesign.
4.1.1 Klass diagram
Klass diagram ger en överblick över vilka komponenter som finns på
en hög nivå. Detta gör det enkelt att se vilka funktioner som en
enskild komponenterna ansvarar för. Varje klass innehåller
information om klassnamn, attribut och metoder.
4.1.2 Sekvens diagram
Sekvens diagram visar strukturer på olika delar i modellen på hög
nivå. Det används när man vill visa under ett händelseförlopp, hur
olika komponenter samverkar med varandra. Tidsaxeln är vertikal
och anropen mellan komponenterna sker horisontellt.
4.1.3 MVC
När vi började med projektet bestämde vi oss för att ha basstrukturen
MVC (Model/View/Controller).
Ut efter denna design metod har vi sen kunnat utveckla de resterande
komponenterna till vårat system.
Model:
Våran model kommer att hantera de data och funktioner som behövs
för att abstrakt representera och manipulera våran 3d värld som vi
arbetar på. Den kommer att styra vårat koordinat system, kameran,
olika objekt med mera. Våran modell kommer att få information från
våran Controller. Modellen kommer då att bearbeta informationen
och eventuellt skicka resultatet till View.
View:
Våran View kommer att vara ansvarig för allt som ritas ut på
skärmen. View får data från både Controller och Model om vad som
händer och vet då vad den ska rita upp på skärmen.
Controller:
Controllern kommer att ta hand om indata från användaren, det vill
säga i huvudsak av användarens interaktion med handdatorns
pekskärm. Controller kommer att bestämma hur indata från
användaren ska tolkas och kommer därefter att skicka informationen
vidare till antingen Model och (eller) View.
Model-View-Controller samt Huvudprogram och Toolbar API
4.2 Beskrivning av enskilda komponenter
Våran systemdesign består av ett antal olika komponenter som ska
kunna kommunicera med varandra för att program ska kunna göra det
den är avsedd för.
Följande är de huvudkomponenter vårat system består av:
 GraphicalObject
 UserCommand
 Controller
 ToolbarHandler
 Renderer
 View
 Camera
 DataModel
4.2.1 GraphicalObject
En abstrakt representation av ett objekt. Innehåller uppgift om
position, rotation, valt eller inte, vilken typ av primitiv (om någon),
objektets noder och kanter mm. Kommunicerar med DataModel (se
2.4.8 samt 5.2).
4.2.2 UserCommand
UserCommand mottar information från ToolbarHandler. Information
från ToolbarHandler betyder antingen att aktivt UserCommandobjekt
ska bytas (ev. Till samma objekt) eller att användaren interagerar
med ritytan. Ett UserCommandobjekt representerar i princip en ikons
funktionalitet och avgör hur information från ToolbarHandler ska
tolkas. UserCommand skickar den tolkade informationen till
DataModel, View och Controller.
4.2.3 Controller
Controller får input från handdatorn. Om input har något med
pekskärmen att göra skickas de aktuella skärmkoordinaterna till
ToolbarHandler. Om input är något annat, t.ex. handdatorn mottar ett
telefonsamtal så vidtas lämplig åtgärd. Controller får data från
ToolbarHandler och Command och sänder data till DataModel och
View.
Klasser som utgör Controller.
4.2.4 ToolbarHandler
Varje verktygsfällt (se SRD 3.1.3.2) har en egen ToolbarHandler.
Dessa mottar skärmkoordinater från Controller och avgör om någon
knapp i verktygsfältet har de koordinaterna eller inte. Vidarebefordrar
informationen till rätt UserCommandobjekt. För att se hur
ToolbarHandler passar in i arkitekturen se 4.2.6.
4.2.5 Renderer
Renderer ansvarar för utritningen av den så kallade markeringsramen,
rutnätet (se SRD 3.1.2.2) och 3d-objekten till skärmen. I fallet att 3dobjekten ska ritas så hämtar/får Renderer information från DataModel
(via View), tolkar detta tillsammans aktuella tillstånds variabler och
ritar ut ofyllda polygoner till skärmen. Tillståndsvariabler är t.ex.
aktuell kameraposition, om polygonerna ska perspektivprojiceras
eller parallellprojiceras. Hur resultatet av projiceringarna (se SRD
3.1.2.2) blir beräknar renderer.
Får och mottar data från DataModel och Controller genom View.
4.2.6 View
Samordnar allt som ska ritas ut på skärmen och kommunicerar med
DataModel samt Controller. Dellegerar uppgifter till Renderer och
Toolbar.
View och dess delar.
4.2.7 Camera
Camera håller reda på vilken vy användaren för tillfället befinner sig
i, vinkel mot koordinataxlarna, zoomning, projektion mm. Den
ansvarar även för funktionaliteterna inzoomning, utzoomning och
förflyttning (se SRD 3.1.1.2). Camera får data från DataModel och
sänder data till View (se 4.2.6).
4.2.8 DataModel
DataModel får data från Controller (se 4.2.3) som den tolkar och
utifrån det t.ex. ändrar tillståndsvariabler eller skickar vidare
uppgifterna till Camera, GraphicalObject och View (se 4.2.6).
DataModel håller reda på alla objekt samt kameran, d.v.s. en
representation av 3d-världen.
DataModel utför även transformationerna på objekten, rotation,
förflyttning, skalning och radera (se SRD 3.1.1.1). DataModel ändrar
därmed data i GraphicalObject.
DataModel
4.3 Spara till ett internt filformat
När vi sparar en 3d primitiv gör vi detta i ett internt filformat. Den
information som behöver sparas i filen behöver innehålla följande:
 Figur typ Ex Cone eller Kub o.s.v.
 Filens namn.
 Allt som ligger i Camera.
 Allt som ligger i DataModel.
 Allt som ligger i GraphicalObject.
4.3.1 Specifikation för Mobile3D Format (M3F)
Inledning
M3F är ett binärt format som används för att lagra data som har
skapats i Mobile3D.
Formatet kommer också att stödjas av Mobile3D's
konverteringsprogram som har formatet som indata.
Filorganisation
M3F har inte en ”riktig” header som andra format, utan denna header
innehåller bara ett ”magiskt” tal (2 bytes) som används för att
verifiera att det är en M3F -fil. Detta identiferingstal är talet 029Ah.
Sedan kommer modellens namn (filnamn).
Position Data
00h
stringSize
01h
modelStr
StringSize anger hur många tecken (chars) modelStr innehåller.
ModelStr anger modellens namn.
Direkt efter detta namn så följer en serie av olika block. Varje block
börjar med ett tal som indikerar vad för sorts objekt blocket
innehåller. Giltiga data för dessa tal är:
01h
GrOBox
02h
GrOSphere
03h
GrOCone
04h
GrOCylinder
05h
CAMERA_FRONT
06h
CAMERA_SIDE
07h
CAMERA_TOP
08h
CAMERA_FREE
09h-FFh är reserverade för framtida bruk.
En M3F datafil kan innehålla ett godtyckligt antal av dessa objekt i
godtycklig ordning.
Fildetaljer
M3F-objekten GrOBox, GrOSphere, GrOCone och GrOCylinder har
samma datastruktur, vilket visas nedan:
Position
00h
02h
04h
06h
08h
0Ah
0Ch
0Eh
10h
Data
position_x
position_y
position_z
scale_x
scale_y
scale_z
rotate_x
rotate_y
rotate_z
Strukturen är alltså 36 bytes (9 integers) stor.
Position_x, position_y och position_z representerar positionen i
världen relativt till origo där objeket befinner sig.
Scale_x, scale_y och scale_z bestämmer hur objektet ska förändras
(skalas) i respektive axelriktning.
Rotate_x, rotate_y och rotate_z bestämmer hur mycket objektet skall
roteras i respektive rotationsaxel.
M3F-objekten CAMERA_FRONT, CAMERA_SIDE,
CAMERA_TOP, CAMERA_FREE har samma datastruktur, vilket
visas nedan:
Position
00h
02h
04h
06h
08h
0Ah
Data
position_x
position_y
position_z
look_at_x
look_at_y
look_at_z
Strukturen är alltså 24 bytes (6 integers) stor.
Position_x, position_y och position_z representerar positionen i
världen relativt till origo där kameran befinner sig.
Look_at_x, look_at_y och look_at_z representerar positionen i
världen relativt till origo som kameran tittar mot.
Behov: Ja.
Stabilt: Ja.
Källa: MM&M.
Prioritet: 1.
Verifierbarhet: Man kan ladda in en sparad modell.
Motivation: Nödvändig för att kunna lagra modell.
5 Komponentbeskrivning
Det här kapitlet innehåller en noggrannare beskrivning av varje
komponent beskriven i kap. 4. Komponenterna är uppdelade efter
Model-View-Controller-modellen (MVC, se Gamma) och listar varje
komponent som ingår i respektive del. Dock så stödjer inte J2ME
hela MVC-konceptet, vilket kommer innebära att den
implementerade designen kommer skilja sig något från den logiska.
Varje komponent kan ses som en som en delkomponent i antingen
Model, View eller Controller men kommer implementeras som en
egen klass.
Klassdiagrammen (se 4) är referens till respektive komponent.
5.1 Mobile3DMain
5.1.1 Typ
Komponent. Eventuellt Klass.
5.1.2 Syfte
Används för att knyta samman programmets delar och härifrån startar
exekveringen.
5.1.3 Funktion
5.1.3.1 main
Beskrivning: Initsierar kärnan programmet.
Argument: En String array.
Returnerar: void.
5.1.4 Delkoponenter
Äger direkt en DataModel (se 5.2) ,en View (se 5.9) samt en
Controller (se 5.5). Dessa komponenter/klasser utgör programmet.
5.1.5 Beroenden
Inga beroenden förekommer.
5.1.6 Interface
Se klassdiagram 4.?
5.1.7 Resurser
Inga externa resurser krävs.
5.1.8 Referenser
Resterande av kap 5.
5.1.9 Metod
Klassen är mycket liten, kommer endast att starta igång programmet.
DataModel dm = new DataModel();
Controller crtl = new Controller(dm);
View v = new View(ctrl, dm);
5.1.10 Data
Klassen består av en DataModel (se 5.2) ,en View (se 5.9) samt en
Controller (se 5.5).
5.2 DataModel
5.2.1 Typ
Klass. Kan även betraktas på komponentnivå.
5.2.2 Syfte
Model-klassens syfte och funktion är att tillhandahålla en datastruktur
för att lagra 3D-objekt. Model lagrar även de olika kamerorna. View
använder sedan metoder i Model för att rita ut objekten på skärmen.
Datastrukturen representerar hale 3D-modellen som kan ändras
oberoende av vad som visas av gränssnittet. Detta är viktigt eftersom
datarepresentationen eventuellt ska kunnas bytas i framtiden. Man
vill heller inte alltid visa samtliga ändringar i modellen på skärmen
av prestandaskäl.
5.2.3 Funktion
5.2.3.1 setActive
Beskrivning: Applikationen kan ha ett GraphicalObject aktivt, vilket
idikerar att objektet är markerat. För att sätta ett GraphicalObject
aktivt används denna metod.
Argument: Ett GraphicalObject.
Returnerar: void.
5.2.3.2 getActive
Beskrivning: Returnerar det just nu markerade 3D-objetet.
Argument: void.
Returnerar: Ett GraphicalObject.
5.2.3.3 addGrO
Beskrivning: Används för att lägga till ett 3D-objekt till
datastrukturen.
Argument: Ett GraphicalObject.
Retunerar: void.
5.2.3.4 deleteGrO
Beskrivning: Används för att ta bort ett 3D-objekt.
Argument: void.
Returnerar: Ett GraphicalObject. Detta för att kunna implementera
undo-funktionalitet.
5.2.3.5 getCamera
Beskrivning: Returnerar aktiv kamera.
Argument: void.
Returnerar: En Camera.
5.2.3.6 setActiveCamera
Beskrivning: Sätter en kamera som aktiv.
Argument: En Camera.
Returnerar: void.
5.2.3.7 getGrOVector
Beskrivning: Returnerar samtliga GraphicalObject i datastrukturen i
en Vector.
Argument: void.
Returnerar: En Vector innehållande samtliga GraphicalObject i
strukturen.
5.2.3.8 save
Beskrivning: Sparar ner den interna datastrukturen med 3D-objekt
och kameror till angivet filnamn i det interna filformatet (se 4).
Metoden kontrollerar att filnamnet är giltigt
Argument: En String innehållande ett filnamn.
Returnerar: void.
5.2.3.9 load
Beskrivning: Laddar in en i det interna filformatet (se 4) sparad 3Dmiljö från angiven fil.
Argument: En String innehållande ett filnamn.
Returnerar: void.
5.2.4 Delkomponenter
Model kommer att innehålla någon datastruktur (se 5.2.10)
5.2.5 Beroenden
Inga beroenden förekommer.
5.2.6 Interface
Se klassdiagram 4.? Kommunicerar genom de publika metoderna (se
5.2.3)
5.2.7 Resurser
Måste kunna läsa och skriva till sekundärminnet.
5.2.8 Referenser
Model-View-Controller konceptet se kap 4.?
Model-View-Controller konceptet se referenser kap 1.4
Model-View-Controller se Gamma
5.2.9 Metod
Model är enkelt uppbyggd, endast innehållande en datastruktur som
håller GraphicalObject-onjekten och de Camera:s som används.
Model gör själv inga förändringar eller modifieringar av dessa objekt
utan fungerar enbart som struktur för dem. Den interna datastrukturen
kan bytas ut genom att användbara datastrukturer implementerar
generella gränssnitt definierade i J2ME.
5.2.10 Data
En datastruktur kommer att finnas. Vilken är ännu ej fastställt men
troligen räcker en enkel dubbellänkad lista. Relativt få objekt
kommer att finnas så prestanda vid sökning av objekt är inget stort
problem. Däremot är det önskvärt att man enkelt och snabbt kan få
fram en lista av objekten.
Referenser till markerade objekt GraphicalObject:s och aktiv Camera
måste finnas.
5.3 Camera
5.3.1 Typ
Klass.
5.3.2 Syfte
Camera används för att representera en kamera och dess interna
tillstånd, exempelvis dess position och riktning. Utseendet på en 3Dmiljö är olika beroende på var kameran befinner sig och var det är
riktad mot. Man måste ha möjlighet att se ur olika vinklar.
5.3.3 Funktion
5.3.3.1 getDownVector
Beskrivning: Behövs för att kunna avgöra – utifrån kameran – vad
som är neråt.
Argument: void
Returnerar: En Vector3D
5.3.3.2 getRightVector
Beskrivning: Behövs för att kunna avgöra – utifrån kameran – vad
som är höger.
Argument: void.
Returnerar: En Vector3D.
5.3.3.3 setDistance
Beskrivning: Används för att ändra avstånd till rumments origo, dvs
koordinaten (0,0,0).
Argument: En int.
Returnerar: void.
5.3.3.4 getPosition
Beskrivning: Används för att hämta kamerans position.
Argument: void.
Returnerar: Vector3D.
5.3.3.5 moveTo
Beskrivning: Används för att flytta kameran.
Argument: Två heltal, motsvarande vinkel från origo.
Returnerar: void.
5.3.4 Delkomponenter
I en senare version kommer Camera fungera som en generalisering av
en parallellprojicerad kamera. Denna kommer då att ha samma
representation men måste skriva över en del metoder.
5.3.5 Beroenden
Behöver klassen Vector3D.
5.3.6 Interface
Se klassdiagram 4.?
5.3.7 Resurser.
Inga externa resurser krävs.
5.3.8 Referenser
Kamerabegreppet (se kap 1.4)
5.3.9 Metod
En förflyttning av kameran kan behöva närmare beskrivning. I den
perspektivprojicerade kameran så rör man på en imaginär sfär med
centrum i origo (se SRD 3.1). En förflyttning kan då göras antingen
genom att göra sfären mindre – använd setDistance(dist: int) – eller
genom att ange två vinklar som beskriver en förflyttning på sfären.
Den senare (sfäriska koordinater) beräknas utifrån formeln:
x=Rsin(v)cos(u)
y=Rsin(v)sin(u)
z=Rcos(v)
Där v och u mostsvarar vinklarna fi och theta i bilden och R är
sfärens radie.
5.3.10 Data
Camera kommer att internt representeras av dels en position, dels av
en punkt den är riktad mot. Denna respresentation fungerar i både
parallell och perspektivprojektioner.
5.4 GraphicalObject
5.4.1 Typ
Abstrakt klass.
5.4.2 Syfte
GraphicalObject behövs för att representera 3D-objekt.
5.4.3 Funktion
5.4.3.1 move
Beskrivning: Används för att uppdatera objektets
positionskomponent (se 5.4.10).
Argument: En Vector3D.
Returnerar: void.
5.4.3.2 rotate
Beskrivning: Används för att uppdatera objektets
rotationskomponent (se 5.4.10).
Argument: En Vector3D.
Returnerar: void.
5.4.3.3 scale
Beskrivning: Används för att uppdatera objektets
skalningskomponent (se 5.4.10).
Argument: En Vector3D.
Returnerar: void.
5.4.3..4 getPoints
Beskrivning: Abstrakt. Returnerar objektets samtliga punkter.
Argument: void.
Returnerar: en array av Vector3D
5.4.3.5 getLines
Beskrivning: Abstrakt. Returnerar objektets samtliga linjer.
Argument: void.
Returnerar: en array av Lines.
5.4.3.6 getPosition
Beskrivning: Returnerar objektets positionskomponent (se 5.4.10)
Argument: void.
Returnerar: Vector3D
5.4.3.7 getRotation
Beskrivning: Returnerar objektets rotationskomponent (se 5.4.10)
Argument: void.
Returnerar: Vector3D
5.4.3.6 getScale
Beskrivning: Returnerar objektets skalningskomponent (se 5.4.10)
Argument: void.
Returnerar: Vector3D
5.4.4 Delkomponenter
Då detta är en abstrakt klass så kommer den inte kunna instansieras.
Varje 3D-primitiv kommer därför bli en specialisering av
GraphicalObject. Dessa klasser kommer att vara:
(1) GrOSphere
(2) GrOCone
(3) GrOBox
(4) GrOCylinder
Dessa klasser kommer att definieras av olika uppsättningar av
punkter och linjer. Metoderna kommer att vara de samma som i den
generaliserade klassen och det är upp till konstruktorerna i varje
enskilt objekt att se till att det skapas på rätt sätt.
5.4.5 Beroenden
För att instansiera och använda objektet behövs en av
GraphicalObject ärvd klass. Dess konstruktor behöver indata som
kommer från användarens rörelser med pekpennan.
5.4.6 Interface
Se klassdiagram 4.?
5.4.7 Resurser.
Inga externa resurser krävs.
5.4.8 Referenser
Beskrivning av 3D-primitiver se kap URD.
5.4.9 Metod
Den enda metoder med funktionskropp kommer att vara:
Public void move(Vector3D v) {
position.setTo(v)
}
Public void rotate(Vector3D v) {
rotation.setTo(v)
}
Public void scale(Vector3D v) {
scale.setTo(v)
}
5.4.10 Data
Objektens struktur kommer att representeras av en samling punkter
och en samling linjer. Dessa representeras troligen bäst i form av en
array av vector3D och Lines.
5.5 Controller
5.5.1 Typ
Klass
5.5.2 Syfte
Controller implementerar det i java inbyggda interfacet Canvas.
Därigenom får canvas input från pekskärmen. Indata kan bestå i att:
pennan har satts ner på skärmen, pennan dras på skärmen, pennan
lämnar skärmen. Indata skickas vidare till aktivt Commandobjekt.
Se SRD 3.1.3.1
5.5.3 Funktion
5.5.3.1 penPressed
Beskrivning: Då pennan sätts ned på skärmen får penPressed de
skärmkoordinater (x, y) där pennan satts ned.
Argument: skärmkoordinater (x,y) av typen int.
Returnerar: void.
5.5.3.2 penDragged
Beskrivning: Då pennan dras på skärmen kommer penDragged
kontinuerligt att anropas med de nya skärmkoordinaterna (x, y) där
pennan befinner sig.
Argument: skärmkoordinater (x,y) av typen int.
Returnerar: void.
5.5.3.3 penReleased
Beskrivning: Då pennan lämnar skärmen får penReleased de
skärmkoordinater (x, y) som var de absolut senaste innan pennan
lyftes från skärmen.
Argument: skärmkoordinater (x,y) av typen int.
Returnerar: void.
5.5.3.5 setActiveCmd
Beskrivning: Det är alltid ett UserCommandobjekt (se 5.8) aktivt.
Vilket det är beror på input från användaren. setActiveCmd ändrar
aktivt UserCommandobjekt till det objekt den får som argument.
Argument: Ett UserCommandobjekt, cmd.
Returnerar: void.
5.5.3.6 setToolbarHandler
Beskrivning: Sätter aktivt ToolbarHandlerobjekt. Kan endast finnas
ett aktivt objekt och kommer i praktiken att sättas då programmet
initieras.
Argument: Ett ToolbarHandlerobjekt, tbh.
Returnerar: void.
5.5.4 Delkomponenter
UserCommand.
5.5.5 Beroenden
Inga.
5.5.6 Interface
Tar emot input från pekskärmen via ett canvasinterface och skickar
dessa vidare till ToolbarHandler (se 5.11). Om ToolbarHandler
returnerar false vidarebefordras informationen till aktivt
UserCommandobjekt. Om ToolbarHandler returnerar true så vidtas
inga vidare åtgärder.
Sekvensdiagram 5.5.6:1 visar dataflödet till och från Controller.
Sekvensdiagram 5.5.6:1
5.5.7 Resurser
Måste kunna få input från pekskärmen.
5.5.8 Referenser
UserCommand (5.8) och ToolbarHandler (5.11).
ADD 3.1.3.1
5.5.9 Metod
Controller gör inga beräkningar eller förändringar i datastrukturer.
Däremot kan referenserna till aktivt UserCommandobjekt och
ToolbarHandlerobjekt ändras. Det finns alltid ett och endast ett av
respektive objekt aktivt.
5.5.10 Data
Referenser till aktivt UserCommandobjekt och
ToolbarHandlerobjekt.
5.6 UndoStack
5.6.1 Typ
Klass.
5.6.2 Syfte
UndoStacken är en implementation av lagringsstrukturen stack. Den
lagrar Undoobjekt (se 5.7) som behövs för att undofunktionen (SRD
3.4.5.3) ska kunna realiseras. UndoStackens kapacitet, dvs. hur
många Undoobjekt den kan hålla, bestäms vid initieringen.
UndoStackens kapacitet kan alltså varieras beroende på
minnestillgång.
5.6.3 Funktion
5.6.3.1 push
Beskrivning: Lägger ett Undoobjekt sist i stacken. Om stacken är
full försvinner det Undoobjekt som ligger först i stacken.
Argument: Ett Undoobjekt.
Returnerar: void.
5.6.3.2 pop
Beskrivning: Returnerar det Undoobjekt som ligger sist i stacken
samt avlägsnar det från stacken. Om stacken är tom returneras null.
Det är i praktiken bara UserCommandobjektet CmdUndo (se 5.8)
som kommer att anropa den här funktionen.
Argument: void.
Returnerar: Ett Undoobjekt alternativt null om stacken är tom.
5.6.4 Delkomponenter
Undo.
5.6.5 Beroenden
Inga.
5.6.6 Interface
UndoStacken får anrop till pop från UserCommandobjektet
CmdUndo. Returnerar då det Undoobjekt som ligger först på stacken
eller null om den är tom. Aktivt UserCommandobjekt anropar push
med ett Undoobjekt som argument. Sekvensdiagram 5.6.6:1 visar
flödet till och från UndoStack.
Sekvensdiagram 5.6.6:1
5.6.7 Resurser
Kräver inga externa resurser.
5.6.8 Referenser
Undo (5.7), UserCommand (5.8), avsnittet om undofunktionen i SRD
(3.4.5.3)
5.6.9 Metod
Konstanten SIZE är given och större än noll. Vad det hela går ut på är
att Undoobjekten lagras i en array med kapaciteten SIZE. pop tar bort
det element som ligger sist i stacken och returnerar det, eventuellt
null om stacken är tom. Push lägger till ett objekt på stacken. Om
stacken är full så försvinner det objekt som ligger först. Här är
pseudokod på hur UndoStack kan fungera.
Undo undoarray[SIZE];
int last;
public Undo pop(){
Undo svar = undoarray[last];
undoarray[last] = null;
last--;
if(last == -1) last = size;
return svar;
}
public void push(Undo undoobj){
if(last == size-1)
last = 0;
else
last++;
undoarray[last] = undoobj;
}
5.6.10 Data
En array av Undoobjekt utgör stacken. Storleken på arrayen sätts vid
start av programmet och kan t.ex. baseras på minnesåtgång.
UndoStacken har dock som minst en kapacitet att lagra 1 objekt.
Arrayen implementeras cykliskt så att objekt i botten av stacken
försvinner allteftersom nya objekt läggs på stacken.
5.7 Undo
5.7.1 Typ
Klass.
5.7.2 Syfte
Undoobjekt behövs för att undofunktionen (SRD 3.4.5.3) ska kunna
implementeras. Undoobjekt lagras på UndoStack (5.6) och innehåller
information om vad aktivt UserCommandobjekt (5.8) har utfört eller
vilket UserCommandobjekt som har satts till aktivt. Vad
informationen består i är specifikt för varje UserCommand, men kan
vara t.ex. skärmkoordinater från Controller (5.5) till aktivt
UserCommandobjekt eller anrop från aktivt UserCommandobjekt till
View (5.9).
5.7.3 Funktion
5.7.3.1 execute
Beskrivning: Utför de handlingar som specificeras av Undoobjektets
innehåll. Syftet är att backa ett steg i händelsekedjan till det tillstånd
som var strax innan användaren utförde sin senaste operation.
T.ex. användaren har skapat en sfär. Användaren knackar på
undoikonen. Undoobjektet kommer då att radera den nyss skapade
sfären.
Argument: void.
Returnerar: void.
5.7.4 Delkomponenter
Inga.
5.7.5 Beroenden
Det UserCommand som skapar det specifika Undoobjektet.
5.7.6 Interface
Undoobjekt instansieras av ett UserCommandobjekt.
UserCommendobjektet CmdUndo anropar funktionen execute()
(5.7.3.1) i Undo.
Undo kan ändrar data i DataModel (5.2) och/eller anropa View.
5.7.7 Resurser
Inga.
5.7.8 Referenser
Avsnittet om undofunktionen i SRD (3.4.5.3), UndoStack (5.6),
UserCommand (5.8), Controller (5.5), View (5.9), DataModel (5.2).
5.7.9 Metod
Undo gör inga beräkningar utan lagrar bara information. När metoden
execute() anropas så kommer anrop till metoder i DataModel/View
att utföras.
T.ex. Användaren har just skapat en sfär, men ångrar sig och knackar
på undoikonen. UserCommandobjektet CmdUndo anropar
Undometoden execute() som i sin tur kommer att anropa deleteGrO()
metoden i DataModel.
5.7.10 Data
Varje Undoobjekt är specifikt för varje UserCommandobjekt, men
kan innehålla information om att ett visst objekt skapades eller att ett
objekt modifierades med vissa parametrar. Detta för att kunna
återskapa ett tidigare tillstånd. I praktiken innehåller ett Undoobjekt
ett eller flera metodanrop till DataModel och/eller View.
5.8 UserCommand
5.8.1 Typ
Abstrakt klass. Ett Interface.
5.8.2 Syfte
Att utgöra ett interface. Programmet kommer att innehålla en mängd
Cmd* klasser (där * ersätts av namnet på klassen). Varje Cmd* klass
motsvarar i princip en knapps funktionalitet. Varje Cmd* klass ärver
av UserCommand.
De Cmd* klasser som finns är (Se 5.8.4 för beskrivning av varje
Cmd*):
CmdScale, CmdMove, CmdDelete, CmdRotate, CmdCamMove,
CmdCamZoom, CmdChangeToView1, CmdChangeToView2,
CmdChangeToView3, CmdChangeToView4, CmdChangeToModify,
CmdChangeToCreate, CmdChangeToPosition, CmdCreateSphere,
CmdCreateBox, CmdCreateCone, CmdCreateCylinder, CmdUndo.
Varje UserCommandobjekt (dvs. Cmd* objekten) har förmåga att
tillverka Undoobjekt (5.7) och lägga dem på UndoStack (5.6).
Se SRD 3.1.3.3.
5.8.3 Funktion
5.8.3.1 press
Beskrivning: Anropas av Controller (5.5) då denna tar emot ett
penPressed(x,y) (5.5.3.1). Betyder att användaren har satt ner pennan
på pekskärmen i koordinat x, y.
Argument: int x, int y.
Returnerar: void.
5.8.3.2 dragTo
Beskrivning: Anropas av Controller då denna får ett
penDragged(x,y) (5.5.3.2). Betyder att användaren har förflyttat sin
penna från föregående position på pekskärmen utan att lyfta den.
Pennans nuvarande position är x, y
Argument: int x, int y.
Returnerar: void.
5.8.3.3 released
Beskrivning: Anropas av Controller då denna mottar ett
penReleased(x,y) (5.5.3.2). Betyder att pennan har lämnat
pekskärmen vid koordinat x, y.
Argument: int x, int y.
Returnerar: void.
5.8.3.4 start
Beskrivning: Anropas då ett Cmd* objekt ska börja behandla data.
Vanligtvis då det sätts till aktivt UserCommandobjekt i Controller.
Argument: void.
Returnerar: void.
5.8.3.5 abort
Beskrivning: Avbryter alla operationer som objektet för tillfället
håller på med, t.ex. beräkningar.
Argument: void.
Returnerar: void.
5.8.3.6 delete
Beskrivning: Avalokerar alla eventuella resurser som objektet har
reserverat. Anropas vanligtvis innan objektet slängs.
Argument: void.
Returnerar: void.
5.8.4 Delkomponenter
CmdScale Skalar det valda GrOobjektet utifrån data mottaget av
dragTo(x, y) (5.8.3.2) metoden.
CmdMove Flyttar det valda GrOobjektet utifrån data mottaget av
dragTo(x, y) metoden.
CmdDelete Raderar det valda GrOobjektet.
CmdRotate Roterar det valda GrOobjektet utifrån data mottaget av
dragTo(x, y) metoden.
CmdCamMove Flyttar kameran (se Camera 5.3) utifrån data
mottaget av dragTo(x, y) metoden.
CmdCamZoom Zoomar kameran.
CmdChangeToView1 Ändrar vyn till kamera 1 (parallellprojicerad).
(3.4.3.1 i SRD)
CmdChangeToView2 Ändrar vyn till kamera 2 (parallellprojicerad).
(3.4.3.1 i SRD)
CmdChangeToView3 Ändrar vyn till kamera 3 (parallellprojicerad).
(3.4.3.1 i SRD)
CmdChangeToView4 Ändrar vyn till kamera 4
(perspektivprojicerad). (3.4.3.2 i SRD)
CmdChangeToModify Ändrar till modifierarläget. Motsvarar
3.4.4.3.3 i SRDn.
CmdChangeToCreate Ändrar till skaparläget. Se SRD 3.4.4.3.1
CmdChangeToPosition Ändrar till kameraläget.
CmdCreateSphere Skapa sfär läget. Arbetar med data mottaget av
press(x, y), dragedTo(x,y) och released(x, y) (5.8.3.3) metoderna.
CmdCreateBox Skapa rätblock läget. Arbetar med data mottaget av
press(x, y), dragedTo(x,y) och released(x, y).
CmdCreateCone Skapa kon läget. Arbetar med data mottaget av
press(x, y), dragedTo(x,y) och released(x, y).
CmdCreateCylinder Skapa cylinder läget. Arbetar med data
mottaget av press(x, y), dragedTo(x,y) och released(x, y) metoderna.
CmdUndo Undo funktionaliteten. Anropar pop() (5.6.3.2) i
UndoStack (5.6) och därefter excecute() (5.7.3.1) i det Undoobjekt
som returneras. Implementerar undofunktionaliteten (SRD 3.4.5.3).
5.8.5 Beroenden
Utan Controller fyller UserCommand inget syfte. UserCommand
interfacet måste existera innan Cmd* klasser kan skapas.
5.8.6 Interface
Aktivt UserCommandobjekt, dvs. ett Cmd* objekt, får data från
Controller genom att Controller anropar funktioner i Cmd*. Hur den
informationen tolkas är olika för olika Cmd* objekt. Om Cmd* tolkar
informationen den får som relevant så utförs någon handling. Cmd*
instansierar då också ett Undoobjekt som beskriver hur handlingen
ska kunna upphävas och lägger den på UndoStack.
5.8.7 Resurser
Inga.
5.8.8 Referenser
Controller (5.5), Undo (5.7), UndoStack (5.6), Camera (5.3), Button
(5.13).
SRD 3.4.3.1, 3.4.3.2, 3.4.4.3.3, 3.4.4.3.1, 3.4.5.3.
SRD 3.1.3.3
5.8.9 Metod
De olika Cmd* klasserna är beskrivna i 5.8.4. Information skickas till
dessa oavsett om det är intressant information eller inte. Om
informationen är intressant avgörs av det Cmd* objektet som tar emot
informationen. Cmd* objekt kan anropa funktioner i DataModel,
View, Undo, UndoStack och Button (5.13).
5.8.10 Data
En klass som implementerar UserCommand innehåller egentligen
inte så mycket data. Vad de innehåller varierar mellan Cmd*
klasserna men kan vara t.ex. koordinater, rotationer och funktioner
för att beräkna avstånd. Alla UserCommandobjekt har förmågan att
skapa Undoobjekt.
5.9 View
5.9.1 Typ
View är av typen klass.
5.9.2 Syfte
View ansvarar för att visa en grafisk bild av DataModel (se 5.2) på
skärmen. Den tar även hand om utritning av ToolbarHandler (5.12).
Den gör detta genom att delegera ansvar till sina delkomponenter.
5.9.3 Funktioner
View är view delen i MVC konceptet. Den ansvarar alltså för den
grafiska presentationen av datamodellen. Den kommer att ärva ifrån
java.MicroEdition.LCDUI.Canvas i J2ME.
5.9.3.1 update
Beskrivning: Förebereder uppdatering av skärmen. Delegerar
ansvaret till Renderer (5.10) och ToolbarHandler. Vi försöker
optimera så att bara det som ändras beräknas. Argumentet vi fåd in är
det objektet som har ändrats.
Argument: void/GraphicalObject (se 5.4)/Camera (se 5.3)/Toolbar
Returnerar: void
5.9.3.2 drawBox
Beskrivning: Ritar en rektangel på skärmen. Man kan bara ha en
rektangel på skärmen samtidigt. Detta medför att bara den senaste
ritade rektangeln på skärmen visas.
Argument: heltalen x1,y1,x2,y2;
Returnerar: void
5.9.3.3 Paint
Beskrivning: Ritar om sig själv på g. Delegerar ansvar till sina
delkomponenter.
Argument: Graphics g i J2ME
Returnerar: void
5.9.4 Delkomponenter
Viewen har Renderer som en delkomponent. Renderer tar hand om
utskrivningen av DataModel.
5.9.5 Beroende
ToolbarHandler och Renderer måste vara implementerad.
5.9.6 Interface
Tar emot händelser från UserCommand och skriver dessa till
skärmen. För mer detaljer se kapitel 4.
5.9.7 Resurser
Inga resurser krävs för denna del.
5.9.8 Referenser
Design Pattern, Erich Gamma, Richard Helm, Ralph Johnson & John
Vlissides
Se J2ME referensen.
5.9.9 Metod
Allt börjar med att View får en update från ett UserCommandobjekt.
View dirigerar då händelser till de olika delkomponenterna. Sedan
kallar den rePaint() på sig själv. Då kommer systemet att kalla
paint(). Paint anropet kommer den också att dirigera vidare till sina
delkomponenter. Se sequence diagrams nedan.
5.9.10 Data
Ännu ej bestämt.
5.10 Renderer
5.10.1 Typ
Typen är klass.
5.10.2 Syfte
Renderer ansvarar för att visa en grafisk bild av DataModel.
5.10.3 Funktioner
Den här klassen tar hand om utritning av 3d-objekt på skärmen. Detta
är den del som vi kommer att optimera mest.
5.10.3.1 update()
Beskrivning: Förebereder för uppdatering av skärmen. Vi försöker
optimera så att bara det som ändras beräknas. Argumentet vi få in är
det objektet som har ändrats. Alla andra objekt måste vara lika sedan
senaste update utan argument.
Argument: void/GraphicalObject/Camera
Returnerar: void
5.10.3.2 paint()
Beskrivning: Ritar ut DataModel på skärmen
Argument: Graphics g
Returnerar: void
5.10.4 Delkomponenter
Denna komponent har inga delkomponenter.
5.10.5 Beroende
Kräver att DataModel är implementerad.
5.10.6 Interface
Blir kallad av View (5.9) och läser av alla GraphicalObjectobjekt och
Camera i DataModel.
5.10.7 Resurser
Använder inga resurser
5.10.8 Referenser
Interactive computer programming, Angels
5.10.9 Metod
Denna klass kommer att vara den största klassen. Det kommer
förmodligen att delas upp i småklasser men eftersom det är viktigt att
den har bra prestanda håller vi designen öppen.
Den ska gå igenom DataModels GrO objekt och Camera objektet och
skriva ut det till skärmen. I en förenklad variant utan optimeringar
kommer den att skapa en transformation matris för kameran som man
sedan multiplicerar med de matriser den skapar för GrO objekten. Se
pseudokod nedan. Som vi ser använder den klassen Matrix. Denna är
ännu inte definierad.
Matrix
CameraMatrix=CreateMatrixFromCamera(DataModel.
cam);
ForEach(GrO g=DataModel.GroArray()) begin
Matrix
ObjektMatrix=CreateMatrixFromObjekt(g)
Matrix FinalMatrix=new Matrix();
Vector3d FinalPoints[]=new
Vector3d[g.getPoints().length];
FinalMatrix.mul(CameraMatrix,ObjektMatrix);
FinalPoints.mul(FinalMatrix, g.getPoints());
Draw(FinalPoints,g.getLines());
End;
5.10.10 Data
Vi vet ännu inte vilken data den ska innehålla.
5.11
ToolbarHandler
5.11.1
Typ
ToolbarHandler är av typen klass.
5.11.2
Syfte
ToolbarHandlar tar hand om alla Toolbar (5.12). Man kan lägga till
Toolbars i ToolbarHandler. Den delegerar anrop för utritning och
pentryckningar till sina delkomponenter (Toolbar).
5.11.3
Funktion
5.11.3.1 addToolbar
Beskrivning: Lägger till en Toolbar.
Argument: ToolBar
Returnerar: void
5.11.3.2 press
Beskrivning: Bearbetar att någon har tryckt på skärmen
Argument: Var personen har tyckt, int x,y
Returnerar: Returnerar sant om vi tryckt på någon toolbar.
5.11.3.3 update
Beskrivning: Förbereder ToolbarHandler att det snart kommer en
paint(). Om vi skickar in ett Toolbar vet vi att det är bara denna
Toolbar som har ändrats sedan senaste update.
Argument: void/Toolbar
Returnerar: void
5.11.3.4 paint
Beskrivning: Skriver ut alla aktiva Toolbarobjekt på skärmen genom
att delegera det till de olika Toolbarobjekten.
Argument: Graphics gr
Returnerar: void
5.11.4 Delkomponenter
Har Toolbar som en delkomponent.
5.11.5 Beroende
De har inget beroende förutom genom underkomponenter.
5.11.6 Interface
Det är två stycken delar som använder denna klass, Controller (5.5)
och View (5.9). Controller använder press och View använder
funktionerna update och paint. Något viktigt att kommentera är att
denna klass inte ingår i Model-View-Controller konceptet riktigt.
Den kan man säga är en helt egen komponent som både View och
Controller använder sig av. Vi har valt denna lösning för att minska
kopplingar mellan de olika komponenterna.
5.11.7 Resurser
Använder inga resurser.
5.11.8 Referenser
Design Pattern, Erich Gamma, Richard Helm, Ralph Johnson & John
Vlissides
5.11.9 Metod
Denna klass kan beskrivas som en Facade pattern. Istället för att
kommunicera med alla komponenter skickar den vidare till sina
underkomponenter. Den gör inte detta fullständigt utan för t.ex. att
sätta olika Toolbar (5.11) aktiv använder man funktioner i den
berörda Toolbarojektet direkt.
5.11.10 Data
Ej ännu bestämt.
5.12 Toolbar
5.12.1 Typ
Klass
5.12.2 Syfte
Tar hand om en Toolbar. En Toolbar består av ett antal knappar. Den
tar hand om både utritning och vad som händer när man trycker på en
knapp.
5.12.3 Funktioner
5.12.3.1 addButton
Beskrivning: Lägger till en Button (5.12).
Argument: Button
Returnerar: void
5.12.3.2 setEnabled
Beskrivning: Om argumentet är sant sätts den till aktiv annars
inaktiv.
Argument: Boolean
Returnerar: void
5.12.3.3 paint
Beskrivning: Om den är aktiv ritar den ut sig själv genom att be sina
Buttonobjekt att rita ut sig själva.
Argument: Graphics gr
Returnerar: void
5.12.3.4 press
Beskrivning: Om vi har tryckt på Toolbar returnerar den sant. Den
anropar press i alla Buttonobjekt. Detta gör den bara om den är aktiv.
Argument: int x,int y
Returnerar: Boolean
5.12.4 Delkomponenter
Button är en delkomponent till Toolbar.
5.12.5 Beroende
Den är inte beroende på något för utom sina delkomponenter.
5.12.6 Interface
Se 5.10.9. UserCommand kommer att använda Toolbar genom att
sätta de olika Toolbar aktiva och inaktiva.
5.12.7 Resurser
Använder inga resurser
5.12.8 Referenser
Inga
5.12.9 Metod
Press, Paint skickas vidare till delkomponenterna.
5.12.10 Data
Den måste ha någon koordinat var den är någonstans på skärmen och
sedan behövs höjden och bredden. Detta sparas lämpligaste med int.
Sedan en lista med Button. Dessa sparas lämpligaste med Vector i
J2ME.
5.13
Button
5.13.1 Typ
Klass
5.13.2 Syfte
Hanterar en knapp. Har funktioner för pentryckningar och utritning
på skärmen. Varje Button har ett UserCommand.
5.13.3 Funktioner
5.13.3.1 press
Beskrivning: Om argumentet är inuti anropas start() i det
UserCommand som tillhör Button.
Argument: Var man har tryckt på Toolbarobjeketet. Int x, int y
Returnerar: Sant om man har trycket annars falskt
5.13.3.2 paint
Beskrivning: Ritar knappen på skärmen
Argument: Graphics gr
Returnerar: void
5.13.4 Delkomponenter
Button har inga delkomponenter
5.13.5 Beroende
Kan implementeras etappvis. För att den skall fungera fullständigt
måste UserCommand vara implementerad.
5.13.6 Interface
Se 5.10.6.
5.13.7 Resurser
Inga resurser krävs för denna del
5.13.8 Referenser
Design Pattern, Erich Gamma, Richard Helm, Ralph Johnson & John
Vlissides
5.13.9 Metod
Den enda medlemsfunktionen som anropar yttre funktioner är
press(int x,int y). De andra funktionerna är ganska självklara vad dom
gör.
Press(int x, int y) kontrollerar om man tryckt på knappen. Om man
har gjort det anropas start() i UserCommand objektet som är bunden
till button.
5.13.10 Data
Kommer att spara en bild på knappen. Det finns inbyggda klasser i
J2ME för att spara detta.
6 Resursuppskattning och riskanalys.
6.1 Resursuppskattning
De flesta komponenterna i arkitekturen kommer att implementeras i
ekonomi versionen. Detta säger inte att de flesta av funktionerna från
URD kommer att implementeras, utan snarare att komponenterna i
sig själva är utbyggbara i fråga om funktionalitet.
Komponenter som kommer att implementeras i standard versionen är
sådana tillhörande kon och cylinder funktionaliteten samt kamera
kommandot CmdCamZoom. I delux versionen implementeras undo
komponenter och komponenter tillhörande möjligheten till olika vyer.
På nästa sida finns en tabell med komponenter och deras prioritet.
6.2
Komponent
DataModel
Camera
GrO
GrOShpere
GrOBox
GrOCone
GrOCylinder
View
Renderer
ToolbarHandler
Toolbar
Button
Icon
Controller
UndoStack
Undo
Command
CmdScale
CmdMove
CmdDelete
CmdRotate
CmdChangeToView1
CmdChangeToView2
CmdChangeToView3
CmdChangeToView4
CmdChangeToModify
CmdChangeToCreate
CmdChangeToPosition
CmdChangeToNone
CmdCreateSphere
CmdCreateBox
CmdCreateCone
CmdCreateCylinder
CmdCamMove
CmdCamZoom
Riskhantering
Ekonomi Standard
Delux
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
Denna riskhanteringsplan är en fortsättning från riskanalysen
som skapades i Software Requirements Document (SRD).
Riskerna ska kartläggas, analyseras och det ska göras en
handlingsplan för att minimera dessa risker.
Handlingsplanen(återfinns i 6.2.3) innehåller en behandling av alla
definierade risker även sådana som vi anser små. Anledningen till att
vi genomförde riskanalysen på detta sättet är att vi vill kontrollera
och minimera risken att projektet misslyckas.
Risk analysen är utförd enligt mallen (Risk Guideline: Template
Software Project Risk Factors). I kapitel 6.2.2 återfinns riskanalys
tabellen.
6.2.1 Arbetet med riskanalysen
Vi har medvetet valt att ha ganska låg profil på riskanalysarbetet. Vi
har en tremanna grupp som aktivt arbetar med riskanalysen och
riskhanteringen, i denna grupp ingår projektledaren. Att
projektledaren ingår i riskanalysgruppen är naturligt då han på detta
sätt fortlöpande får god insyn i projektet. Riskanalysgruppen har
enligt ovan beskriven modell analyserat projektets risker och
utarbetat en plan för att aktivt förebygga dessa risker.
6.3 Resursuppskattning
Vi har gjort en grovplanering av i vilken ordning vi ska implementera
de olika komponenterna i projektet. Här har vi också planerat in
testning. Testning av varje komponent och klass ligger i planeringen
för komponenterna. Utifrån vår planering har vi sedan delat upp oss i
grupper om tre personer där varje grupp har hand om en viss del av
projektet. En person i varje grupp har dessutom andra uppgifter som
gör att dessa personers insats i grupperna kan vara lite mindre än de
andras. Gruppindelningen är följande:
1.
2.
3.
Robin, Rickard och Stefan.
Erik, Gunnar och Mario
Mats, Mikael och Anders
Fig. Planering och gruppindelning av komponenterna.
En kort beskrivning av uppdelningen av delar, samt av de delar som
inte beskrivs i kap 5.
Design:
Del 1 – Den delen där alla hjälps åt att strukturera mer noggrant hur
varje del ska implementeras. Detta görs i grupperna. I denna fas
påbörjas också DDD:n.
Del 2 – Här fullföljs arbetet med dokumentationen bl.a. i DDD:n.
DataModel:
Del 1 – Här implementeras grundstommen i datamodellen. Dessa
delar är de som är viktigast för att köra andra komponenter.
Del 2 – Här implementeras spara och ladda till internt format.
GraphicalObject:
Del 1 – Här implementeras de grafiska objekten, sfär och kub.
Del 2 – Här implementeras kon och cylinder.
Camera:
Del 1 – Implementation av de viktigaste delarna för att kunna visa ett
objekt projicerat på skärmen.
Del 2 – Här implementeras de delar som behövs för
perspektivprojektion.
Renderer:
Del 1 – Här implementeras det viktigaste i renderer (som kommer att
bli väldigt avancerad) för att räkna på transformering och annat.
Del 2 – Här implementeras de delar som gör renderer fullständig.
Del 3 – Här optimeras renderer.
ADD
5.5.2
5.6.2
5.7.2
5.8.2
5.8.4
5.9
5.10
5.11
5.12
5.13
Command:
Del 1 – Här implementeras command så att man kan använda de
vanligaste funktionerna.
SRD
Del 2 – Här kommer
gruppen att implementera
3.1.3.1
fler funktioner som är lägre
prioriterade.
3.4.5.3
3.4.5.3
3.1.3.3
Systemtest:
3.4.3.1
Här testas programmet i sin
3.4.3.2
helhet enligt de planer vi
3.4.4.3.3
har lagt upp.
3.4.4.3.1
3.4.5.3
3.1.2.1
Testing:
3.1.2.2
Här testas programmet
3.1.3.2
fortlöpande så att vi vet
3.1.2.3
hela tiden att det fungerar
3.1.3.2
på alla plattformar och
3.1.2.3
under alla OS som vi angett
3.1.2.4
att det ska fungera på.
Manual:
Här skrivs och planeras det för manualen.
7 Spårningsmatris