Download ebooks file Essentials of interactive computer graphics concepts and implementation kelvin

Page 1


download ebook at ebookgate.com

EssentialsofInteractiveComputerGraphics ConceptsandImplementationKelvinSung

https://ebookgate.com/product/essentials-ofinteractive-computer-graphics-concepts-andimplementation-kelvin-sung/

Download more ebook from https://ebookgate.com

More products digital (pdf, epub, mobi) instant download maybe you interests ...

Interactive Computer Graphics A Top Down Approach with Shader Based OpenGL 6th Edition Edward Angel

https://ebookgate.com/product/interactive-computer-graphics-atop-down-approach-with-shader-based-opengl-6th-edition-edwardangel/

Fundamentals of Computer Graphics 2nd Edition

https://ebookgate.com/product/fundamentals-of-computergraphics-2nd-edition-shirley-p/

Foundations of 3D Computer Graphics 1st Edition

Steven J. Gortler

https://ebookgate.com/product/foundations-of-3d-computergraphics-1st-edition-steven-j-gortler/

Computer Graphics with OpenGL 4th Edition Donald Hearn

https://ebookgate.com/product/computer-graphics-with-opengl-4thedition-donald-hearn/

Essentials of Computer Organization and Architecture 6th Edition Null

https://ebookgate.com/product/essentials-of-computerorganization-and-architecture-6th-edition-null/

Computer Graphics with OpenGL 3rd Edition Donald D. Hearn

https://ebookgate.com/product/computer-graphics-with-opengl-3rdedition-donald-d-hearn/

3D Nanoelectronic Computer Architecture and Implementation 1st Edition D. Crawley

https://ebookgate.com/product/3d-nanoelectronic-computerarchitecture-and-implementation-1st-edition-d-crawley/

Mathematics for 3D Game Programming and Computer Graphics Second Edition Eric Lengyel

https://ebookgate.com/product/mathematics-for-3d-gameprogramming-and-computer-graphics-second-edition-eric-lengyel/

Non Photorealistic Computer Graphics Modeling Rendering and Animation 1st Edition Thomas Strothotte

https://ebookgate.com/product/non-photorealistic-computergraphics-modeling-rendering-and-animation-1st-edition-thomasstrothotte/

EssentialsofInteractive ComputerGraphics

EssentialsofInteractive ComputerGraphics

ConceptsandImplementation KelvinSung

AKPeters,Ltd. Wellesley,Massachusetts

PeterShirley
StevenBaer

Editorial,Sales,andCustomerServiceOffice

AKPeters,Ltd.

888WorcesterStreet,Suite230 Wellesley,MA02482 www.akpeters.com

Copyright©2008byAKPeters,Ltd.

Allrightsreserved.Nopartofthematerialprotectedbythiscopyright noticemaybereproducedorutilizedinanyform,electronicormechanical,includingphotocopying,recording,orbyanyinformationstorageand retrievalsystem,withoutwrittenpermissionfromthecopyrightowner.

LibraryofCongressCataloging-in-PublicationData

Essentialsofinteractivecomputergraphics:conceptsandimplementation/Kelvin Sung,PeterShirley,StevenBaer.p.cm.

Includesbibliographicalreferencesandindex. ISBN978-1-56881-257-1

1.Computergraphics.2.Interactivecomputer systems.I.Sung,Kelvin,1964II.Shirley,P.(Peter),1963-III.Baer,Steven. T385.E385652008

006.6--dc22

Tomyfather,Y.H.Sung,andinmemoryofmymother,T.C.Chang;hiswords andhercareshapedmylife

TomywifeDanna —S.B.

1.5ServicingofEvents.......................30

7.4AbstractionofBehavior:APrimitiveHierarchy........172

7.5CollisionsofPrimitives... ..................182

7.6CollectionofPrimitives.....................188

8TransformationOperators

8.1TheTranslationOperator....................194

8.2TheScalingOperator......................198

8.3TheRotationOperator......................204

8.4AffineTransformations.....................209

8.5SomeMathematicsoftheTransformOperators.........210

8.6TutorialsonTransformationOperators.............215

9CombiningTransformationOperators

9.1ConcatenationofOperators...................226

9.2InverseTransformation.....................229

9.3PivotedTransformations.....................231

9.4ProgrammingTransformationswithGraphicsAPIs......236

10CoordinateSystems 257

10.1UnderstandingTutorial3.1...................258

10.2DeviceandNormalizedCoordinateSystems..........265

10.3TheWorldCoordinateSystem..................266

10.4TheWorldCoordinateWindow.................273

10.5InverseTransformation.....................287

11HierarchicalModeling

11.2The SceneNode Class......................299

11.3SceneTreesandSceneGraphs.................311

11.4TheObjectCoordinateSystem.................317

11.5SimpleAnimationwiththe SceneNode Class..........333

12MakingtheApplicationsInteresting

12.1OrientationofObjects......................338

12.2AlphaBlendingandTransparency................345

12.3FileTextureMapping......................351

Preface

Thisbookisdesignedforjunior-orsenior-levelcomputerscience,science,orengineeringstudentswithabasicbackgroundinlinearalgebraandexperiencewith anobject-orientedprogramminglanguage.Workingprofessionalswithcomparablebackgroundshouldbeabletofollowthisbookandlearntheessentialcomputer graphicsconceptsbythemselves.

Thetechnicalcontentandorganizationofthisbookrepresentouranswerto thequestion:

Ifstudentscanonlyscheduleoneelectivecomputergraphicscourse intheirundergraduateeducation,whatshouldweteachinsucha course?

Whenansweringthisquestion,westrivetoachievetwomajorobjectives:

• Toprovidepracticalinformation. Theknowledgeshouldbepractical withpotentialapplicabilityinthestudents’chosenfieldofprofession.

• Toprovideessentialinformation. Theknowledgeshouldbeessentialconceptsthatsupportstudents’futureself-learninginthefieldofcomputer graphics.

Tutorials

Weapproachtheseobjectivesbyfocusingontopicsthatarerelevanttopopular computergraphicsapplications.Toaddressthe“oneelectivecourse”timerestriction,onlyconceptsthatarerelevanttointeractiveapplicationsarecovered. Tomaximizepotentialapplicability,sourcecodeforexampleimplementations (thetutorials)oftheconceptsisprovided.Theseconcept-demonstrationtutorials areimplementedusingpopularAPIs.ToensurestudentslearntheassociatedconceptstogetherwiththeAPI s,eachtutorialhasanOpenGLversionandaDirectX version.WeareintheprocessofportingthetutorialstotheXNAFramework,a thirdgraphicsAPI.

