Compare commits

..

6 Commits

23 changed files with 54 additions and 1025 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
out/*
*.bib

View File

@ -1,50 +1,9 @@
# Tesi di laurea triennale in ingegneria informatica presso l'Unisannio.
# Tesi di laurea triennale
- **titolo**: Un'analisi del toolkit ARCore per la realtà aumentata in ambiente mobile
- **autore**: Raffaele Mignone
- **relatore**: Prof. Gerardo Canfora
```
Autore: Raffaele Mignone
Argomento: ARCore
Relatore: Prof. Gerardo Canfora
```
## Abstract
Con il termine realtà aumentata viene indicata una serie di tecnologie che permettono di aggiungere nuovo contenuto percettivo al mondo reale che ci circonda generato mediante l'ausilio di un calcolatore.
In un primo momento le tecnologie di AR erano veicolate mediante l'utilizzo di appositi visori e dispositivi che rendevano difficile e costoso l'accesso ad esse per il mercato consumers.
Tuttavia il continuo progresso tecnologico e la crescente capacità computazionale dei devices mobili ha permesso una sempre maggiore diffusione di queste nuove tecnologie.
A fronte di ciò sono nati numerosi framework per lo sviluppo di esperienze di realtà aumentata per dispositivi mobili.
In questo documento si è svolta un'analisi del tool ARCore e della libreria grafica Sceneform, al fine di comprendere e valutare le possibilità messe a disposizione da queste soluzioni.
In seguito a quest'analisi è stato possibile isolare una serie di punti a favore come:
- Licenza open source
- Disponibilità dell'SDK per svariati ambienti di sviluppo
- Ottime capacità nel riconoscimento dell'ambiente reale
- Esperienze di AR cross devices
- Documentazione completa ed esaustiva
Ma anche degli inconvenienti più o meno limitati:
- Supporto limitato alle tecnologie di marker based
- Difficoltà nel riconoscere superfici piane verticali
- Gestione carente degli eventi di interesse
- Supporto quasi nullo al movimento e alle animazioni
## Ringraziamenti
Un ringraziamento speciale alla mia famiglia, e in particolar modo ai miei genitori e a Noemi, per avermi supportato e sopportato durante questi anni, soprattutto nei momenti di difficoltà.
Un ringraziamento al mio relatore, il Prof. Gerardo Canfora, per la sua disponibilità e per il supporto.
Un ringraziamento ad *André Miede* per aver realizzato il pacchetto LaTeX *ClassicThesis* con cui è stato realizzato questo documento. Un grazie anche a *Mike M* e *Jarlan Perez* per aver realizzato i modelli utilizzati nelle varie applicazioni.
Dal punto di vista tecnico nessuna parte di questa tesi sarebbe stata possibile senza il lavoro di centinaia di volontari sparsi in tutto il mondo, che hanno contribuito ai software open source utilizzati in questa tesi, tra cui, neovim, Arch Linux, git, pandoc, LaTeX, Zotero e il kernel Linux.
Infine vorrei esprimere la più sincera gratitudine a chiunque abbia letto le prime versioni di questo documento, grazie per i preziosi suggerimenti.
## Impaginazione
L'impaginazione di questa tesi è avvenuto attraverso [pandoc][] e il template [LaTeKiSS][latekiss].
[pandoc]: https://pandoc.org/
[latekiss]: https://github.com/norangebit/LaTeKiSS
**Better readme coming soon**

View File

@ -1,48 +1 @@
mkdir out
pandoc src/*.md src/metadata.yaml \
-o out/thesis_monochrome_oneside.pdf \
--template latekiss \
--resource-path src \
--top-level-division chapter \
-F pandoc-crossref \
--citeproc \
--csl ieee.csl \
--bibliography src/bib.bib \
--highlight-style monochrome
pandoc src/*.md src/metadata.yaml \
-o out/thesis_monochrome_twoside.pdf \
-V twoside \
--template latekiss \
--resource-path src \
--top-level-division chapter \
-F pandoc-crossref \
--citeproc \
--csl ieee.csl \
--bibliography src/bib.bib \
--highlight-style monochrome
pandoc src/*.md src/metadata.yaml \
-o out/thesis_oneside.pdf \
-V colorlinks \
--template latekiss \
--resource-path src \
--top-level-division chapter \
-F pandoc-crossref \
--citeproc \
--csl ieee.csl \
--bibliography src/bib.bib \
pandoc src/*.md src/metadata.yaml \
-o out/thesis_twoside.pdf \
-V colorlinks \
-V twoside \
--template latekiss \
--resource-path src \
--top-level-division chapter \
-F pandoc-crossref \
--citeproc \
--csl ieee.csl \
--bibliography src/bib.bib \
pandoc src/*.md --bibliography src/bib.bib --resource-path src -o out/thesis.pdf

400
ieee.csl
View File

@ -1,400 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="sort-only">
<info>
<title>IEEE</title>
<id>http://www.zotero.org/styles/ieee</id>
<link href="http://www.zotero.org/styles/ieee" rel="self"/>
<link href="https://ieeeauthorcenter.ieee.org/wp-content/uploads/IEEE-Reference-Guide.pdf" rel="documentation"/>
<link href="https://journals.ieeeauthorcenter.ieee.org/your-role-in-article-production/ieee-editorial-style-manual/" rel="documentation"/>
<author>
<name>Michael Berkowitz</name>
<email>mberkowi@gmu.edu</email>
</author>
<contributor>
<name>Julian Onions</name>
<email>julian.onions@gmail.com</email>
</contributor>
<contributor>
<name>Rintze Zelle</name>
<uri>http://twitter.com/rintzezelle</uri>
</contributor>
<contributor>
<name>Stephen Frank</name>
<uri>http://www.zotero.org/sfrank</uri>
</contributor>
<contributor>
<name>Sebastian Karcher</name>
</contributor>
<contributor>
<name>Giuseppe Silano</name>
<email>g.silano89@gmail.com</email>
<uri>http://giuseppesilano.net</uri>
</contributor>
<contributor>
<name>Patrick O'Brien</name>
</contributor>
<contributor>
<name>Brenton M. Wiernik</name>
</contributor>
<category citation-format="numeric"/>
<category field="engineering"/>
<category field="generic-base"/>
<summary>IEEE style as per the 2018 guidelines, V 11.12.2018.</summary>
<updated>2020-06-15T03:21:46+00:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="en">
<terms>
<term name="chapter" form="short">ch.</term>
<term name="presented at">presented at the</term>
<term name="available at">available</term>
</terms>
</locale>
<!-- Macros -->
<macro name="status">
<choose>
<if variable="page issue volume" match="none">
<text variable="status" text-case="capitalize-first" suffix="" font-weight="bold"/>
</if>
</choose>
</macro>
<macro name="edition">
<choose>
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference report song" match="any">
<choose>
<if is-numeric="edition">
<group delimiter=" ">
<number variable="edition" form="ordinal"/>
<text term="edition" form="short"/>
</group>
</if>
<else>
<text variable="edition" text-case="capitalize-first" suffix="."/>
</else>
</choose>
</if>
</choose>
</macro>
<macro name="issued">
<choose>
<if type="article-journal report" match="any">
<date variable="issued">
<date-part name="month" form="short" suffix=" "/>
<date-part name="year" form="long"/>
</date>
</if>
<else-if type="bill book chapter graphic legal_case legislation motion_picture song thesis" match="any">
<date variable="issued">
<date-part name="year" form="long"/>
</date>
</else-if>
<else-if type="paper-conference" match="any">
<date variable="issued">
<date-part name="month" form="short"/>
<date-part name="year" prefix=" "/>
</date>
</else-if>
<else>
<date variable="issued">
<date-part name="month" form="short" suffix=" "/>
<date-part name="day" form="numeric-leading-zeros" suffix=", "/>
<date-part name="year"/>
</date>
</else>
</choose>
</macro>
<macro name="author">
<names variable="author">
<name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/>
<label form="short" prefix=", " text-case="capitalize-first"/>
<et-al font-style="italic"/>
<substitute>
<names variable="editor"/>
<names variable="translator"/>
</substitute>
</names>
</macro>
<macro name="editor">
<names variable="editor">
<name initialize-with=". " delimiter=", " and="text"/>
<label form="short" prefix=", " text-case="capitalize-first"/>
</names>
</macro>
<macro name="locators">
<group delimiter=", ">
<text macro="edition"/>
<group delimiter=" ">
<text term="volume" form="short"/>
<number variable="volume" form="numeric"/>
</group>
<group delimiter=" ">
<number variable="number-of-volumes" form="numeric"/>
<text term="volume" form="short" plural="true"/>
</group>
<group delimiter=" ">
<text term="issue" form="short"/>
<number variable="issue" form="numeric"/>
</group>
</group>
</macro>
<macro name="title">
<choose>
<if type="bill book graphic legal_case legislation motion_picture song" match="any">
<text variable="title" font-style="italic"/>
</if>
<else>
<text variable="title" quotes="true"/>
</else>
</choose>
</macro>
<macro name="publisher">
<choose>
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference song" match="any">
<group delimiter=": ">
<text variable="publisher-place"/>
<text variable="publisher"/>
</group>
</if>
<else>
<group delimiter=", ">
<text variable="publisher"/>
<text variable="publisher-place"/>
</group>
</else>
</choose>
</macro>
<macro name="event">
<choose>
<if type="paper-conference speech" match="any">
<choose>
<!-- Published Conference Paper -->
<if variable="collection-editor editor editorial-director issue page volume" match="any">
<group delimiter=", ">
<group delimiter=" ">
<text term="in"/>
<text variable="container-title" font-style="italic"/>
</group>
<text variable="event-place"/>
</group>
</if>
<!-- Unpublished Conference Paper -->
<else>
<group delimiter=", ">
<group delimiter=" ">
<text term="presented at"/>
<text variable="event"/>
</group>
<text variable="event-place"/>
</group>
</else>
</choose>
</if>
</choose>
</macro>
<macro name="access">
<choose>
<if type="webpage post post-weblog" match="any">
<choose>
<if variable="URL">
<group delimiter=" ">
<text variable="URL"/>
<group delimiter=" " prefix="(" suffix=")">
<text term="accessed"/>
<date variable="accessed">
<date-part name="month" form="short" strip-periods="false"/>
<date-part name="day" form="numeric-leading-zeros" prefix=" " suffix=", "/>
<date-part name="year" form="long"/>
</date>
</group>
</group>
</if>
</choose>
</if>
<else-if match="any" variable="DOI">
<text variable="DOI" prefix="doi: "/>
</else-if>
<else>
<group delimiter=". ">
<group delimiter=": ">
<text term="accessed" text-case="capitalize-first"/>
<date variable="accessed">
<date-part name="month" form="short" suffix=" "/>
<date-part name="day" form="numeric-leading-zeros" suffix=", "/>
<date-part name="year"/>
</date>
</group>
<text term="online" prefix="[" suffix="]" text-case="capitalize-first"/>
<group delimiter=": ">
<text term="available at" text-case="capitalize-first"/>
<text variable="URL"/>
</group>
</group>
</else>
</choose>
</macro>
<macro name="page">
<choose>
<if type="article-journal" variable="number" match="all">
<group delimiter=" ">
<text value="Art."/>
<text term="issue" form="short"/>
<text variable="number"/>
</group>
</if>
<else>
<group delimiter=" ">
<label variable="page" form="short"/>
<text variable="page"/>
</group>
</else>
</choose>
</macro>
<macro name="citation-locator">
<group delimiter=" ">
<choose>
<if locator="page">
<label variable="locator" form="short"/>
</if>
<else>
<label variable="locator" form="short" text-case="capitalize-first"/>
</else>
</choose>
<text variable="locator"/>
</group>
</macro>
<!-- Citation -->
<citation collapse="citation-number">
<sort>
<key variable="citation-number"/>
</sort>
<layout delimiter=", ">
<group prefix="[" suffix="]" delimiter=", ">
<text variable="citation-number"/>
<text macro="citation-locator"/>
</group>
</layout>
</citation>
<!-- Bibliography -->
<bibliography entry-spacing="0" second-field-align="flush">
<layout suffix=".">
<!-- Citation Number -->
<text variable="citation-number" prefix="[" suffix="]"/>
<!-- Author(s) -->
<text macro="author" suffix=", "/>
<!-- Rest of Citation -->
<choose>
<!-- Specific Formats -->
<if type="article-journal">
<group delimiter=", ">
<text macro="title"/>
<text variable="container-title" font-style="italic" form="short"/>
<text macro="locators"/>
<text macro="page"/>
<text macro="issued"/>
<text macro="status"/>
<text macro="access"/>
</group>
</if>
<else-if type="paper-conference speech" match="any">
<group delimiter=", ">
<text macro="title"/>
<text macro="event"/>
<text macro="issued"/>
<text macro="locators"/>
<text macro="page"/>
<text macro="status"/>
<text macro="access"/>
</group>
</else-if>
<else-if type="report">
<group delimiter=". ">
<group delimiter=", ">
<text macro="title"/>
<text macro="publisher"/>
<group delimiter=" ">
<text variable="genre"/>
<text variable="number"/>
</group>
<text macro="issued"/>
</group>
<text macro="access"/>
</group>
</else-if>
<else-if type="thesis">
<group delimiter=", ">
<text macro="title"/>
<text variable="genre"/>
<text macro="publisher"/>
<text macro="issued"/>
</group>
</else-if>
<else-if type="webpage post-weblog post" match="any">
<group delimiter=", " suffix=". ">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="patent">
<group delimiter=", ">
<text macro="title"/>
<text variable="number"/>
<text macro="issued"/>
</group>
</else-if>
<!-- Generic/Fallback Formats -->
<else-if type="bill book graphic legal_case legislation motion_picture report song" match="any">
<group delimiter=", " suffix=". ">
<text macro="title"/>
<text macro="locators"/>
</group>
<group delimiter=", ">
<text macro="publisher"/>
<text macro="issued"/>
<text macro="page"/>
</group>
</else-if>
<else-if type="article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage" match="any">
<group delimiter=", ">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="locators"/>
<text macro="publisher"/>
<text macro="page"/>
<text macro="issued"/>
</group>
</else-if>
<else-if type="chapter paper-conference" match="any">
<group delimiter=", " suffix=", ">
<text macro="title"/>
<group delimiter=" ">
<text term="in"/>
<text variable="container-title" font-style="italic"/>
</group>
<text macro="locators"/>
</group>
<text macro="editor" suffix=" "/>
<group delimiter=", ">
<text macro="publisher"/>
<text macro="issued"/>
<text macro="page"/>
</group>
</else-if>
<else>
<group delimiter=", " suffix=". ">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="locators"/>
</group>
<group delimiter=", ">
<text macro="publisher"/>
<text macro="page"/>
<text macro="issued"/>
<text macro="access"/>
</group>
</else>
</choose>
</layout>
</bibliography>
</style>

View File

@ -1,265 +0,0 @@
@online{googlear:FundamentalConceptsARCore:2019,
langid = {english},
title = {Fundamental {{Concepts}} | {{ARCore}}},
url = {https://developers.google.com/ar/discover/concepts},
journaltitle = {Google Developers},
urldate = {2018-12-27},
date = {2019},
author = {Google AR},
file = {/home/orange/Zotero/storage/NINGMDA4/concepts.html}
}
@online{denniswilliamsHistoryAugmentedReality2016,
langid = {american},
title = {The {{History}} of {{Augmented Reality}} ({{Infographic}})},
url = {https://www.huffingtonpost.com/dennis-williams-ii/the-history-of-augmented-_b_9955048.html},
abstract = {Surprisingly enough, augmented reality has been in the works for several decades before sprouting to what it is today.
Augmented Reality (AR) and V...},
journaltitle = {Huffington Post},
urldate = {2018-12-29},
date = {2016-05-13T19:18:24Z},
author = {, Dennis Williams},
file = {/home/orange/Zotero/storage/KI9WMPQ7/the-history-of-augmented-_b_9955048.html}
}
@online{kastrenakesGoogleProjectTango2017,
title = {Googles {{Project Tango}} Is Shutting down Because {{ARCore}} Is Already Here},
url = {https://www.theverge.com/2017/12/15/16782556/project-tango-google-shutting-down-arcore-augmented-reality},
abstract = {Google said today that itll be shutting down Project Tango next year, on March 1st. Project Tango was an early effort from Google to bring augmented reality to phones, but it never really panned...},
journaltitle = {The Verge},
urldate = {2018-12-29},
date = {2017-12-15T16:21:44-05:00},
author = {Kastrenakes},
file = {/home/orange/Zotero/storage/SXW5RLUR/project-tango-google-shutting-down-arcore-augmented-reality.html}
}
@online{kastrenakesGoogleProjectTango2017a,
title = {Googles {{Project Tango}} Is Shutting down Because {{ARCore}} Is Already Here},
url = {https://www.theverge.com/2017/12/15/16782556/project-tango-google-shutting-down-arcore-augmented-reality},
abstract = {Google said today that itll be shutting down Project Tango next year, on March 1st. Project Tango was an early effort from Google to bring augmented reality to phones, but it never really panned...},
journaltitle = {The Verge},
urldate = {2018-12-29},
date = {2017-12-15T16:21:44-05:00},
author = {Kastrenakes, Jacob},
file = {/home/orange/Zotero/storage/WUJ2G4LS/project-tango-google-shutting-down-arcore-augmented-reality.html}
}
@online{williamsii:HistoryAugmentedReality:2016,
langid = {american},
title = {The {{History}} of {{Augmented Reality}} ({{Infographic}})},
url = {https://www.huffingtonpost.com/dennis-williams-ii/the-history-of-augmented-_b_9955048.html},
abstract = {Surprisingly enough, augmented reality has been in the works for several decades before sprouting to what it is today.
Augmented Reality (AR) and V...},
journaltitle = {Huffington Post},
urldate = {2018-12-29},
date = {2016-05-13T19:18:24Z},
author = {Williams II, Dennis},
file = {/home/orange/Zotero/storage/5GVMS8BC/the-history-of-augmented-_b_9955048.html}
}
@video{googleatap:SayHelloProject:2014,
title = {Say Hello to {{Project Tango}}!},
url = {https://www.youtube.com/watch?v=Qe10ExwzCqk},
urldate = {2018-12-29},
date = {2014},
director = {{Google ATAP}}
}
@online{eddy:GoogleFuturePhones:2015,
langid = {english},
title = {Google: {{Future Phones Will Understand}}, {{See}} the {{World}}},
url = {https://www.pcmag.com/article2/0,2817,2485294,00.asp},
shorttitle = {Google},
abstract = {Google's Project Tango is working toward a world where mobile devices can find and guide you in any situation.},
journaltitle = {PCMAG},
urldate = {2018-12-29},
date = {2015-06-03},
author = {Eddy, Max},
file = {/home/orange/Zotero/storage/QJSNYSGZ/0,2817,2485294,00.html}
}
@online{apple:ARKitAppleDeveloper:2019,
langid = {english},
title = {{{ARKit}} - {{Apple Developer}}},
url = {https://developer.apple.com/arkit/},
abstract = {Build unparalleled augmented reality experiences for hundreds of millions of users on iOS — the biggest AR platform in the world. With ARKit 2 on iOS 12, your AR apps can now be experienced by multiple users simultaneously, and resumed at a later time in the same state. You can also incorporate real-world objects into your AR experiences, giving your users even greater immersive opportunities.},
urldate = {2018-12-29},
date = {2019},
author = {Apple},
file = {/home/orange/Zotero/storage/G9KNR64S/arkit.html}
}
@online{microsoft:MicrosoftHoloLens:2019,
langid = {american},
title = {Microsoft {{HoloLens}}},
url = {https://www.microsoft.com/en-us/hololens},
abstract = {Transform your world with holograms. Microsoft HoloLens brings high-definition holograms to life in your world.},
urldate = {2018-12-29},
date = {2019},
author = {Microsoft},
file = {/home/orange/Zotero/storage/HLJH72FJ/hololens.html}
}
@online{googlear:ARCoreGoogleDeveloper:2019,
langid = {english},
title = {{{ARCore}} - {{Google Developer}} | {{ARCore}}},
url = {https://developers.google.com/ar/},
abstract = {With ARCore, build new augmented reality experiences that seamlessly blend the digital and physical worlds. Transform the way people play, shop, learn, create, and experience the world together—at Google scale.},
journaltitle = {Google Developers},
urldate = {2018-12-29},
date = {2019},
author = {Google AR}
}
@article{vanhemert:ARExperimentThat:2015,
entrysubtype = {magazine},
title = {An {{AR Experiment That Works Like}} an {{Ad Blocker}} for {{Real Life}}},
issn = {1059-1028},
url = {https://www.wired.com/2015/01/adblock-real-life-adblock-real-life/},
abstract = {In a future of persistent, personalized ads on-screen and off, ad-defeating mechanisms could become a necessary countermeasure},
journaltitle = {Wired},
urldate = {2018-12-29},
date = {2015-01-30T11:30:59.000Z},
author = {VanHemert, Kyle},
file = {/home/orange/Zotero/storage/HPAZ8A5Y/adblock-real-life-adblock-real-life.html}
}
@online{pokemongodeathtracker:PokemonGODeath:2019,
title = {Pokémon {{GO Death Tracker}}},
url = {http://pokemongodeathtracker.com/},
abstract = {Keeping track of the Pokémon GO death machine},
urldate = {2018-12-29},
date = {2019},
author = {Pokemongodeathtracker},
file = {/home/orange/Zotero/storage/LU5LKWPK/pokemongodeathtracker.com.html}
}
@online{vuforia:VuforiaAugmentedReality:2019,
title = {Vuforia | {{Augmented Reality}} for the {{Industrial Enterprise}}},
url = {https://www.vuforia.com/},
urldate = {2018-12-29},
date = {2019},
author = {Vuforia},
file = {/home/orange/Zotero/storage/94HD3DK7/www.vuforia.com.html}
}
@misc{sutherland:HeadmountedThreedimensionalDisplay:1968,
langid = {american},
title = {A Head-Mounted Three-Dimensional Display},
date = {1968},
author = {Sutherland, Ivan E.}
}
@inreference{:Matrix:2018,
langid = {english},
title = {\emph{The }{{\emph{Matrix}}}},
url = {https://en.wikipedia.org/w/index.php?title=The_Matrix&oldid=875676363},
abstract = {The Matrix is a 1999 science fiction action film written and directed by The Wachowskis and starring Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss, Hugo Weaving, and Joe Pantoliano. It depicts a dystopian future in which reality as perceived by most humans is actually a simulated reality called "the Matrix", created by sentient machines to subdue the human population, while their bodies' heat and electrical activity are used as an energy source. Cybercriminal and computer programmer Neo learns this truth and is drawn into a rebellion against the machines, which involves other people who have been freed from the "dream world".
The Matrix is known for popularizing a visual effect known as "bullet time", in which the heightened perception of certain characters is represented by allowing the action within a shot to progress in slow-motion while the camera's viewpoint appears to move through the scene at normal speed. The film is an example of the cyberpunk subgenre. It contains numerous references to philosophical and religious ideas, and pays homage to works such as Plato's Allegory of the Cave, Jean Baudrillard's Simulacra and Simulation, Lewis Carroll's Alice's Adventures in Wonderland, and Masamune Shirow's Ghost in the Shell. The Wachowskis' approach to action scenes drew upon their admiration for Japanese animation and martial arts films, and the film's use of fight choreographers and wire fu techniques from Hong Kong action cinema influenced subsequent Hollywood action film productions.
The Matrix was first released in the United States on March 31, 1999 and grossed over \$460 million worldwide. It was well-received by critics and won four Academy Awards, as well as other accolades, including BAFTA Awards and Saturn Awards. Reviewers praised The Matrix for its innovative visual effects, cinematography and entertainment value. The film has since appeared in lists of the greatest science fiction films, and, in 2012, was added to the National Film Registry for preservation. The success of the film led to the release of two feature film sequels, both written and directed by the Wachowskis: The Matrix Reloaded and The Matrix Revolutions. The Matrix franchise was further expanded through the production of comic books, video games and animated short films, in which the Wachowskis were heavily involved, and even inspired books and theories on ideas in religion and philosophy.},
booktitle = {Wikipedia},
urldate = {2018-12-30},
date = {2018-12-28T06:57:50Z},
file = {/home/orange/Zotero/storage/9YZLGKGK/index.html},
note = {Page Version ID: 875676363}
}
@movie{wachowski:Matrix:1999,
title = {The {{Matrix}}},
date = {1999},
director = {Wachowski, Andy and Wachowski, Larry}
}
@movie{favreau:IronMan:2008,
title = {Iron {{Man}}},
date = {2008},
director = {Favreau, Jon}
}
@online{x:Glass:2019,
langid = {english},
title = {Glass},
url = {https://x.company/glass/},
abstract = {Glass Enterprise Edition is a hands-free device, for hands-on workers that removes distractions and helps you focus on what's most important.},
urldate = {2018-12-30},
date = {2019},
author = {X},
file = {/home/orange/Zotero/storage/7MFTCVJ6/glass.html}
}
@misc{milgram:AugmentedRealityClass:1994,
langid = {english},
title = {Augmented {{Reality}}: {{A}} Class of Displays on the Reality-Virtuality Continuum},
abstract = {In this paper we discuss Augmented Reality (AR) displays in a general sense, within the context of aReality-Virtuality (RV) continuum, encompassing a large class of "Mixed Reality" (MR) displays, whichalso includes Augmented Virtuality (AV). MR displays are defined by means of seven examples of existingdisplay concepts in which real objects and virtual objects are juxtaposed. Essential factors which distinguishdifferent Mixed Reality display systems from each other are presented, first by means of a table in whichthe nature of the underlying scene, how it is viewed, and the observer's reference to it are compared, andthen by means of a three dimensional taxonomic framework, comprising: Extent of World Knowledge(EWK), Reproduction Fidelity (RF) and Extent of Presence Metaphor (EPM). A principal objective of thetaxonomy is to clarify terminology issues and to provide a framework for classifying research acrossdifferent disciplines},
date = {1994},
author = {Milgram, Paul and Takemura, Haruo and Utsumi, Akira and Kishino, Fumio}
}
@software{googlear:SceneformSDKAndroid:2019,
title = {Sceneform {{SDK}} for {{Android}}.},
url = {https://github.com/google-ar/sceneform-android-sdk},
organization = {{Google AR}},
urldate = {2019-01-03},
date = {2019-01-02T11:52:45Z},
author = {Google AR},
origdate = {2018-05-08T02:35:07Z}
}
@online{googlear:Animated3DObjects:2019,
langid = {english},
title = {Animated {{3D Objects}} Are Not Working · {{Issue}} \#182 · Google-Ar/Sceneform-Android-Sdk},
url = {https://github.com/google-ar/sceneform-android-sdk/issues/182},
abstract = {Hai i downloaded 3D Animated object and i\&\#39;am importing it using sceneForm successfully in my Android Studio, but i\&\#39;am not getting Any animation Effect can u help me how to make that work in...},
journaltitle = {GitHub},
urldate = {2019-01-14},
date = {2019},
author = {Google AR},
file = {/home/orange/Zotero/storage/A9K4DTEA/11.html}
}
@software{googlear:ChromaKey:2019,
title = {Chroma {{Key}}},
url = {https://github.com/google-ar/sceneform-android-sdk},
organization = {{Google AR}},
urldate = {2019-01-16},
date = {2019-01-15T20:11:39Z},
author = {Google AR},
origdate = {2018-05-08T02:35:07Z}
}
@online{firebase:Firebase:2019,
langid = {english},
title = {Firebase},
url = {https://firebase.google.com/},
abstract = {Firebase is Googles mobile platform that helps you quickly develop high-quality apps and grow your business.},
urldate = {2019-01-22},
date = {2019},
author = {Firebase, Google},
file = {/home/orange/Zotero/storage/5HEKN7TX/firebase.google.com.html}
}
@online{googlebrain:TensorFlow:2019,
langid = {english},
title = {{{TensorFlow}}},
url = {https://www.tensorflow.org/},
abstract = {An open source machine learning framework for everyone},
urldate = {2019-01-23},
date = {2019},
author = {Google Brain},
file = {/home/orange/Zotero/storage/2FPKGYWD/www.tensorflow.org.html}
}
@online{firebase:IntroducingMLKit:2018,
langid = {english},
title = {Introducing {{ML Kit}} for {{Firebase}}},
url = {http://firebase.googleblog.com/2018/05/introducing-ml-kit-for-firebase.html},
abstract = {The official blog for Firebase, Google's mobile development platform},
journaltitle = {The Firebase Blog},
urldate = {2019-01-23},
date = {2018},
author = {Firebase, Google},
file = {/home/orange/Zotero/storage/ZC6Z9FI6/introducing-ml-kit-for-firebase.html}
}

View File

@ -2,31 +2,31 @@
## Definizione
Con il termine \ac{AR}, si intende un insieme di tecnologie mediante le quali è possibile arricchire, *"aumentare"*, gli oggetti che risiedono nel mondo reale con del contenuto percettivo[^olfactory] generato da un calcolatore.
Con il termine ***augmented reality***(da qui in poi AR), si intende un insieme di tecnologie mediante le quali è possibile arricchire, *"aumentare"*, gli oggetti che risiedono nel mondo reale con del contenuto percettivo[^olfactory] generato da un calcolatore.
Mediante l'AR è possibile aggiungere, AR *costruttiva*, o rimuovere, *AR de-costruttiva*[^destructive], contenuto informativo al mondo che ci circonda.
Risulta importate non fare confusione tra AR e \ac{VR}, in quanto la prima, parte dal mondo reale per aggiungerci del contenuto, mentre la seconda, si pone l'obiettivo di sostituire completamente il mondo reale con uno, generato da un computer.
Risulta importate non fare confusione tra AR e VR(virtual reality), in quanto la prima, parte dal mondo reale per aggiungerci del contenuto, mentre la seconda, si pone l'obiettivo di sostituire completamente il mondo reale con uno, generato da un computer.
Recentissima, per applicazione, invece è la \ac{MR}, che può essere definita come un'AR potenziata, infatti in un'esperienza di MR l'utente oltre a percepire oggetti virtuali è in grado anche di interagire con essi.
Recentissima, per applicazione, invece è l'MR(mixed reality), che può essere definita come un'AR potenziata, infatti in un'esperienza di MR l'utente oltre a percepire oggetti virtuali è in grado anche di interagire con essi.
Volendo elaborare una definizione di questi concetti, usando un paragone cinematografico, possiamo dire che in *The Matrix*[@wachowski:Matrix:1999] viene usata la VR.
Invece in *Iron Man*[@favreau:IronMan:2008] quando *Tony Stark* è in volo e gli vengono mostrate a video informazioni aggiuntive sta usando l'AR, mentre quando interagisce con gli ologrammi sta usando tecnologie di mixed reality.
Per una definizione più accurata possiamo ricorrere a quella elaborata nel 1994 da *Paul Milgram* e da alcuni suoi colleghi, che introducono il concetto di ***reality-virtuality continuum***[@milgram:AugmentedRealityClass:1994].
Nel loro lavoro hanno definito un segmento (vedi fig. \ref{rvc}) che ha ai propri estremi, da un lato l'ambiente reale, quello in cui viviamo, e dall'altro quello virtuale, completamente generato al computer.
Nel loro lavoro hanno definito un segmento(vedi fig. \ref{rvc}) che ha ai propri estremi, da un lato l'ambiente reale, quello in cui viviamo, e dall'altro quello virtuale, completamente generato al computer.
Esattamente a metà strada tra essi risiede la realtà mista, dove gli oggetti reali e virtuali convivono ed hanno pari valenza.
Inoltre hanno definito due stati intermedi.
- ***\ac{AV}***:
- **Augmented Virtuality(AV)**:
Stato in cui alcuni elementi reali entrano in contatto con un mondo totalmente generato al computer.
Sebbene il termine AV sia quello meno conosciuto tra quelli citati, probabilmente tutti noi ne abbiamo avuto esperienza diretta.
Basti pensare a tecnologie come la *Nintendo Wii*, al *Kinect*, o ai più moderni giochi per smartphone basati su giroscopio e accelerometro, in cui il movimento (reale) del giocatore va ad influenzare il gioco.
Basti pensare a tecnologie come la *Nintendo Wii*, al *Kinect*, o ai più moderni giochi per smartphone basati su giroscopio e accelerometro, in cui il movimento(reale) del giocatore va ad influenzare il gioco.
- ***Augmented Reality***:
Stato in cui alcuni elementi virtuali coesistono nel mondo reale, andando ad ampliarne i confini.
![Reality Virtuality Continuum](figures/rvc.png){#rvc width=400 height=250px}
![Reality Virtuality Continuum](figures/rvc.png){#rvc width=300 height=200px}
## Storia
@ -35,28 +35,28 @@ Obiettivo di questa macchina era estendere l'esperienza audio-visiva del cinema
Durante la visione lo spettatore veniva immerso nell'azione grazie ad una visone 3D e all'audio stereofonico, inoltre poteva percepire il vento, le vibrazioni, generate tramite l'inclinazione della macchina, e addirittura gli odori.
Nonostante le potenzialità della macchina[^cinema-4d], per mancanza di investitori, *Heilig* fu costretto ad abbandonare il suo progetto.
Una prima applicazione di AR *moderna* invece la troviamo nel 1968 quando *Ivan Sutherland* costruisce il primo visore (vedi fig. \ref{sutherland}) in grado di aggiungere elementi generati dal computer alla visione umana[@sutherland:HeadmountedThreedimensionalDisplay:1968].
Una prima applicazione di AR *moderna* invece la troviamo nel 1968 quando *Ivan Sutherland* costruisce il primo visore(vedi fig. \ref{sutherland}) in grado di aggiungere elementi generati dal computer alla visione umana[@sutherland:HeadmountedThreedimensionalDisplay:1968].
Mentre per il battesimo si dovrà attendere il 1990 quanto *Tom Caudell* introduce per la prima volta il termine *augmented reality*.
![Vista frontale del visore di Sutherland](figures/headmounted2.jpg){#sutherland width=400 height=250px}
![Vista frontale del visore di Sutherland](figures/headmounted2.jpg){#sutherland width=300 height=200px}
Sempre agli inizi degli anni 90 arriva anche la prima applicazione non accademica da parte dell'aviazione Americana.
Tramite degli *head-up display*, ovvero un visore a sovrimpressione, venivano mostrate ai piloti delle informazioni aggiuntive, come velocità, quota, beccheggio.
In questo modo il pilota non aveva la necessità di guardare gli strumenti dell'abitacolo e poteva concentrarsi sul pilotaggio del velivolo.
A partire dalla fine degli anni 90 le tecnologie AR hanno trovato sempre maggiore applicazione nel campo dell'intrattenimento[@williamsii:HistoryAugmentedReality:2016].
Infatti è proprio a cavallo tra secondo e terzo millennio, che per la prima volta, durante una partita di \ac{NFL}, la linea gialla del *primo down* viene generata da un computer.
Infatti è proprio a cavallo tra secondo e terzo millennio, che per la prima volta, durante una partita di NFL, la linea gialla del *primo down* viene generata da un computer.
Negli ultimi anni il fiorente progresso tecnologico ha consentito la diffusione sempre maggiore di apparecchi che permettono di fondere elementi virtuali con la realtà che li circonda.
Uno dei prodotti più riusciti sono senza dubbio i *Google Glass* (vedi fig. \ref{googleglass})[@x:Glass:2019], presentati al grande pubblico durante il Google I/O del 2013, hanno la forma di comuni occhiali, ma con l'aggiunta di un'appendice che racchiude una fotocamera e un prisma usato per ottenere un *head-up display*.
L'interazione può avvenire sia tramite un touchpad (in grado di riprodurre audio mediante conduzione ossea[^conduzione-ossea]) sia mediante comandi vocali.
Uno dei prodotti più riusciti sono senza dubbio i *Google Glass*(vedi fig. \ref{googleglass})[@x:Glass:2019], presentati al grande pubblico durante il Google I/O del 2013, hanno la forma di comuni occhiali, ma con l'aggiunta di un'appendice che racchiude una fotocamera e un prisma usato per ottenere un *head-up display*.
L'interazione può avvenire sia tramite un touchpad(in grado di riprodurre audio mediante conduzione ossea[^conduzione-ossea]) sia mediante comandi vocali.
Grazie a quest'ultima caratteristica è possibile avere un'esperienza d'uso *hand-free* che li ha resi particolarmente utili in campo industriale e medico.
![Google Glass Enterprise Edition](figures/google_glass.jpeg){#googleglass width=400 height=250px}
![Google Glass Enterprise Edition](figures/google_glass.jpeg){#googleglass width=300 height=200px}
La crescente diffusione degli smartphone e il progressivo aumento delle loro capacità di calcolo, hanno reso queste nuove tecnologie accessibili al grande pubblico.
In questo modo è scaturita una continua richiesta di contenuti AR, che ha spinto molti player del settore tecnologico ad investire in questo campo.
Investimenti che hanno fatto nascere una moltitudine di \ac{SDK} per la realtà aumentata in grado di funzionare su smartphone.
Investimenti che hanno fatto nascere una moltitudine di *SDK* per la realtà aumentata in grado di funzionare su smartphone.
Agli inizi del 2014 viene presentato *Google project Tango*[@googleatap:SayHelloProject:2014] uno dei progetti più interessanti e innovativi nel campo della visione artificiale e dell'AR.
Nasce dalla divisione ATAP[^atap] di Google sotto la guida di Johnny Lee, uno dei leader di *Kinect* in *Microsoft*, con l'intento di estendere le capacità di visione artificiale degli smartphone, rendendoli in grado di capire l'ambiente circostante[@eddy:GoogleFuturePhones:2015].
@ -64,9 +64,9 @@ I *Tango devices* avevano la forma e le funzionalità di un normale smartphone,
Sebbene nel 2016 sia stata rimossa la dicitura *project* e sono stati commercializzati alcuni dispositivi di Lenovo e Asus, *Tango* non ha mai avuto grande successo né tra i produttori, né tra i consumatori.
Il mancato successo è stato determinato da una parte, dalla tendenza di Google a lanciare prodotti in eterna beta e dall'altra, dal costante miglioramento degli algoritmi di visione digitale che permettevano di ottenere risultati soddisfacenti anche su smartphone con hardware standard, e quindi più a buon mercato.
La soluzione di Google, da progetto avveniristico, si è ritrovata ad essere limitata ed acerba per il settore professional, in cui stavano emergendo soluzioni decisamente più potenti ed interessanti come *Microsoft HoloLens*[^mixed-reality] (vedi fig. \ref{hololens})[@microsoft:MicrosoftHoloLens:2019], ma troppo costosa e limitante per quello consumers.
La soluzione di Google, da progetto avveniristico, si è ritrovata ad essere limitata ed acerba per il settore professional, in cui stavano emergendo soluzioni decisamente più potenti ed interessanti come *Microsoft HoloLens*[^mixed-reality](vedi fig. \ref{hololens})[@microsoft:MicrosoftHoloLens:2019], ma troppo costosa e limitante per quello consumers.
![Microsoft HoloLens](figures/hololens.jpg){#hololens width=400 height=250px}
![Microsoft HoloLens](figures/hololens.jpg){#hololens width=300 height=200px}
Il mancato successo di *Tango* unito alla concorrenza di altri *SDK* per la realtà aumentata, tra cui *ARKit* di Apple[@apple:ARKitAppleDeveloper:2019], hanno convinto Google ad abbandonare completamente il progetto, trovandosi nella strana situazione di essere stata una delle prime ad investire in AR per smartphone, ma nonostante ciò essere indietro rispetto alla concorrenza.
Le risorse investite e le conoscenze accumulate con *Tango* hanno però permesso a Google di recuperare velocemente il terreno perso, così dalle ceneri di *Tango*[@kastrenakesGoogleProjectTango2017a] nasce *ARCore*, la piattaforma AR di Google[@googlear:ARCoreGoogleDeveloper:2019].
@ -84,33 +84,33 @@ Questo tipo di AR oltre a riconoscere il pattern deve essere in grado anche di c
L'efficacia oltre a dipendere dalla libreria utilizzata dipende anche dal dispositivo in uso e dal tipo di marker utilizzato.
Infatti condizione necessaria per ottenere risultati soddisfacenti è l'utilizzo di immagini ricche di punti caratteristici o, nel caso di riconoscimento di oggetti tridimensionali, di modelli molto dettagliati.
Questa tecnologia è impiegata prevalentemente per aggiungere dei contenuti multimediali a libri o riviste (vedi fig. \ref{mbar}).
Questa tecnologia è impiegata prevalentemente per aggiungere dei contenuti multimediali a libri o riviste(vedi fig. \ref{mbar}).
Inoltre un impiego emergente è nel campo industriale, dove tramite opportuni modelli 3D di macchinari e impianti è possibile realizzare manuali e guide interattive.
![Tipica applicazione di *marker based AR*](figures/marker_based_ar.png){#mbar width=400 height=250px}
![Tipica applicazione di *marker based AR*](figures/marker_based_ar.png){#mbar width=300 height=200px}
### Markerless AR
L'AR markerless, realizzata mediante degli algoritmi di tipo \ac{SLAM}, è il modo più efficace per renderizzare oggetti virtuali nel mondo reale.
Con questa soluzione non è necessario fornire all'algoritmo informazioni di base per il riconoscimento, infatti riesce a capire (*Localization*) e ricordare (*mapping*) ambienti su cui non ha altre informazioni, se non quelle catturate in real-time dai sensori.
L'AR markerless, realizzata mediante degli algoritmi di tipo SLAM(*Simultaneus Localization And Mapping*), è il modo più efficace per renderizzare oggetti virtuali nel mondo reale.
Con questa soluzione non è necessario fornire all'algoritmo informazioni di base per il riconoscimento, infatti riesce a capire(*Localization*) e ricordare(*mapping*) ambienti su cui non ha altre informazioni, se non quelle catturate in real-time dai sensori.
Le maggiori applicazioni di questa tecnologia si hanno nel campo commerciale, basti pensare alla possibilità di provare un mobile o un quadro nel salotto di casa.
Altro campo in cui hanno riscosso notevole successo è quello ludico e ricreativo.
### Location based AR
La location based AR, effettua il riconoscimento dell'ambiente mediante sensori di posizionamento, sia out-door (es. \ac{GPS}), sia in-door (es. Beacon Bluetooth[^beacon]).
La location based AR, effettua il riconoscimento dell'ambiente mediante sensori di posizionamento, sia out-door(es. GPS), sia in-door(es. Beacon Bluetooth[^beacon]).
Generalmente questo tipo di AR non opera da sola, ma in simultanea ad una delle due tecnologie sopra citate.
La maggiore applicazione di queste tecnologie si ha nella navigazione in realtà aumentata. Un esempio è la possibilità di vedere percorsi virtuali tra le strade delle città d'arte.
![Tipica applicazione commerciale di *Location based AR*](figures/lbar.jpg){width=400 height=250px}
![Tipica applicazione commerciale di *Location based AR*](figures/lbar.jpg){width=300 height=200px}
[^cinema-4d]: Il concetto introdotto con *Sensorama* è usato tutt'oggi nei cinema 4D.
[^olfactory]: Si è soliti associare l'AR principalmente a contenuti audio-video, ma in realtà è un settore che comprende tutti e cinque i sensi. Un'ipotetica tecnologia, che dato in input un piatto, riesce a farci percepite il sapore e l'odore andrebbe ascritta comunque al campo dell'AR.
[^destructive]: Anche se meno conosciuta, la branca *de-costruttiva*, si pone l'obiettivo di rimuovere del contenuto dal mondo reale. Una delle applicazioni più interessanti, sebbene ancora in fase sperimentale, è la realizzazione di un AD blocker per il mondo reale [@vanhemert:ARExperimentThat:2015]. L'AR de-costruttiva resta ad oggi ancora marginale, sia per una carenza di idee di applicazione, sia perché espone, più di quanto non succeda con l'AR costruttiva, l'utente ai pericoli dell'AR che già hanno portato a dei decessi. Mediaticamente più interessanti sono state le morti ascrivibili a *Pokémon GO* [@pokemongodeathtracker:PokemonGODeath:2019].
[^destructive]: Anche se meno conosciuta, la branca *de-costruttiva*, si pone l'obiettivo di rimuovere del contenuto dal mondo reale. Una delle applicazioni più interessanti, sebbene ancora in fase sperimentale, è la realizzazione di un AD blocker per il mondo reale [@vanhemert:ARExperimentThat:2015]. L'AR de-costruttiva resta ad oggi ancora marginale, sia per una carenza di idee di applicazione, sia perché espone ancora di più l'utente ai pericoli dell'AR che già hanno portato a dei decessi. Mediaticamente più interessanti sono state le morti ascrivibili a *Pokémon GO* [@pokemongodeathtracker:PokemonGODeath:2019].
[^mixed-reality]: Sebbene HoloLens sia un visore per la mixed reality, possiamo annoverarlo anche tra i dispositivi AR in quanto la realtà aumentata è una tecnologia abilitate per l'MR.
@ -118,4 +118,4 @@ La maggiore applicazione di queste tecnologie si ha nella navigazione in realtà
[^atap]: Divisione Advanced Technology And Projects di Google, precedentemente nota come Google X.
[^beacon]: Trasmettitore Bluetooth in grado di trasmettere ripetutamente un codice alfanumerico univoco (\ac{UUID}) che permette al dispositivo ricevente di localizzarsi in un ambiente chiuso.
[^beacon]: Trasmettitore Bluetooth in grado di trasmettere ripetutamente un codice alfanumerico univoco(UUID) che permette al dispositivo ricevente di localizzarsi in un ambiente chiuso.

View File

@ -7,14 +7,14 @@
ARCore è stata costruita intorno a tre caratteristiche principali[@googlear:FundamentalConceptsARCore:2019]:
- **Motion tracking**:
Grazie ad un processo chiamato \ac{COM}, ARCore è in grado di capire come il telefono si posiziona rispetto all'ambiente circostante.
Grazie ad un processo chiamato *concurrent odometry and mapping*(COM), ARCore è in grado di capire come il telefono si posiziona rispetto all'ambiente circostante.
ARCore riesce ad estrapolare dall'immagine proveniente dalla fotocamera una serie di ***feature points***, ed usa questi punti per calcolare il proprio movimento rispetto all'ambiente.
Queste informazioni, combinate con quelle provenienti dall'*inertial measurement unit*[^imu], permettono alla libreria di determinare la ***pose*** ovvero la posizione e l'orientamento del device.
- **Environmental understanding**:
ARCore ottiene continuamente nuove informazione sull'ambiente tramite i *feature points*, grazie ai quali è in grado di determinare le superfici piane (sia orizzontali che verticali) e i bordi di quest'ultime.
ARCore ottiene continuamente nuove informazione sull'ambiente tramite i *feature points*, grazie ai quali è in grado di determinare le superfici piane(sia orizzontali che verticali) e i bordi di quest'ultime.
Dato che le superfici piane sono determinate attraverso i *feature points*, la libreria incontra non poche difficoltà nel riconoscimento di superfici piane verticali monocromatiche come, ad esempio, i muri.
- **Light estimation**:
ARCore è in grado di comprendere come la luce illumina gli oggetti reali, mettendo a disposizione del programmatore un'\ac{API} per poter correggere l'immagine proveniente dalla fotocamera.
ARCore è in grado di comprendere come la luce illumina gli oggetti reali, mettendo a disposizione del programmatore un'API per poter correggere l'immagine proveniente dalla fotocamera.
Queste informazioni permettono di integrare meglio gli oggetti virtuali nella scena ed avere un maggiore foto-realismo
### Altre caratteristiche
@ -25,7 +25,7 @@ Altri due concetti importati di ARCore sono le ***Anchor*** e i ***Trackable***.
I punti e i piani sono oggetti speciali che implementano l'interfaccia `Trackable` e come risulta evidente dal nome, questi oggetti possono essere tracciati da ARCore nel corso del tempo.
La possibilità di ottenere informazioni su questi oggetti è molto importante perché ci permette di aggiornare la posa di essi man mano che ARCore apprende informazione sull'ambiente esterno.
Per questo, quando si vuole posizionare un oggetto virtuale, è necessario definire un'*ancora* ad un trackable, così facendo ARCore è in grado di tracciare e aggiornare la posizione dell'oggetto renderizzato.
Inoltre per ridurre lo sforzo della \ac{CPU} le ancore possono essere riutilizzate o messe in pausa quando non sono più parte della scena.
Inoltre per ridurre lo sforzo della CPU le ancore possono essere riutilizzate o messe in pausa quando non sono più parte della scena.
Risulta importante notare che ARCore non offre alcun supporto alle tecnologie di mixed reality.
A fronte di ciò è evidente che l'unica modalità di interazione tra l'utente e gli oggetti virtuali sia lo smartphone.
@ -35,11 +35,11 @@ Questa operazione prende il nome di *hit test*.
### Perché ARCore
La scelta di ARCore rispetto ad altri ambienti di sviluppo non è stata determinata da una supremazia tecnica.
La costruzione di una rappresentazione interna dell'ambiente e il posizionamento in questo sono le caratteristiche comuni a molte librerie di realtà aumentata markerless.
Infatti non è possibile notare una sostanziale differenza tra ARCore e la già citata ARKit, o l'altrettanto valida Vuforia[@vuforia:VuforiaAugmentedReality:2019].
La costruzione di una rappresentazione interna dell'ambiente e il posizionamento in questo sono le caratteristiche su cui si erigono tutte le librerie di realtà aumentata markerless.
Tant'è non è possibile notare una sostanziale differenza tra ARCore e la già citata ARKit, o l'altrettanto valida Vuforia[@vuforia:VuforiaAugmentedReality:2019].
Il campo in cui ARCore eccelle rispetto alla concorrenza invece è la gestione della luce.
Questo punto di forza, però, viene abbondantemente compensato dall'impossibilità di riconoscere un oggetto reale[^image-recognition] (sia esso statico che dinamico) dato un modello 3D.
Questo punto di forza, però, viene abbondantemente compensato dall'impossibilità di riconoscere un oggetto reale[^image-recognition](sia esso statico che dinamico) dato un modello 3D.
Funzione disponibile sia su Vuforia, sia, dalla versione 2.0, su ARKit.
La prima ragione per cui si è scelto di approfondire lo studio di ARCore è la sua natura multi piattaforma, con buona parte dell'API condivisa dai due maggiori sistemi operativi mobili.
@ -73,6 +73,6 @@ Per lo sviluppo delle applicazioni di esempio si è scelto di fare affidamento p
Inoltre vista la natura open source di Sceneform non si viene meno all'intento della tesi di mostrare le possibilità offerte da tecnologie aperte nel campo dell'AR per smartphone.
[^image-recognition]: Google ha preferito relegare il riconoscimento di oggetti ad altre sue librerie di deep learning.
[^imu]: L' \ac{IMU} è un dispositivo elettronico che misura, mediante l'accelerometro, il giroscopio e là dove presente il magnetometro, la forza specifica che agisce sul dispositivo.
[^ndk]: Il \ac{NDK} è un insieme di strumenti che permettono di scrivere parti di applicazioni Android in C o C++.
[^imu]: Anche nota con l'acronimo di IMU è un dispositivo elettronico che misura, mediante l'accelerometro, il giroscopio e là dove presente il magnetometro, la forza specifica che agisce sul dispositivo.
[^ndk]: Acronimo di Native Development Kit, è un insieme di strumenti che permettono di scrivere parti di applicazioni Android in C o C++.
[^opengl]: Acronimo di Open Graphics Library for Embedded Systems, è una specifica che permette di avere un API condivisa su hardware differente.

View File

@ -2,7 +2,7 @@
Per poter realizzare delle applicazioni mediante ARCore e Sceneform sono necessarie una serie di configurazioni iniziali.
Requisito necessario al funzionamento di ARCore è una versione di Android uguale o superiore ad Android 7.0 Nougat (API level 24).
Requisito necessario al funzionamento di ARCore è una versione di Android uguale o superiore ad Android 7.0 Nougat(API level 24).
Inoltre se si sta lavorando su un progetto con API level minore di 26 è necessario esplicitare il supporto a Java 8 andando a modificare file `app/build.gradle`.
```gradle
@ -19,8 +19,7 @@ android {
Sempre nel file per il build del progetto è necessario aggiungere la dipendenza di Sceneform.
```gradle
implementation
'com.google.ar.sceneform.ux:sceneform-ux:$version'
implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.6.0'
```
Inoltre per sfruttare al massimo le potenzialità offerte da Sceneform e ridurre al minimo il lavoro extra per la gestione delle view, si deve aggiungere il fragment di Sceneform al file di layout dell'activity principale mediante il seguente codice xml.

View File

@ -1,6 +1,6 @@
## Augmented images
Nel primo progetto d'esempio si è affrontato un classico problema di AR marker based, ovvero il riconoscimento di un'immagine preimpostata e la sovrapposizione di un oggetto virtuale.
Nel primo progetto d'esempio si è affrontato un classico problema di AR marker based, ovvero il riconoscimento di un'immagine preimpostata e il conseguente sovrapponimento di un oggetto virtuale.
Nel caso specifico si vuole riconoscere una foto del pianeta terra e sostituirvi un modello tridimensionale di essa.
### Aggiunta del modello

View File

@ -4,12 +4,12 @@ Nella seconda applicazione d'esempio viene mostrato come sia possibile recuperar
Questa funzione risulta particolarmente utile quando si deve rilasciare un'applicazione che sfrutta numerosi modelli e non si vuole appesantire eccessivamente il volume del file *APK*.
Inoltre concede maggiore libertà allo sviluppatore in quanto è possibile aggiungere nuovi modelli, o aggiornare quelli vecchi, senza dover operare sull'applicazione, ma lavorando esclusivamente lato server.
In questo caso specifico l'applicazione dovrà riconosce uno o più piani e in seguito ad un tocco dell'utente su di essi, mostrare un modello di *Andy*, la mascotte di Android (vedi fig. \ref{rfm}).
In questo caso specifico l'applicazione dovrà riconosce uno o più piani e in seguito ad un tocco dell'utente su di essi, mostrare un modello di *Andy*, la mascotte di Android.
Per quest'applicazione oltre alle configurazioni già viste in precedenza è necessario aggiungere una nuova dipendenza che include le funzioni necessarie per il fetching del modello.
```gradle
implementation 'com.google.ar.sceneform:assets:$version'
implementation 'com.google.ar.sceneform:assets:1.6.0'
```
Inoltre nell'Android Manifest bisogna aggiungere il permesso per accedere alla rete.
@ -98,6 +98,4 @@ fun buildRenderable(
Infine l'aggiunta del modello renderizzato alla scena avviene mediante la medesima funzione `addTransformableNodeToScene` vista in precedenza.
![Rendering di un modello recuperato a runtime](figures/rfm.png){#rfm width=225px height=400px}
[^sceneform-1.6]: Sceneform 1.6.0.

View File

@ -7,11 +7,9 @@ L'SDK di Sceneform fornisce due classi per adempiere a questo compito:
- `MaterialFactory`: consente di creare un *"materiale"*, partendo o da un colore o da una texture[^texture] definita precedentemente.
- `MaterialShape`: consente di creare delle semplici forme geometriche come cilindri, sfere e cuboidi.
Nel caso specifico è stata realizzata un'applicazione che in seguito al tocco dell'utente renderizza nella scena un oggetto dalla forma e dal colore *pseudo-casuali* (vedi fig. \ref{rbm}).
Nel caso specifico è stata realizzata un'applicazione che in seguito al tocco dell'utente renderizza nella scena un oggetto dalla forma e dal colore *pseudo-casuali*.
Inoltre è stato aggiunto un ulteriore elemento di interazione con l'utente, che gli consente di cliccare sull'oggetto renderizzato, al fine di cambiare la tinta di quest'ultimo.
![Rendering di modelli costruiti a runtime](figures/rbm.png){#rbm width=225px height=400px}
### Interazione con l'utente
Anche in questo caso l'interazione con l'utente è gestita mediante il metodo `setOnTapArPlaneListener`.

View File

@ -3,9 +3,7 @@
Quando si ha a che fare con più nodi presenti sulla scena può risultare utile verificare se due o più di questi si sovrappongono.
In questo progetto viene mostrato come eseguire questo controllo mediante l'API di ARCore.
Per questo progetto si è utilizzata una rivisitazione dell'applicazione vista nel progetto precedente, con la differenza che l'aggiunta di un oggetto non è consentita se questo va in collisione con un altro già presente nella scena (vedi fig. \ref{c}).
![Schermata di errore dovuta ad una collisione](figures/c.png){#c width=225px height=400px}
Per questo progetto si è utilizzata una rivisitazione dell'applicazione vista nel progetto precedente, con la differenza che l'aggiunta di un oggetto non è consentita se questo va in collisione con un altro già presente nella scena.
### Rilevamento della collisione
@ -61,7 +59,7 @@ override fun onCreate(savedInstanceState: Bundle?) {
}
```
La funzione `addShape`, utilizzando le funzioni `buildMaterial` e `buildShape` analizzate in precedenza, si occupa dell'effettiva aggiunta dell'oggetto alla scena.
La funzione `addShape`, utilizzando le funzioni `buildMaterial` e `buildShape` analizzate in precedenza, si occupa dell'effettiva aggiunta dell'aggetto alla scena.
```kotlin
private fun addShape(

View File

@ -5,9 +5,7 @@ Anche in questo caso Sceneform non ci fornisce un supporto diretto, ma a differe
L'`ObjectAnimator` non è una classe specifica di ARCore o Sceneform, ma dell'SDK di Android che può essere usata per gestire facilmente animazioni e transizioni all'interno delle applicazioni Android.
Grazie a questa classe e una serie di punti nello spazio, *collegati* tramite un interpolatore, saremo in grado di conferire il movimento ai nostri modelli.
Per mostrare il funzionamento degli animator è stato realizzato un progetto d'esempio in grado di renderizzare un modello del sistema solare in cui i pianeti realizzano sia il modo di rotazione su se stessi, sia quello di rivoluzione intorno al sole (vedi fig. \ref{ss}).
![Rendering del sistema solare](figures/ss.png){#ss width=400px height=225px}
Per mostrare il funzionamento degli animator è stato realizzato un progetto d'esempio in grado di renderizzare un modello del sistema solare in cui i pianeti realizzano sia il modo di rotazione su se stessi, sia quello di rivoluzione intorno al sole.
#### Recupero e rendering dei modelli

View File

@ -1,14 +1,10 @@
## Cloud anchors
Un'ulteriore funzionalità messa a disposizione da ARCore sono le *Cloud Anchors* che ci permette di salvare su un server remoto le ancore a cui sono agganciati i nodi.
Grazie a questa funzionalità è possibile salvare un'esperienza di realtà aumentata per un uso futuro[^futuro] o per condividerla con altri utenti.
Grazie a questa funzionalità è possibile salvare un'esperienza di realtà aumentata per un uso futuro o per condividerla con altri utenti.
In questo progetto verrà mostrato come sia possibile posizionare, tramite il device A, un vaso di fiori su una superficie piana, e vedere la stessa scena sul dispositivo B.
![Messaggio di avvenuto upload sul server](figures/ca1.png){#ca1 width=225px height=400px}
![Schermata di ripristino di un'ancora](figures/ca2.png){#ca2 width=225px height=400px}
### Configurazioni iniziali
Per poter sfruttare le cloud anchors è necessario richiedere un API KEY sul sito di Google \url{https://console.cloud.google.com/apis/library/arcorecloudanchor.googleapis.com}.
@ -163,7 +159,7 @@ private fun checkCloudAnchor(frameTime: FrameTime) {
}
```
Nel caso specifico in cui il processo di caricamento sia stato completato con successo viene eseguita la funzione `checkHosting` che si occupa di notificare all'utente il codice numerico associato all'ancora (vedi fig. \ref{ca1}) e di cambiare lo stato dell'applicazione da `HOSTING` a `HOSTED`.
Nel caso specifico in cui il processo di caricamento sia stato completato con successo viene eseguita la funzione `checkHosting` che si occupa di notificare all'utente il codice numerico associato all'ancora e di cambiare lo stato dell'applicazione da `HOSTING` a `HOSTED`.
```kotlin
private fun checkHosting() {
@ -187,7 +183,7 @@ private fun checkHosting() {
### Resolving dell'ancora
L'utente può ripristinare un'ancora premendo sul pulsante *resolve*.
Il listener associato a questo evento è racchiuso nella funzione `onResolve` che a sua volta mostra all'utente un dialog in cui può inserire il codice dell'ancora da ripristinare (vedi fig. \ref{ca2}).
Il listener associato a questo evento è racchiuso nella funzione `onResolve` che a sua volta mostra all'utente un dialog in cui può inserire il codice dell'ancora da ripristinare.
```kotlin
fun onResolveClick(view: View) {
@ -217,5 +213,3 @@ private fun onResolveOkPressed(dialogValue: String) {
}
}
```
[^futuro]: Il ripristino non può essere troppo dilazionato nel tempo in quanto le ancore vengono conservate sul server per massimo ventiquattro ore.

View File

@ -1,66 +0,0 @@
# Conclusioni
Nel corso di questo elaborato e in particolar modo durante lo sviluppo dei vari progetti d'esempio è stato possibile analizzare nel dettaglio ARCore e Sceneform e scoprirne limiti e potenzialità.
Nelle seguenti sezioni sono riportate alcune considerazioni finali su entrambe le librerie utilizzate.
## ARCore
ARCore si è dimostrata una soluzione potente ed efficace.
La disponibilità dell'SDK per i due ecosistemi più utilizzati e il supporto ad Unity 3D, lo standard *de facto* nello sviluppo di contenuti multimediali in ambiente mobile, la rendono una soluzione flessibile e capace di adattarsi a tutte le esigenze.
Nonostante i chiari ed evidenti punti a favore, nel corso dello sviluppo delle applicazioni, sono emersi anche una serie di mancanze e limitazioni.
### AR marker based
ARCore e il suo predecessore, *project tango*, hanno puntato da sempre a soluzioni orientate all'AR markerless, conferendo un ruolo secondario all'AR marker based.
Infatti, a differenza di altre soluzioni, ARCore presenta alcune limitazioni in questo campo, come ad esempio il solo riconoscimento di immagini.
Nonostante questo, non si può parlare di una vera e propria lacuna, ma più di una scelta progettuale.
Google ha preferito delegare il riconoscimento di pattern alle altre, e numerose, soluzioni offerte da essa stessa.
Infatti tramite la libreria open source TensorFlow[@googlebrain:TensorFlow:2019] o le soluzioni in cloud, come il machine learning kit di Firebase[@firebase:IntroducingMLKit:2018] è possibile adempiere perfettamente a questi compiti.
### Riconoscimento delle superfici verticali
Il più grosso limite riscontrato nell'utilizzo della libreria si ha senza dubbio nel riconoscimento delle superfici verticali, sopratutto se queste si presentano senza soluzioni di continuità.
Questi problemi sono intrinsechi alla tecnologia stessa del tracking basato su features points, infatti ARCore non riesce a trovare nessun punto caratteristico a cui agganciarsi per svolgere le operazioni di tracking.
Se è vero che nella maggior parte dei casi si opera con piani orizzontali e che alcuni miglioramenti siano stati apportati con la versione 1.6, ad oggi, se si necessita di un uso esclusivo o massiccio di piani verticali, è consigliabile ricorrere ad altre soluzioni.
### Cloud Anchors
Una caratteristica peculiare di ARCore sono le Cloud Anchors che si presentano senza dubbio come una soluzione innovativa e dalle molte potenzialità, presentando però, limitazioni prevalentemente di natura tecnica.
Il ripristino di un'ancora remota non sempre avviene in modo corretto e in alcuni casi si ottengono vere e proprie anomalie visive, come oggetti in bilico o sospesi a mezz'aria.
Per ottenere risultati migliori è consigliabile, sia in fase di creazione, sia in fase di ripristino, posizionarsi ad una distanza non inferiore al metro dal punto in cui verrà creata/ripristinata l'ancora.
Inoltre si è notato un ripristino migliore se quest'ultimo viene eseguito dalla medesima prospettiva dalla quale è stata effettuata la creazione.
Nella documentazione ufficiale, le Cloud Anchors, vengono presentate come una soluzione in grado di abilitare la condivisione di un'esperienza AR, ma allo stato attuale si tratta più di una soluzione per lo storage di ancore.
Infatti per ottenere una condivisione trasparente all'utente, sono richiesti servizi aggiuntivi e un notevole lavoro extra da parte dello sviluppatore.
### Mancanza di listener
Un'altra limitazione emersa prepotentemente durante lo sviluppo è l'impossibilità di associare listener a molti eventi d'interesse.
Quasi tutti gli eventi più complicati del semplice tocco su una superficie piana non possono essere trattati direttamente, ma ci si deve appoggiare all'evento di aggiornamento della scena.
Questa situazione, in problemi complessi, comporta l'utilizzo eccessivo del listener e l'assegnazione ad esso di numerosi compiti eterogenei e quindi la nascita di un codice meno leggibile e manutenibile, con una conseguente maggiore propensione all'errore.
## Sceneform
La natura *platform specific* di Sceneform permette agli sviluppatori di sfruttare una serie di facilitazioni che rendono il processo di sviluppo di applicazioni AR più veloce ed immediato.
Tra le più importanti troviamo sicuramente:
- **Gestione delle ombre**:
Sceneform, sfruttando le informazioni fornite da ARCore, riesce a gestire in maniera automatica le ombre degli oggetti virtuali piazzati sulla scena.
Ottenendo così risultati soddisfacenti sia con oggetti semplici, sia con oggetti in movimento, che con oggetti dotati di varie appendici.
- **Gestione del ciclo dell'applicazione**:
Grazie a Sceneform, allo sviluppatore, è sufficiente dichiarare l'`ArFragment` per avere un ambiente AR a portata di mano che gestisce quasi perfettamente il ciclo di vita dell'applicazione.
Sebbene questi vantaggi siano tangibili e innegabili, sono presenti anche molte limitazioni, come già ampiamente discusso in precedenza.
Le animazioni e il movimento o, più in generale, l'assenza di un motore grafico vero e proprio, pesano come una spada di Damocle sull'affidabilità della libreria.
Durante l'utilizzo di Sceneform si ha sempre l'impressione di star utilizzando un prodotto ancora acerbo e incompleto, per cui l'utilizzo di questa soluzione deve essere attentamente valutata da parte dello sviluppatore.
# Bibliografia

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 954 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -1,138 +0,0 @@
---
author: Raffaele Mignone
matr: 863000747
keywords: [arcore, sceneform]
subject: ARCore & Sceneform
#######################
title: Un'analisi del toolkit ARCore per la realtà aumentata in ambiente mobile
date: Febbraio 21, 2019
institute: Università degli studi del Sannio
department: Dipartimento di ingegneria
course: Corso di Laurea in Ingegneria informatica
academic-year: Anno accademico 2017-2018
supervisor:
title: Chiar.mo Prof.
name: Gerardo Canfora
#######################
abstract: |
Con il termine realtà aumentata viene indicata una serie di tecnologie che permettono di aggiungere nuovo contenuto
percettivo al mondo reale che ci circonda generato mediante l'ausilio di un calcolatore.
In un primo momento le tecnologie di AR erano veicolate mediante l'utilizzo di appositi visori e dispositivi che
rendevano difficile e costoso l'accesso ad esse per il mercato consumers.
Tuttavia il continuo progresso tecnologico e la crescente capacità computazionale dei devices mobili ha permesso una
sempre maggiore diffusione di queste nuove tecnologie.
A fronte di ciò sono nati numerosi framework per lo sviluppo di esperienze di realtà aumentata per dispositivi mobili.
In questo documento si è svolta un'analisi del tool ARCore e della libreria grafica Sceneform, al fine di
comprendere e valutare le possibilità messe a disposizione da queste soluzioni.
\smallskip
\noindent In seguito a quest'analisi è stato possibile isolare una serie di punti a favore come:
- Licenza open source
- Disponibilità dell'SDK per svariati ambienti di sviluppo
- Ottime capacità nel riconoscimento dell'ambiente reale
- Esperienze di AR cross devices
- Documentazione completa ed esaustiva
\noindent Ma anche degli inconvenienti più o meno limitati:
- Supporto limitato alle tecnologie di marker based
- Difficoltà nel riconoscere superfici piane verticali
- Gestione carente degli eventi di interesse
- Supporto quasi nullo al movimento e alle animazioni
acknowledgments: |
Un ringraziamento speciale alla mia famiglia, e in particolar modo ai
miei genitori e a Noemi, per avermi supportato e sopportato durante
questi anni, soprattutto nei momenti di difficoltà.
\smallskip
Un ringraziamento al mio relatore, il Prof. Gerardo Canfora, per la
sua disponibilità e per il supporto.
\smallskip
Un ringraziamento ad *André Miede* per aver realizzato il pacchetto LaTeX
*ClassicThesis* con cui è stato realizzato questo documento.
Un grazie anche a *Mike M* e *Jarlan Perez* per aver realizzato i modelli
utilizzati nelle varie applicazioni.
\smallskip
Dal punto di vista tecnico nessuna parte di questa tesi sarebbe stata
possibile senza il lavoro di centinaia di volontari sparsi in tutto
il mondo, che hanno contribuito ai software open source utilizzati
in questa tesi, tra cui, neovim, Arch Linux, git, pandoc, LaTeX, Zotero e il
kernel Linux.
\smallskip
Infine vorrei esprimere la più sincera gratitudine a chiunque abbia letto le
prime versioni di questo documento, grazie per i preziosi suggerimenti.
acknowledgments-title: Ringraziamenti
#######################
copyright: |
Questo documento è rilasciato sotto la licenza Creative Commons
Attribution-Share Alike 4.0 international license.
\smallskip
\noindent Il template per pandoc *LaTeKiSS*, usato in questa tesi,
è stato scritto da *norangebit* e utilizza a sua volta il package
*ClassicThesis* di *André Miede*.
\smallskip
\noindent Il codice sorgente di questo documento è disponibile
al seguente link \url{https://github.com/norangebit/open-ar}
\noindent La versione completa dei listati è dispolibile al
seguente link \url{https://github.com/norangebit/open-ar-samples}
dedication: A Noemi e alla sua autentica bellezza
#######################
babel: italian
lang: it-IT
toc: true
toc-depth: 3
lof: true
logo: src/figures/logo.png
twoside: false
openright: true
numbersections: true
eulerchapternumber: true
floatnumbering: true
#######################
ac-onlyused: true
ac-title: Acronimi
acronym:
- short: API
long: Application Program Interface
- short: AR
long: Augmented Reality
- short: AV
long: Augmented Virtuality
- short: COM
long: Concurrent Odometry and Mapping
- short: CPU
long: Central Processing Unit
- short: GPS
long: Global Positioning System
- short: IMU
long: Inertial Measurement Unit
- short: MR
long: Mixed Reality
- short: NDK
long: Native Development Kit
- short: NFL
long: National Football League
- short: SDK
long: Software Development Kit
- short: SLAM
long: Simultaneous Localization And Mapping
- short: UUID
long: Universally Unique Identifier
- short: VR
long: Virtual Reality
---