<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>A Crash Course in Augmented Reality on iOS with ARKit | Infinum</title>
		<atom:link href="https://infinum.com/blog/crash-course-in-augmented-reality-on-ios-with-arkit/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/crash-course-in-augmented-reality-on-ios-with-arkit/</link>
		<description>Building digital products</description>
		<lastBuildDate>Wed, 15 Apr 2026 12:45:38 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>7910https://infinum.com/uploads/2019/01/crash-course-in-augmented-reality-on-ios-with-arkit-0.webp</url>
				</image>
				<title>A Crash Course in Augmented Reality on iOS with ARKit</title>
				<link>https://infinum.com/blog/crash-course-in-augmented-reality-on-ios-with-arkit/</link>
				<pubDate>Mon, 28 Jan 2019 14:40:00 +0000</pubDate>
				<dc:creator>Goran Brlas</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/crash-course-in-augmented-reality-on-ios-with-arkit/</guid>
				<description>
					<![CDATA[<p>Since the release of <a href="https://developer.apple.com/arkit/">ARKit</a> in 2017., and especially the 2.0 announcement during the WWDC 2018 conference, I&#8217;ve been interested in what it can provide.</p>
<p>The post <a href="https://infinum.com/blog/crash-course-in-augmented-reality-on-ios-with-arkit/">A Crash Course in Augmented Reality on iOS with ARKit</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-279"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	Since the release of <a href="https://developer.apple.com/arkit/">ARKit</a> in 2017., and especially the 2.0 announcement during the WWDC 2018 conference, I’ve been interested in what it can provide.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	At first, I didn’t know what I was getting myself into. Coming from a computer science background with some minor experience in computer graphics and object rendering, I was expecting a lot of mathematical black magic. Turns out I was wrong.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-100'
	>
	Apple, always on the lookout to simplify things, built a framework that’s intuitive and easy to use but packed with powerful features at the same time. If you know your way around XCode and the basics of iOS development, you could be up and running in no time, even if you haven’t touched AR or 3D modeling before.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-102">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-103'
	>
	Demystifying Augmented Reality</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	So what is augmented reality? A short definition I found on <a href="https://whatis.techtarget.com">whatis</a> explains it quite nicely:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-112"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-108">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-109'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-110'
	>
	Augmented reality is the integration of digital information with the user’s physical environment in real-time.</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-115"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-113">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-114'
	>
	How is it actually achieved? Before jumping into the code, there are three core pillars we need to understand:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-116"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-117">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2019/01/crash-course-in-augmented-reality-on-ios-with-arkit-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="384"
															width="1000"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-119">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-120'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-121'
	>
	<strong>Tracking</strong> provides the ability to track the device&#8217;s relative position in the physical environment using camera images, as well as motion data from its sensors. This data is then processed and used to get a precise view of where the device is located and its orientation.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-126"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-123">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-124'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-125'
	>
	<strong>Scene understanding</strong> builds upon tracking. It&#8217;s the ability to determine and extract attributes or properties from the environment around the device, for example, plane detection (e.g., walls, tables, chairs), collision detection, etc.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-130"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-127">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-128'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-129'
	>
	<strong>Rendering</strong>, the last pillar of AR, is used to present digital information in the real world. For the purposes of this tutorial, I&#8217;ll be using SceneKit, but virtually any household (SpriteKit, Unity, UnReal, etc.) or custom rendering engine can be used.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-133"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-131">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-132'
	>
	ARKit in&nbsp;action</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-136"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-134">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-135'
	>
	Now that we’ve covered the basics, let’s put ARKit into the picture. <strong>The framework does the heavy lifting regarding tracking and scene understanding</strong>. Its job is to combine motion tracking, camera scene capture, advanced scene processing, and display conveniences to simplify the task of building an AR experience.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-139"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-137"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-138">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2019/01/crash-course-in-augmented-reality-on-ios-with-arkit-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="426"
															width="1000"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			ARKit image tracking pipeline		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-142"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-140">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-141'
	>
	There are two ways to implement image detection through its configurations – you could use either<strong><em> ARWorldTrackingConfiguration</em></strong> or <strong><em>ARImageTrackingConfiguration</em></strong>. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-145"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-143">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-144'
	>
	World tracking works best in a stable, non-moving environment, but it struggles if the tracked image starts to move around. That’s why ARKit 2.0 introduced the image tracking configuration. It uses <strong>known images</strong> to add virtual content to the 3D world and continues to track the position of that content even when the image position changes, simultaneously providing a steady 60 frames per second.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-148"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-146">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-147'
	>
	I think we’ve covered enough theory to get started, so let’s dive into some code. We’re going to be building an AR app for tracking and identifying Pokémon in the wild.<br>Just like in the cartoons!</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-149">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-150'
	>
	Getting our hands&nbsp;dirty</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-152">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-153'
	>
	To start things off, I suggest you use the Augmented Reality app template. XCode will create a view controller with a <em>ARSCNView</em> and a starting <em>ARWorldTrackingConfiguration</em>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-157"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-155"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-156">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2019/01/crash-course-in-augmented-reality-on-ios-with-arkit-3.webp"
					class="image__img block-media__image-img"
					alt=""
										height="511"
															width="716"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-160"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-158">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-159'
	>
	From the visual standpoint, this should be enough for this tutorial so I’ll leave the storyboard file as it is.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-163"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-161">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-162'
	>
	We’ll be focusing on image tracking, so we can pretty much delete all the boilerplate code from the view controller and start only with the basic <em>viewDidLoad()</em> and <em>viewWillAppear()</em> methods.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">func viewDidLoad</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">super</span><span class="token">.</span><span class="token">viewDidLoad(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    sceneView.</span><span class="token">delegate</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">self</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">func viewWillAppear</span><span class="token">(</span><span class="token">_ animated</span><span class="token">: </span><span class="token" style="color: #005cc5;">Bool</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">super</span><span class="token">.</span><span class="token">viewWillAppear(</span><span class="token">animated</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    sceneView.</span><span class="token">session</span><span class="token">.</span><span class="token">run(</span><span class="token">configuration</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-166">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-167'
	>
	In <em>viewDidLoad()</em> we set the <em>sceneView’s</em> delegate. <em>ARSCNViewDelegate</em> has a set of methods that we can implement to find out whenever an anchor/ node pair has been added, updated, or removed from the scene. We’ll get to this in a minute.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-169">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-170'
	>
	<em>viewWillAppear()</em> implementation is also rather short. Simply tell the sceneView to start AR processing for the session with the specified configuration and optional options (since we don’t need them here, they’re omitted).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-172">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-173'
	>
	Our configuration is defined separately as a computed property for better readability. This is what it looks like:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-176"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token">let configuration:</span><span class="token"> ARImageTrackingConfiguration </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">guard</span><span class="token"> </span><span class="token" style="color: #d73a49;">let</span><span class="token"> trackingImages </span><span class="token" style="color: #d73a49;">=</span><span class="token"> ARReferenceImage.</span><span class="token">referenceImages(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">inGroupNamed:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Pokemons</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, 
</span></span><span class="line"><span class="token">        </span><span class="token">bundle:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">fatalError</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Couldn&amp;#8217;t load tracking images.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> configuration </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">ARImageTrackingConfiguration(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    configuration.</span><span class="token">trackingImages</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> trackingImages
</span></span><span class="line"><span class="token">    configuration.</span><span class="token">maximumNumberOfTrackedImages</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> configuration
</span></span><span class="line"><span class="token">}</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-177">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-178'
	>
	The first thing we need to do regarding the configuration is to specify which images we want to track. These images can either be loaded from a file or added to the Asset Catalog and then loaded as a group. I’ve decided to do the latter.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-182"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-180">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-181'
	>
	After the images are loaded successfully, image tracking configuration is created and its <em>trackingImages</em> parameter is set to those loaded images. One more thing we need to specify is the <em>maximumNumberOfTrackedImages</em> property, which is used to specify how many images we wish to track simultaneously. If more than this number of images is visible, only the images already being tracked will continue to be tracked until either the tracking is lost, or the image is removed from the specified <em>trackingImages</em>. This number ranges from 1 (default) to 4.<br>My guess is, as hardware and software evolves, there’ll be an option to track even more images at the same time.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-185"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-183">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-184'
	>
	Let the tracking begin</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-188"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-186">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-187'
	>
	As I’ve mentioned previously, <em>ARSCNViewDelegate</em> provides a lot of methods for mediating the automatic synchronization of SceneKit content with an AR session. We’ll be focusing on the <code>renderer:nodeForAnchor:</code> method implementation, so let’s look at how we can handle adding nodes to the existing AR scene.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-189">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-190'
	>
	Here is the overview of our node creation:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-193"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">func renderer</span><span class="token">(</span><span class="token">_ renderer</span><span class="token">: </span><span class="token">SCNSceneRenderer</span><span class="token">, </span><span class="token">nodeFor anchor</span><span class="token">: </span><span class="token">ARAnchor</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">SCNNode</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">guard</span><span class="token"> </span><span class="token" style="color: #d73a49;">let</span><span class="token"> imageAnchor </span><span class="token" style="color: #d73a49;">=</span><span class="token"> anchor </span><span class="token" style="color: #d73a49;">as?</span><span class="token"> ARImageAnchor,
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">let</span><span class="token"> pokemonName </span><span class="token" style="color: #d73a49;">=</span><span class="token"> imageAnchor.referenceImage.name,
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">let</span><span class="token"> pokemonURL </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">URL(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">string:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">https://pokemondb.net/pokedex/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> pokemonName.</span><span class="token" style="color: #005cc5;">lowercased</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> pokemon </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">Pokemon(</span><span class="token">title:</span><span class="token"> pokemonName</span><span class="token">, </span><span class="token">URL:</span><span class="token"> pokemonURL</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> node </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">SCNNode(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> overlayPlane </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">SCNPlane(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">width:</span><span class="token"> imageAnchor.</span><span class="token">referenceImage</span><span class="token">.</span><span class="token">physicalSize</span><span class="token">.</span><span class="token">width</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">height:</span><span class="token"> imageAnchor.</span><span class="token">referenceImage</span><span class="token">.</span><span class="token">physicalSize</span><span class="token">.</span><span class="token">height</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Add the blue-tinted overlay node.</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> overlayPlaneNode </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">createOverlayPlaneNode(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">for:</span><span class="token"> overlayPlane</span><span class="token">, 
</span></span><span class="line"><span class="token">        </span><span class="token">pokemon:</span><span class="token"> pokemon</span><span class="token">, 
</span></span><span class="line"><span class="token">        </span><span class="token">imageAnchor:</span><span class="token"> imageAnchor
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Add the text node displaying what image is currently tracked.</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> textNode </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">createTextNode(</span><span class="token">for:</span><span class="token"> pokemon.</span><span class="token">title</span><span class="token">.</span><span class="token">capitalized</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    textNode.</span><span class="token">pivotOnTopCenter(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Move the point from which calculations are done.</span><span class="token">
</span></span><span class="line"><span class="token">    textNode.</span><span class="token">position</span><span class="token">.</span><span class="token">y</span><span class="token"> </span><span class="token" style="color: #d73a49;">-=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Float</span><span class="token">(</span><span class="token">overlayPlane.</span><span class="token">height</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.005</span><span class="token">
</span></span><span class="line"><span class="token">    overlayPlaneNode.</span><span class="token">addChildNode(</span><span class="token">textNode</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Add the webView node displaying the Pokemon details.</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> webViewNode </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">createWebViewNode(</span><span class="token">overlayPlane:</span><span class="token"> overlayPlane</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    overlayPlaneNode.</span><span class="token">addChildNode(</span><span class="token">webViewNode</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    node.</span><span class="token">addChildNode(</span><span class="token">overlayPlaneNode</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> node
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-196"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-194">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-195'
	>
	Let’s unpack what happens here, section-by-section. Before we get to the interesting stuff, we need to check three things:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-197">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-198'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-199'
	>
	the received anchor object can actually be cast to an <em>ARImageAnchor</em> object;</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-204"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-201">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-202'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-203'
	>
	that image anchor object must have a name (specified in the Asset catalog) since that&#8217;s how we differentiate detected objects;</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-208"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-205">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-206'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-207'
	>
	an URL for finding the Pokémon on the Pokédex web page (I&#8217;m using the <a href="https://pokemondb.net/pokedex" target="_blank" rel="noreferrer noopener">PokémonDB</a> as the baseURL here) can be successfully created.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-211"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-209">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-210'
	>
	After passing all these checks, we can now start with the fun stuff. Firstly, we create our Pokémon object and then an empty <em>SCNNode</em> object which represents all the AR data we will show for that tracked Pokémon. This node will be a container node, which means its sole purpose is to hold a hierarchy of other nodes.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-212">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-213'
	>
	The next step is adding the overlay node:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-216"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">func createOverlayPlaneNode</span><span class="token">(</span><span class="token">for plane</span><span class="token">: </span><span class="token">SCNPlane</span><span class="token">, </span><span class="token">pokemon</span><span class="token">: </span><span class="token">Pokemon</span><span class="token">, </span><span class="token">imageAnchor</span><span class="token">: </span><span class="token">ARImageAnchor</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">SCNNode </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    plane.</span><span class="token">firstMaterial</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token">diffuse</span><span class="token">.</span><span class="token">contents</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> UIColor.</span><span class="token">blue</span><span class="token">.</span><span class="token">withAlphaComponent(</span><span class="token" style="color: #005cc5;">0.5</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> planeNode </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">SCNNode(</span><span class="token">geometry:</span><span class="token"> plane</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Rotates the plane by -90 degrees</span><span class="token">
</span></span><span class="line"><span class="token">    planeNode.</span><span class="token">eulerAngles</span><span class="token">.</span><span class="token">x</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token">.</span><span class="token" style="color: #005cc5;">pi</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> planeNode
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-219"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-217">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-218'
	>
	As its name suggests, this overlay node is laid over the tracked image. We specify its geometry to be a plane, with its width and height being the same as the image’s. After specifying the size, we can set its <em>firstMaterial?.diffuse.contents</em> property a wide array of objects we wish to use – current ARKit implementation allows us to use a color, an image, layer, scene, path, texture, video player etc..</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-222"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-220">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-221'
	>
	In this implementation, we will add a blue-tinted overlay showing where the tracked image is located. Another interesting option would be to set an AVPlayer as the plane material, which would then play a video connected to the specific Pokémon. Who wouldn’t like if their Charizard started spitting fire when detected? Since we’re covering the basics here, I’ll leave that out for now.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-225"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-223">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-224'
	>
	Another useful thing to add is the text node that would tell us which Pokémon is being tracked at the time since there could be more of them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">func textNode</span><span class="token">(</span><span class="token">for text</span><span class="token">: </span><span class="token" style="color: #005cc5;">String</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">SCNNode </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #d73a49;">let</span><span class="token"> sceneText </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">SCNText(</span><span class="token">string:</span><span class="token"> text</span><span class="token">, </span><span class="token">extrusionDepth:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.0</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">      sceneText.</span><span class="token">font</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> UIFont.</span><span class="token">boldSystemFont(</span><span class="token">ofSize:</span><span class="token"> </span><span class="token" style="color: #005cc5;">10</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">      sceneText.</span><span class="token">flatness</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.1</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #d73a49;">let</span><span class="token"> textNode </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">SCNNode(</span><span class="token">geometry:</span><span class="token"> sceneText</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">      textNode.</span><span class="token">scale</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">SCNVector3(</span><span class="token">x:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.002</span><span class="token">, </span><span class="token">y:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.002</span><span class="token">, </span><span class="token">z:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.002</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #d73a49;">return</span><span class="token"> textNode
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-229'
	>
	The procedure is similar to adding the overlay node. First we need to create a geometry – this time it’s a text geometry using our Pokémon’s name. We set the proper font, flatness (accuracy or smoothness of the text geometry) and the text scaling – since SceneKit deals in meters by default, we need to scale it waaay down.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-231">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-232'
	>
	If you’ve implemented everything correctly along the way, this is what should happen when you detect your first image:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-234"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-235">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2019/01/crash-course-in-augmented-reality-on-ios-with-arkit-4.gif"
					class="image__img block-media__image-img"
					alt=""
										height="277"
															width="600"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Tracked image with overlay and text.		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-239"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-237">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-238'
	>
	Who is that&nbsp;Pokémon?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-240">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-241'
	>
	The final piece of our Pokémon puzzle we’re missing is actually something which would show us the information about the detected pokemon using <a href="https://pokemondb.net/pokedex">PokémonDB</a>, right here inside our AR experience. We can do that by using our newly acquired knowledge about plane and node creation, with making some slight modifications:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-243">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-244'
	>
	<li>instead of using an <em>UIColor</em> as the plane material for this new node, this time we are going to use a <em>UIWebView</em> (at the time of writing this article, WKWebView for some reason still isn’t supported inside <em>ARSessions</em> and we get just a grey, empty plane if we try to use it – Apple, some consistency would be appreciated);</li><li>change the <em>webView</em> node’s position parameters to be either left or right of the detected image, to improve visibility;</li><li>you could also modify the plane’s width and height parameters to provide better readability of the page.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-246">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-247'
	>
	After playing around with it a little, your final result should look something like this:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-249"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-250">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2019/01/crash-course-in-augmented-reality-on-ios-with-arkit-5.gif"
					class="image__img block-media__image-img"
					alt=""
										height="277"
															width="600"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-252">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-253'
	>
	And voilà, you’ve just created your first AR experience. It wasn’t that hard, was it? This sneak peek into AR is just scratching the surface of what’s possible, and as time goes on, more and more options are going to be available to us developers.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-257"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-255">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-256'
	>
	The future is augmented</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-260"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-258">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-259'
	>
	To wrap things up, I’d like to share my own opinion about the future of AR. As such, take it with a grain of salt.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-265"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-261">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-262'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-263'
	>
	“Is AR actually going to be the future of mobile applications?”</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-268"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-266">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-267'
	>
	This question has started to pop up lately, and even though I don’t have a magic ball to tell the future, looking from the number of devices that currently support ARKit, it really doesn’t seem too far-fetched. Everyone with an iPhone running iOS 12 can enjoy these experiences, and younger generations are probably going to be (if they aren’t already) crazy about them.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-271"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-269">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-270'
	>
	However, the whole concept of AR on mobile phones has one major issue – the practicality of use. It’s too impractical to walk around with your phone pointed at different things all the time, experiencing the real world while interacting with its augmentations through a screen. In my opinion, the way we interact with our phones is not really going to change that much, but instead, something else will rise up to augmented reality’s call – AR glasses.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-274"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-272">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-273'
	>
	Google tried it a few years ago, but it was just ahead of its time for multiple reasons. Nevertheless, with the way mobile AR is advancing, it’s just a matter of time before another major tech player announces their own AR glasses. Judging by the <a href="https://www.macrumors.com/2019/01/28/apple-augmented-reality-ces/">information coming from this year’s CES</a>, Apple seems to be holding their cards close to their chest and are waiting for the perfect moment to jump into the AR game.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-275">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-276'
	>
	What will happen next? We don’t know that yet, but we’ll probably look back at today and think of it as a learning experience for things to come.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/crash-course-in-augmented-reality-on-ios-with-arkit/">A Crash Course in Augmented Reality on iOS with ARKit</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>