TheUWBGLLibraries

Thisbookuses“thedevelopmentofcomprehensivesoftwarelibrariessuitablefor buildingpopularinteractivecomputergraphicsapplications”asthecentraltheme toconnectandrelateallthetutorials.Alltutorialsareimplementedbasedonthe UWBGL librarysystem.Initiallythislibraryistrivial.Asnewconceptsareintroduced,correspondingsampleimplementationwillbediscussedandintegrated intothe UWBGL.Inthisway,thecomplexityofthelibrarybuildsgraduallyasmore conceptsarepresentedinthebook.Thereareatotalof18differentversionsof the UWBGL library.Thislibrarysystemincreasesincomplexitythroughoutthe bookandeventuallyenablesfastprototypingofmoderatelycomplexinteractive computergraphicsapplications.

Organization

Wepresenttheconceptsassociatedwithin teractivegraphicsapplicationsinthree distinctparts.

1.PartIdiscussestheissuessurroundingdesigningandimplementinginteractiveapplicationsbasedonasimplegraphicaluserinterface(GUI).To ensurethefocusisonuserinteractionandsoftwaredesigntopics,coverage ofcomputergraphicsisminimalinPartI.

2.PartIIdiscussesthefundamentalconceptsforbuildinggraphicsapplications:graphicalprimitives,transformation,and(simple)appliedlinearalgebra.Toensurethecontextissimpleforunderstandingtheseconcepts,the presentationiscarriedoutintwodimensions.

3.PartIIIextendsthediscussiontothethirddimensionbyintroducingthe computergraphicscameramodelanddiscussingtechniquesinsoftwareimplementation.

Throughoutthepresentation,theindependenceofconceptsfromimplementation isemphasized.Thetutorialsservetoreinforcethistheme,wherethesameconceptsaredemonstratedinmultipleversionsbasedoncompetingAPIs.Following thistheme,wehavechosentoomitthediscussionofhardwareshadingandillumination.Thisisbecausethefieldiscurrentlyundergoingrapidchangesand mostofthematerialsinvolvedarehighlyhardware-andAPI-dependent.Instead, implementationwiththesimpletraditionalPhongmodelisdemonstratedinAppendixA.Webelievethatthisfieldwillcontinuetoundergorapidchanges,and beforeitsettles,thebestsourceofup-to-dateinformationwillbeonlinedocumentationandmanuals.

UsingThisBookinaCourse

Thebookorganizesthetopicsabovetosupportthegradualbuildingofthe UWBGL librarysystem.Itisimportantthatthefirstfourchaptersofthebookarecovered intheirgivenorder.Thesechapterspresentthefoundationanddescribetherequirementsoftheapplication/library thatstudentswillbebuilding.Beyondthe firstfourchapters,thetopicscanbecoveredinalmostanyorder.Inallcases,as soonassufficientcomputergraphicstopicsarecovered(byaroundChapter10or 11),studentsshouldcommenceworkingonafinalprojectbasedonthelibrary system.Inthesefinalprojects,studentsshoulddemonstratetheirknowledgeand understandingbydesigninganddevelopinganoriginalandsignificantlycomplex application.

AttheUniversityofWashington,Bothell,two10-weekquartercoursesare taughtbasedonthecontentsofthisbook.Thefirstcourseisa2Dgraphicscourse concentratingonsoftwareinfrastructure,userinteraction,coordinatetransformation,and2Dhierarchicalmodeling.This2DcoursecoversPartsIandIIofthe book.Thefirsthalfofthesecondcoursecoverstherestofthebook.Thesecondhalfofthesecondcoursecoverstopicsinhardwareshadingandillumination basedonup-to-dateonlinedocumentation.

Formoreadvancedstudentswithabackgroundinevent-drivenGUIprogramming,itispossibletoreviewthetopicsinPartIwithaninitialprogramming assignment.Inthiscase,Chapters3and4stillneedtobecoveredforanintroductiontoprogrammingwithgraphicsAPIs.

Thisbookcanbeusedtoteachbuildinggraphicsapplicationstocomputer science(CS)majorstudents,aswellasnon-majorstudentswiththeappropriateprogrammingbackground(experiencewithobject-orientedprogramming). ForCSmajors,thecourseshouldconcentrateonbuildingandimprovingthe UWBGL librarysystem.Fornon-CSmajors,thecourseshouldfocusonusing the UWBGL librarysystemindevelopingapplications(insteadofdevelopingthe libraries).

AdvantagesofThisBook

Themajorstrengthofthisbookisinthepresentationofconceptualandpractical insightsrequiredforthebuildingofmanypopularinteractivegraphicsapplications.Essentialconceptsininteractivegraphicsapplicationdevelopmentarecovered,includingtopicsinsoftwareengineering,softwaredesignpatterns,graphicaluserinterfaces,real-timesimulation,applicationprogramminginterface(API) models,graphicalprimitives,coordinatetransformations,scenenodesandhierarchies,blending,filetexturing,andcameramodelsandinteraction.Theseissues areextremelyimportantissues,especiallyforstudentswhowishtopursuecareers incomputergraphics–relatedfields.Thisbookoffersreadersasubstantivelearningexperiencedesignedtofurtherenhancetheircomputergraphicsknowledge.

SoftwareUpdate

WeplantocontinueimprovingandupdatingthetutorialsandtoincludethesupportofadditionalAPIs(e.g.,XNAFrameworkandpotentiallyJavaandOpenGL) inthefuture.Pleasereferto http://depts.washington.edu/cmmr/biga/forup-todatesourcecodeofthetutorials.

Acknowledgments

Firstandforemost,thankstoallCSS450andCSS451studentsfromtheUniversityofWashington,Bothell.Overtheyears,manybrilliantstudentshelped shapethedesignofthematerialspresentedinthisbook.In1999,aftertherasteralgorithm–basedCSS450class,JeffWarteswasthefirsttopointout:“This coursehasbeenadisappointment.Drawinglinesareonlysointeresting.Istill havenoideahowcomputergraphicsrelatestothegamesIplay.”

Thedevelopmentofthematerialsthateventuallybecamethisbookwasstarted inpartasareactiontothesesincerecomments.Duringtheexperimentationin theearlieryears,the2001batchofCSS450students,especiallySteveBaer, JenniferBeers,KazukoHass,GabrielHolmes,andDerekGerstmann,critically evaluatedthedesignofthelibrary.Havingdonesuchawonderfuljob,Steve hasbecomeanauthorofthisbook.OthersignificantcontributionsfromstudentsincludeChrisDannunzioonworkingwithDirectInput,AdamSmithand SeanBroganonworkingwithswapchains,JackNicholsandAlexeiYatskov onprogramminginC#,andPeterYiapandRobertStoneonprogrammingwith XNA.JordanPhillipsworkedontheinitialpassofthelibraryorganization;JasonPursell,WilliamFrankhouser,andEthanVerralldevelopeddetailedguides forthetutorialsinChapter2;andAdrianBonarbuiltthedocumentationsupportsystem.Athankyoualsogoestocolleaguesinthecommunity:Steve Cunninghamforhisguidanceandsupportforthisproject,EdwardAngelfor theenlighteningdiscussionsondifferentapproachestoteachingcomputergraphics,CharlesJackelsforhisencouragements,andFrankCiochforthechallengingpedagogicaldiscussions.ThesupportinglettersfromGladimirBaranoski, Peng-AnnHeng,CaryLaxer,BobLewis,Tiow-SengTan,Hung-ChuanTeh,and HerbertYangontheinitialideasforthistextbookhelpedsecureagrantfromthe NationalScienceFoundationthatpartiallyfundedthisproject.RebeccaReedRosenbergworkedcloselywithKelvinSungontheevaluationofthematerials.IvanLumalaandJohnNordlingerprovidedcriticalsupporttowardtheend ofthewritingofthisbook.Wewouldliketothankoureditors,AlicePeters andKevinJackson-Mead;thankyouforthehardwork,diligence,andtimely feedback.

KelvinSungwouldliketothanktheUniversityofWashington,Bothell,for thesabbaticalsupportforworkingonthisbook.Thematerialspresentedare baseduponresultsfromprojectssupportedbytheUniversityofWashington, Bothell,ScholarAward2004andtheNationalScienceFoundationGrantNo. DUE-0442420.1 Towardtheend,manyofthetutorialswererefinedwithsupport fromMicrosoftResearchundertheComputerGamingCurriculuminComputer ScienceRFP,AwardNumber15871.

PartIofthisbookisbasedliberallyonChapter18ofthesecondedition of FundamentalsofComputerGraphics.Althoughthecontentsarereorganized withadditionaldetailandextensivecodeexamplesthatintegratesmoothlywith therestofthisbook,thebasicconceptsonbuildinginteractiveapplicationsare thesame.

1 Anyopinions,findings,andconclusionsorrecommendationsexpressedinthismaterialarethose oftheauthor(s)anddonotnecessarilyreflect theviewsoftheNationalScienceFoundation.

Thisbookwaswrittenusingthe LaTeX documentpreparationsoftwareinthe WinEdt2 /MiKTeX 3 editingenvironment.Thefiguresweremadebytheauthors using AutodeskMaya, AdobeIllustrator,and JascPaintShopPro.Theprogram sourcecodedocumentationisbuiltbasedonDoxygen.4 Theauthorswouldlike tothankthecreatorsofthesewonderfulprograms.

KelvinSung

PeterShirley

2 http://www.winedt.com/

3 http://www.miktex.org/

4 http//www.doxygen.org/

ListofTutorials

Tutorial ProjectName Description Basedon

2.1(p.49) SimpleDialog Demystifysourcefiles -

2.2(p.55) EchoButtonEvent GUIelementsandcontrols 2.1

2.3(p.58) SliderControls GUIcontrolvariables 2.2

2.4(p.61) MouseAndTimer Application-definedevents 2.3

2.5(p.63) UpdateGUI Input/outputGUIelements 2.4

2.6(p.66) SliderCtrlWithEcho ExtendGUIAPIwithclasses 2.5

2.7(p.67) Library1 CustomGUIlibrary 2.6

2.8(p.69) GroupControls GroupingGUIelements 2.7

Chapter2. TutorialsonGUIAPI.

Tutorial ProjectName Description Basedon

3.1(p.79) Rectangles2D DrawingwithD3D 2.8

3.2(p.85) Rectangles2D DrawingwithOGL 2.8

3.3(p.87) RectangleClass Abstractionofdrawing(D3D) 3.1

3.4(p.87) RectangleClass Abstractionofdrawing(OGL) 3.2

3.5(p.90) CircleClass Applydrawingwithabstraction 3.3

Chapter3. TutorialsondrawingwithgraphicsAPIs.

Tutorial ProjectName Description Basedon

4.1(p.105) GraphicsSystem AbstractionGraphicsAPI(D3D) 3.5

4.2(p.107) SeparateLibrary GraphicsAPIInterfaceLib(D3D) 4.1

4.3(p.107) GraphicsSystem AbstractionGraphicsAPI(OGL) 3.4

4.4(p.107) RectangleClass GraphicsAPIInterfaceLib(OGL) 4.3

Chapter4. TutorialsonprogrammingwithgraphicsAPIs.

Tutorial ProjectName

Description

Basedon

5.1(p.123) ModelView WindowHandlerabstraction Lib1

5.2(p.131) MouseInput MouseinputviaWindowHandler 5.1+Lib2

5.3(p.135) SimulateGravity Real-timesimulation/update 5.2+Lib2

5.4(p.138) TwoViews Multipleindependentviews 5.3+Lib3

5.5(p.141) MultipleBalls Morecomplexapplicationstate 5.4+Lib3

5.6(p.144) BallShooting Ball-Shootingprogram 5.5+Lib3

Chapter5. Tutorialsonmodel-view-controllerarchitecture.

Tutorial ProjectName

Description Basedon

7.1(p.163) ObjectsAndAttributes Graphicalprimitives Lib4

7.2(p.172) ObjectClasses Primitivesclasshierarchy 7.1+Lib5

7.3(p.184) Collisions Collisionofprimitives 7.2+Lib6

7.4(p.188) ObjectCollections Listsofprimitives 7.3+Lib7

7.5(p.191) BallShoot2 Ball-Shootingwithprimitive 5.6+Lib7

Chapter7. Tutorialsonattributesandbehaviorsofgraphicalprimitives.

Tutorial ProjectName Description Basedon

8.1(p.216) TranslateSingleObject Translationwithoneobject Lib8

8.2(p.220) TranslateObjects Translationwithtwoobjects Lib8

8.3(p.222) ScaleObjects Scalingwithtwoobjects Lib8

8.4(p.222) RotateObjects Rotationwithtwoobjects Lib8

Chapter8. Tutorialsontransformationoperators.

Tutorial ProjectName

9.1(p.236) TranslateScaleObj Concatenatetranslateandscale Lib8

9.2(p.238) MatrixMultiplyOrder Orderofconcatenation 9.1+Lib8

9.3(p.240) MatrixStack Matrixstack 9.2+Lib8

9.4(p.242) PivotedRotation Pivotedscaling/rotation 9.3+Lib8

9.5(p.245) PerPrimitiveTrans Pivotedtransformation 9.4+Lib8

9.6(p.250) XformInfo XformInfoclass 9.5+Lib9

9.7(p.251) XformInfoControls XformInfoGUIdialog 9.6+Lib9

9.8(p.253) BallShoot3 Ball-ShootingwithXformInfo 7.5+Lib9

9.9(p.255) XformList Referencefornextchapter 9.6+Lib9

Chapter9. Tutorialsonconcatenationoftransformationoperators.

Tutorial ProjectName Description Basedon

10.1(p.258) ViewTransform0 WorldtoNDC 3.1 10.2(p.261) ViewTransform1 SquaresinNDC 10.1

10.3(p.263) ViewTransform2 CircleinNDC 10.2

10.4(p.263) ViewTransform3 Aspectratio 10.3

10.5(p.263) ViewTransform4 Aspectratio 10.3

10.6(p.268) XformListCoordSpace Worldanddevicespace 9.9+Lib9

10.7(p.270) ChangedCoordinates Worldanddevicespace 10.6+Lib9

10.8(p.271) TranslateWC WCwindowcenter 10.7+Lib9

10.9(p.278) WCSupport WCwindowwithLib10 10.8+Lib10

10.10(p.280) Panning MovingWCwindow 10.9+Lib10

10.11(p.283) Zooming ResizingWCwindow 10.10+Lib10

10.12(p.285) AspectRatio ResizingUIdrawingarea 10.11+Lib10

10.13(p.289) BadMousePan Mouseclickinput 10.12+Lib10 10.14(p.289) MousePan Inputwithinversetransform 10.12+Lib10

Chapter10. Tutorialsoncoordinatetransformations.

Tutorial ProjectName Description Basedon

11.1(p.295) SimpleArm Armobject Lib10

11.2(p.297) ParentChild Parent/childgroup 11.1+Lib10

11.3(p.303) SceneNode SceneNodeclass 11.2+Lib11

11.4(p.305) SceneNodeArm ArmasaSceneNode 11.3+Lib11

11.5(p.308) SceneNodeMultiPrim Multipleprimitivesinanode 11.4+Lib11

11.6(p.312) SceneNodeSiblings Siblingsnodes 11.5+Lib11

11.7(p.327) SceneNodePicking Mouseclickselection 11.6+Lib12

11.8(p.329) SceneNodeCollision Objectspacecollision 11.7+Lib12

11.9(p.334) SceneNodeAnimation AnimationwithSceneNode 11.8+Lib12

Chapter11. Tutorialsonhierarchicalmodeling.

Tutorial ProjectName Description Basedon

12.1(p.338) OrientationIn2D Orientationofobjects 11.8+Lib12

12.2(p.343) SceneNodeOrient Orientationofscenenodes 12.1+Lib12

12.3(p.350) AlphaBlending Simplealphablending Lib13

12.4(p.355) SimpleTexture Simpletexturemapping12.5(p.364) TextureMapping Integratewithlibrary 12.3+12.4+Lib13

Chapter12. Tutorialsonmorecomplexandinterestingapplications.

Tutorial ProjectName Description Basedon 13.1(p.374) Rectangles3D Simple3Dscene 3.1

Chapter13. Tutorialonasimple3Dapplication.

Tutorial ProjectName

14.1(p.383) AdjustCamera Cameraparameters 13.1

14.2(p.389) AdjustOrtho Visiblevolumeparameters 14.1

14.3(p.393) AdjustPersp Viewfrustumparameters 14.1

14.4(p.395) AdjustDepth Near/farplanesettings 14.3

Chapter14. Tutorialsonthecomputergraphicscamera.

Tutorial ProjectName

15.1(p.416) CameraLib Integrateintolibrary

15.2(p.422) TwoCamera Twocameras

15.3(p.425) CameraMouseUI Interactivecameramanipulation 15.2+Lib14

15.4(p.441) CameraInvXform DCtoWCin3D 15.3+Lib14

Chapter15. Tutorialsonworkingwiththecamera.

Tutorial ProjectName Description Basedon

16.1(p.455) MeshSupport D3Dmeshresource 15.4+Lib15

16.2(p.456) CompoundMesh CompoundmeshPrimitives 16.1+Lib15

16.3(p.461) RotateMatrix Rotationwithmatrix 16.2+Lib16

16.4(p.464) RotateQuat Rotationwithquaternion 16.3+Lib17

16.5(p.465) Orientation Workingwithquaternion 16.4+Lib17

16.6(p.479) SimpleHierarchy Scenegraphin3D 16.5+Lib17

16.7(p.480) SceneGraphIn3D Orientationin3D 16.6+Lib17

16.8(p.485) CollisionIn3D Collisionin3D 16.7+Lib17

16.9(p.487) SelectionIn3D Mouseselectionin3D 16.8+Lib17

Chapter16. Tutorialsonworkingwiththethirddimension.

Tutorial ProjectName Description Basedon

A.1(p.490) SimpleLighting Simplelighting 14.1

A.2(p.490) Lighting Integrateintolibrary 16.9+Lib18

A.3(p.491) CustomMesh WorkingwithD3DMesh A.2+Lib18

AppendixA. Tutorialsonhardwareillumination.

Introduction

Almosteverylaptopanddesktopcomputersoldnowhasbothahigh-resolution screenandamouse.Insidethesesystems thereisusuallyacentralprocessing unit(CPU)aswellasagraphicsprocessingunit(GPU).TheGPUisofsimilar overallcomplexitytotheCPU,butithasaverydifferentoverallarchitectureand purpose.Mostofaprogrammer’seducationtypicallydealswiththeCPUand textandfileinput/output.Thisbook,ontheotherhand,dealswiththescreen, themouse,andtheGPU.Thesearetheessentialentitiesthatcomputergraphics programscontrol.Muchof“standard”programmingappliesingraphics,butthere aremanyadditionalthingstobemasteredbyagraphicsprogrammer.Thisbook dealswiththoseadditionalthings.

Therestofthisbookdevelopsgraphicsprogramsonestepatatimeandin fulldetail.Thisisnotabooktositandreadandponder,asthemanymundane detailspresentedarequiteboring.However,theyarevitaldetailsforactually doinggraphicsprogramming.So,asyoureadthebook,testwhatyoulearnby doing.Bytheendofthebook,youshouldhaveinyourskillsettheabilityto writeasimple—evencomplex—application.Webeginwithhandlinguserinput totheprogram,displaying2Dgraphics,andthenharnessingthefull3Dpowerof theGPU.

Ratherthandiscussinggraphicsatahighlevel,wewilldiverightinandbegin programmingstartingwithChapter2.Thustherestofthisintroductiondiscusses somedetailstobeawareofwhenusingthebook.Theseareimportantnutsand boltsandshouldnotbeskipped!

Althoughfoundationconceptsarecovered,thisbookisthe howto ofcomputergraphics,ratherthanthemoretraditional whatis textthatusuallycovers computergraphics.Morespecifically,weconcentrateon howto buildinteractive computergraphicsapplications.Thebookensuressufficientfoundationconcepts arecoveredsothatreaderscanbegincoding interactivegraphicsapplicationsas theyreadthetext,thusprovidingreaderswithproperpreparationinordertocontinuelearningaboutfoundationsofcomputergraphicsafterfinishingthisbook. Asfarasthisbookisconcerned,an application isa computerprogram.Weinterchangetheuseof application and program

TheTutorials

Thepresentationofthematerialinthisbookistightlyintegratedwithexample programs.Werefertotheseexamplesas tutorials,becausetheyaredesigned toteachanddemonstratetheimplementationofconcepts.Foreachtopicarea, wetypicallystudytheconceptsfollowedbydiscussionofimplementationswith sourcecodesnippets.Sincethetopicareasbuildontopofeachother,sodoes thesourcecodeforthetutorials.Initially,thetutorialsarebare-boneswitha handfuloffiles;aswelearnmoreconcepts,thecomplexityofthetutorialswill alsoincrease.Towardtheend,thetutorialswillbemoderatelyelaboratesoftware systemswiththousandsoflinesofsourcecode.Itisimportantthatyoufollow andunderstandthesourcecodeasyoureadthetext.Wehavefoundthatoneof thebestwaystofollowthisbookisbypracticinggraphicsprogramdevelopment basedontheprovidedsourcecode.Ingeneral,itmaybedifficulttounderstand thisbookwithoutagoodunderstandingofthetutorials.

OrganizationoftheTutorials

ThetutorialsandsourcecodecanbefoundontheaccompanyingCD.5 Thetutorialsforeachchapteraregroupedunderseparatefolderswiththechapterbeing thenameofthefolder.Insideeachchapterfolder,thesourcecodeforeachtutorialisseparatedintosubfolders,withthetutorial’snumberandpagenumber beingthesub-folder’sname.ThefinalfolderisnamedaftertheAPIandtheprogramminglanguagethatthetutorialisimplementedin.Forexample,Chapter10 Tutorial10.1isfirstintroducedonpage258,andtherearetwoimplementations

5 Alsoavailableonlineat: http://depts.washington.edu/cmmr/biga/.

ofthistutorial:OpenGLandD3D,bothbasedonC++andMFC.Thesourcecode forthistutorialislocatedat

chapter tutorials/Chapter 10/Tutorial 10.1 OnPage258/C++ D3D MFC/ chapter tutorials/Chapter 10/Tutorial 10.1 OnPage258/C++ OGL MFC/ Wearecurrentlyworkingon

chapter tutorials/Chapter 10/Tutorial 10.1 OnPage258/C# XNA UWBGUI/

IDEandAPIs

WehavechosentheMicrosoftVisualStudio2005integrateddevelopmentenvironment(IDE)asourtargetdevelopmentenvironment.Alltutorialsareprovided asseparateVisualStudioprojects.Forthisfirsteditionofthebook,wedonot havesupportforanyotherIDEs.

ThesourcecodeforthetutorialsisinC++.Wehavedevelopedtwoversions ofmosttutorials:onebasedontheOpenGLandtheotherbasedontheMicrosoft DirectXDirect3D(D3D)graphicsapplicationprogramminginterface(API).For now,thegraphicaluserinterface(GUI)libraryofmosttutorialsisbasedonthe MicrosoftFoundationClasses(MFC).

ThechoicesforIDE,programminglanguage,andlibrariesarebasedonthe beliefthattheseareprobablythemostwidelyavailableandmostfamiliarenvironmentstomostofourreaders.Ourchoicesdonotreflectendorsementsfor anyofthesystemsweused.Infact,webelievethattheconceptscoveredinthis book,includingimplementationandspecificskills,areindependentofanyparticularsoftwaresystem.Oneshouldbeabletoportthelearningfromthisbookinto anyprogramorprogramminglanguageanddevelopmoderatelycomplexinteractivegraphicsprograms,basedonanymodernIDE,object-orientedprogramming language,graphicslibrary,and/orGUIlibrary.

OurLibrariesandNamingConventions

InChapter2weintroducealibrarytohelpabstractandcustomizetheMFClibrary.InChapter4weintroduceanotherlibrarytocustomizeandinterfacetothe OpenGLandD3Dgraphicslibraries.FromChapter5onwards,webegintowork withtheUWBGLlibraries.WewillworkwithoneGUIlibraryandtwographics libraries.Thelibrarieshavenamesoftheform

UWBandUWBGL. UWBis theabbreviationforUniversity ofWashington,Bothell,the homeinstitutionofthefirstauthorwheremostofthedesign andinitialdevelopmentefforts tookplace.“UWBGL”stands for“UWBGraphicsLibrary.”

where API_Type canbe

MFC —MicrosoftFoundationClasses(GUIlibrary)

D3D —MicrosoftDirectXDirect3D(graphicslibrary)

OGL —OpenGL(graphicslibrary)

and Version_Number isaninteger.Forexample, UWBGL D3D Lib1 isthefirst D3Dlibrary,and UWBGL OGL Lib1 isthefirstOpenGLlibrarywewilldevelop. Aswelearnmoreconcepts,wewillcontinuetointroducenewclassesintoeach library,andthe Version_Number ofthecorrespondinglibrarywillincrease. Wehaveestablishedthefollowingnamingconventionstoavoidcollisionsof identifiers.

• Files. Fileshavenamesthatbeginwith uwbgl API Type.Forexample, uwbgl D3DCircleGeom.h or uwbgl OGLCircleGeom.h.Forfilesthat containAPI-independentcode,therewillbenocorresponding API Type. Forexample, uwbgl Utilitiy.h declarestheutilityfunctions(e.g.,the randomnumberfunctions)forthelibrary.

• Fileversions. Aswerefineconcepts,thecontentsofmanyfiles(e.g., classes)willcontinuetoevolve.A fileversionnumber isattachedtofilesto avoidconfusion(e.g., wubgl D3DCircleGoem1 .h and uwbgl D3DCircle Geom2.h).Noticethatthefile’sversionnumberisindependentofthelibrary’sversionnumber.Forexample,whenevolvingfrom UWBGL D3D Lib1 to UWBGL D3D Lib2,thefile uwbgl D3DGraphicsSystem1.h did notchange.Thesamefileversion1fileexistsinbothversionsofthelibraries.

• Classes. Classeshavenamesthatbeginwiththefollowing.

– UWB.GeneralclassesthatarecommontoallGraphicsAPIs(OGLand D3D).Theseclassestypically definepurevirtualinterfaces thatspecifyfunctionality.Forexample,wewilldiscussthe UWB WindowHandler interfacetothewindowingsystem.

– UWBD3D.ClassesthatcustomizeandbuildontopofD3Dfunctionality. Forexample,the UWBD3D CircleGeometry classisbuiltontopof D3Ddrawingroutinesandencapsulatesthefunctionalityofacircle.

– UWBOGL.ClassesthatcustomizeandbuildontopofOpenGLfunctionality.Forexample,the UWBOGL CircleGeometry classisbuiltontop ofOpenGLdrawingroutinesandencapsulatesthefunctionalityofa circle.

– UWBMFC.ClassesthatcustomizeandbuildontopofMFCfunctionality.Forexample,the UWBMFC UIWindow classextendstheMFC windowclasswithcustomizedsupportforourgraphicsapplications.

• Utilityfunctions. Generalutilityfunctionnamesbeginwith UWB.Forexample, UWB RandomNumber() returnsarandomnumber.

Whennecessary,werefertoeachclass/filebyitsentireidentifierstring(e.g., UWB RandomNumber()).However,forreadability,werefertothenameswithout the“UWB ”prefix,(e.g., RandomNumber() insteadof UWB RandomNumber() ). AppendixCsummarizesthechangesofthelibrary,whennecessary,withassociatedstaticclassUMLdiagrams.Asnewlibrariesareintroducedinthetext, refertothisappendix.

LibraryDesignTrade-Off

TheUWBGLlibraryisdesignedtopresentgraphicsconcepts.Althoughweare concernedwithefficiencyissues,executionspeedisalwaysoflowerprioritywhen comparedwithlogicalorganizationforpresentinggraphicsconcepts.Forexample,oursimpleorganizationofresetting/settingallattributesbeforedrawingeach primitivenecessarilymeansthatthegraphicsrenderingcontextmustbeupdated manytimesduringeachredraw.Thealternativeofcollectingsimilarprimitives andsettingtheattributesonceforalltheseprimitivesduringredrawwouldbe muchmoreefficient.However,suchorganizationwouldintroducecomplexity independentofgraphicsconcepts.Inallcases,weoptedforsimplicityattheexpenseofefficiencyinordertoprovideclearandsimplepresentationofgraphics concepts.

LearningwiththeProvidedSourceCode

Whilereadingthisbook,itisabsolutelyimportanttoconstantlyrememberthat theelaboratedsourcecodeisprovidedasatoolforlearninganddemonstrating theunderlyingconcepts.Webelieveitiseasiertograspthefoundationsifreaders canexperienceandexperimentwiththeconceptsinmoderatelycomplexenvironments.Asstated,theothergoalofthisbookisforreaderstobegintodevelop moderatelycomplexinteractivecomputergraphicsapplications.Thesourceis providedasademo.

Therearedifferentlevelsofusingthesourcecodeandtheelaboratelibraries provided.Readersareencouragedtobe:

• Usersofthesourcecode. Readersshouldbeencouragedtostartfrom Chapter2,wherewedemonstratehowtobeaprogrammerofandusethe sourcecodeprovidedtoexperienceconceptsanddevelopapplications.You don’tneedtounderstandeverysinglelineoftheprovidedcodetobea proficientuserofthelibraryandtoprogramsomethingcomplexaswellas experienceandlearntheunderlyingcomputergraphicsconcepts.

• Evaluatorsofthesourcecode. Forthosewhocanunderstandthesource system,weencourageyoutocriticallyevaluateoursolutionstoimplementingthegraphicsconcepts.Webelievewehaveaprettygoodsolution,but asinalldesignproblems,therearenoperfectanswers.Forexample,we believethe IWindowHandler hierarchy(introducedin Chapter5)isapretty solutionforabstractinggraphicsandGUIAPIswhilesupportingview/controllerfunctionality.However,wecertainlyunderstandthatthisisnota perfectsolution,andreadersareencouragedtoevaluatethemeritsofour solutionandtoseekoutalternativeideas.

• Developersoftheirownsystems. Fromourexperienceusingthissource systemintheclassroom,thebeststudentsoftenchallengetheprovided sourcecodeanddeveloptheirownlibrarieswhileusingtheprovidedsource asanexample.Manystudentschoosetoimplementtheirsystemsbasedon differentprogramminglanguageswithdifferentAPIs,forexample,Java, JavaSwing,andOpenGL,C++,MFC,andOpenGL,C#,WinForm,and XNAFramework,andsoon.

Inallcases,themostimportantpointwehopetomakeisthatreadersshouldavoid gettingboggeddownwithourimplementationandbeingunabletocontinuelearningasaresultofoursourcecodesystem.Thatwouldbetheworst-casescenario. Alwaysremember:findwaystousethesourcecodeandexamplestoexperience andexperimentwiththeconcepts.Youdon’thavetoliketheimplementation.In fact,youarewelcometohateitandcriticallyevaluateit;justdon’tallowyour attitudetowardthesourcecodetohinderyourlearningofthesubjectmatter.

I ElementsofInteractive Programs

I

IntroductiontoPartI

Thisbookisaboutbuildinginteractivecomputergraphicsapplications.InPartI, weconcentrateonstudyinginteractivityandthebuildingofapplications.

Interactivity. Chapter1showsusthatinteractivitydemandstheevent-driven programmingmodelanddiscussestheelementsoftheevent-drivenmodel. Chapter2showsushowtoworkwithspecializedgraphicaluserinterface (GUI)applicationprogramminginterface(API)librariesinimplementing event-driveninteractiveprograms.

Graphics. Chapter3showsushowtodrawsimplegeometricshapeswithcomputergraphics.Chapter4showsustheprinciplesofworkingwithspecializedgraphicsAPIlibraries.

Buildingofapplications. Chapter5showsusthemodel-view-controller (MVC)softwarearchitectureanddemonstrateshowtoapplythisarchitectureinorganizingtheGUIAPI,thegraphicsAPI,andourprogramming codetofacilitatereadability,maintainability,andexpandabilityofourapplication.Chapter6usestheMVCarchitecturetoexplainthesoftware structureofsomereal-worldinteractivegraphicsapplications.

Wewillusethedevelopmentofasimpleexampletoorganizeourdiscussion: aprogramthatallowstheusertosimulatetheshootingofaballundertheinfluenceofgravity.Theusercanspecifyinitialvelocity,createballsofdifferent

(R): Radius

(V): Initial velocity

(A): Initial mouse click position

(B) Dragging

(C) Current mouse position

sizes,shoottheball,andexaminetheparabolicfreefalloftheball.Forclarity, weavoidgraphics-specificcomplexitiesin3Dspaceandconfineourdiscussion to2Dspace.Obviously,oursimpleprogramisneithersophisticatednorrepresentativeofrealapplications.However,withslightlyrefinedspecifications,this examplecontainsalltheessentialcomponentsandbehavioralcharacteristicsof morecomplexreal-worldinteractivesystems.Wewillusethedesignanddevelopmentoftheball-shootingprogramthroughoutallchaptersinPartItohelpus consolidatetheconcepts.

DetailsoftheBall-ShootingProgram

Oursimpleprogramhasthefollowingelementsandbehaviors.

• Theballs(objects). Theusercanleft-mouse-button-clickanddragouta newball(circle)anywhereonthescreen(see FigureI.1).Draggingouta ballincludes:

– (A):initialmouse-button-clickpositiondefinesthecenterofthecircle;

– (B):mouse-button-downandmovingthemouseisthedraggingaction;

– (C):currentmousepositionwhiledraggingallowsustodefinethe radiusandtheinitialvelocity.TheradiusR(inpixelunits)isthedis-

Dragging
FigureI.1. Draggingoutaball.

MotionMotiontrajectory for the next second

Dragged out balls

Ball-Shooting Program

Theball-shootingprogram.

tancetothecenterdefinedin(A).Thevectorfromthecurrentposition tothecenteristheinitialvelocityV(inunitsofpixelspersecond).

Oncecreated,theballwillbegintravelingwiththedefinedinitialvelocity.

• HeroBall (hero/activeobject). Theusercanalsoright-mouse-buttonclicktoselectaballtobethecurrent HeroBall.The HeroBall’svelocity canbecontrolledbythesliderbars(discussedbelow)whereitsvelocity isdisplayed.Anewlycreatedballisbydefaultthecurrent HeroBall. Aright-mouse-button-clickonunoccupiedspaceindicatesthatnocurrent HeroBall exists.

• Velocitysliderbars(GUIelements). Theusercanmonitorandcontrol twosliderbars(x-and y-directionswithmagnitudes)tochangethevelocity ofthe HeroBall.Whenthereisno HeroBall,theslider-barvaluesare undefined.

• Thesimulation.

– Balltraveling/collisions(objectintrinsicbehaviors). Aballknows howtotravelbasedonitscurrentvelocity,andoneballcanpotentially collidewithanother.Forsimplicity,wewillassumethatallballshave identicalmassandthatallcollisionsareperfectlyelastic.

FigureI.2.

– Gravity(externaleffectsonobjects). Thevelocityofaballisconstantlychangingduetothedefinedgravitationalforce.

– Statusbar(application-stateecho). Theusercanmonitortheapplicationstatebyexaminingtheinformationinthestatusbar.Inour application,thenumberofballscurrentlyonthescreenisupdatedin thestatusbar.

Ourapplicationstartswithanemptyscreen.Theuserclicksanddragsto createnewballswithdifferentradiiandvelocities.Onceaballtravelsoffofthe screen,itisremoved.Toavoidunnecessarydetails,wedonotincludethedrawing ofthemotiontrajectoriesorthevelocityvectorinoursolutions.Noticethata sliderbarcommunicatesitscurrentstatetotheuserintwoways:thepositionof thesliderknobandthenumericecho(see FigureI.2).

Wehavenowdescribedthebehaviorofasimpleinteractivegraphicsapplication.Wecanbeginlearningtheconceptsthatsupporttheimplementationof thistypeofapplication.Weconcentrateonissuesconcernedwithinteractionand softwareengineeringpractices.

Another random document with no related content on Scribd:

which were evidently intended to last him several days on his spying expedition. Also two daggers.

My men, who entered fully into the spirit of the joke, chased him out of camp with a well-directed shower of stones. Needless to say, “the starving Tibetan cripple” outran them all. From a high point of vantage I watched him with my telescope. When some distance off he went among some rocks, picked up his matchlock which he had hidden there—and continued his flight. [178]

[Contents]

CHAPTER XVI

As you know, the Tibetans when saluting put out the tongue to its full extent. If they are wearing a cap it is removed and placed upon the ground in sign of respect, especially if the person saluted is of high social standing. The hands, joined with the thumbs together and raised, are waved up and down in front of the forehead.

There is a code of social etiquette among Tibetans even of the most degraded tribes. For instance, it is not customary to enter a tent without first announcing one’s presence and demanding admittance. Also, no Tibetan traveller, except Government messengers, will enter an encampment after dark unless he has warned the inhabitants beforehand.

“Chakzal, Chakzal”

The Tibetan salutation consists in putting out the tongue to its full length.

It must not be argued that because the officials of Tibet—the Lamas particularly —show intense cruelty, especially to foreigners, everybody in [179]Tibet is cruel.

On the contrary, there are many folks in Tibet who possess generous hearts. The people are charitable to a degree, even the poorest sharing what little they have with strangers poorer than themselves. During my captivity in Tibet, on my first expedition, on many occasions individual Tibetans showed sympathy and consideration, when, had it been discovered, it would have cost them their heads. So that, after all, not all Tibetans are bad. If anything—barring the Lamas—the people are rather good-natured and easygoing, easily led and influenced if taken the right way.

Tibetan men are not fighting men, and are, perhaps, the most contemptible cowards in face of danger. Curiously enough, it is not fear of death which makes them pusillanimous, but apparently the notion of getting hurt and the absolute lack of resolution. If ordered by his superiors and impressed with the idea that if killed by the enemy he will find himself in heaven, whereas if he bolts and returns to camp he will be beheaded and go to a hell of ice and snow yes, the Tibetan hell is a cool place; but their heaven is warm, with splendid grazing for yaks!—then, indeed, a Tibetan will stand helplessly to be shot without defending himself, while Maxim guns and [180]shrapnel and other things of the kind are playing upon him. The carnages of the British Tibet Mission, of which we importers of civilisation should not feel too proud, are a good instance of this.

So, again, although a contemptible coward, he does not fear death. I myself, while in Tibet, could confirm this statement by many personal experiences. When officials came to induce me to leave the country they maintained, and it was true, that they had strict orders from Lhassa to drive me away. If they returned unsuccessful from their mission they would, they declared, be beheaded. When I insisted on continuing my journey they frequently handed me their sword, requesting me to cut off their head then and there, which would save them the dishonour of degradation and a public execution.

A Picturesque Old Fellow

Once or twice, as the Tibetans on my first journey had given me a taste of what it felt like to be taken out to the execution ground and have a sword flourished round my neck, I thought that I was fully entitled to try a practical joke and see

what effect the similar sensation would have on Tibetan officers. Only, of course, in my case I had not asked to be beheaded, and therefore the process came more as a surprise, besides being [181]carried out in dead earnest up to, but fortunately with a postponement of, the last stroke.

To go on with my narrative, I pretended to accept the offer of the Tibetan officers, and, calling all my men, lined them up to witness the execution. The Tibetan officers knelt down, somewhat trembling but quite resigned, and cleared their necks to make my work easy. Many of them did not flinch, but some did when I approached, brandishing the sword in their own fashion; and, by Jove! the latter proved themselves to be the champion runners of the country. Naturally, I never injured these fellows in any way, and when they showed any determination at all I always gave them a suitable present of some sort or other.

After the performance was over they fully entered into the humour of the joke themselves, and we used to have very hearty laughs over it, and endless cups of tea.

When you travel in Tibet you see, in the daytime, men and women garbed in heavy skin coats; only one sleeve at a time is put on while half the chest and the other arm are left bare. This, to any one not suspecting the reason, looks very incongruous, and has led to all sorts of ridiculous [182]explanations from the usual theoretical scientists at home. The real explanation is simple and is this.

As I have elsewhere explained, the heat of the sun is in Tibet very great— especially in Southern Tibet,—the latitude not being many degrees north, and the power of the sun’s rays is even intensified by the clearness of the rarefied air. On the other hand, owing to the immense elevation, the cold is intense wherever the sun does not strike, so that it is not uncommon to feel absolutely roasted on the sunny side and frozen on the other. Hence the necessity of having winter clothing to cover half your anatomy, while the other half demands nothing more than tropical bareness.

The Tibetans are not artistic by nature. Their art is of the most rudimentary kind. A few earthen pots, graceful enough in shape, but of no extraordinary beauty, are manufactured by them, and some brass and iron vessels are made in the cities. Also, of course, in a population of several millions there have been a few individuals who have attempted more ambitious works of art, such as paintings (mostly of religious subjects) and sculptures, but although in the

An Ambidexter Lama Sculptor carving an Inscription on the Face of a Rock

paintings the colouring is bright, and much care is devoted to [183]details, anatomical accuracy and proportion are always lacking in the figures, and not even a shade of perspective is to be noticed in their landscapes. In certain conventional decorative ways, however, the Tibetans are quite masters, as, for instance, in the gigantic religious inscriptions one frequently finds all over the country upon dangerous vertical cliffs. One of the coloured plates given in this book represents a young Lama—the Lamas can always be distinguished in Tibet by their clean-shaven heads—inscribing the words “Ommanipadmehum” upon the face of a rock. The work is carried on at a great height, the artist being suspended in a rope sling. Lamas with any special talent in this direction are kept in monasteries and sent all over the country to adorn the barren landscape, especially on high caravan routes, with these sacred characters. Perhaps, when Tibet has been fully opened to foreign civilisation, these talents will find a more remunerative occupation in substituting for the sacred words advertisements of fancy soaps and hair restorers.

These sculptors, and, in fact, most of the cleverer Tibetans, are practically ambidexter, being able to use either hand, especially in works which require no great delicacy of touch. As can [184]be seen in the illustration, the young Lama is using the hammer with his left hand.

The cloth made by Tibetans is of great strength, especially fabrics of yak hair, but seldom of a handsome design. Very irregular designs are occasionally attempted, but usually the Tibetan woman is wise enough never to depart from the striped pattern. Tibetan fabrics are generally woven too narrow for any practical use in European countries. [185]

[Contents]

CHAPTER XVII

Perhaps some of the experiences we had on our trip across country may interest the reader. Instead of returning by Tinker we proceeded in a north-westerly direction, employing an old man—a most peculiar fellow, so wrinkled that he seemed almost mummified—who said he knew the way across the intricate ranges. When we had nearly reached the summit of the range, we came in for a very bad storm, a regular blizzard, and it delayed us for some hours. My guide, as is usual with guides, lost his head, and, what was worse, also his way. We could not remain where we were, and we could not see where we were going.

I took matters into my own hands, and, by compass, tried to find my way to where I supposed the place was; but we experienced great difficulty in getting along, owing to the snow being driven with great force into our faces and obscuring the [186]view a few yards away from us. I found the pass right enough, the blizzard abating for a few moments, and we sank in soft snow up to our knees, which made marching very heavy. We descended a few hundred feet and found ourselves in a sort of gully, which necessitated making another ascent to a higher and more difficult pass before we could descend into the valley where the sources of the Ganges are to be found.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.