<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ vr - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ vr - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 27 Jul 2026 17:33:34 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/vr/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Bang on A (Virtual) Can: A Primer on A-Frame Audio ]]>
                </title>
                <description>
                    <![CDATA[ By Berrak Nil A-Frame is a web framework for building virtual reality experiences. Ever since its introduction in late 2015, it quickly became a favorite among artists and creators of all backgrounds who want to experiment with WebXR. I am a creative... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-primer-on-a-frame-audio-52dd56e54876/</link>
                <guid isPermaLink="false">66c342fa93db2451bd4413ee</guid>
                
                    <category>
                        <![CDATA[ A-Frame ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AR ]]>
                    </category>
                
                    <category>
                        <![CDATA[ audio ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vr ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 07 Nov 2018 18:34:19 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*XnHzLrB2S17DUeetCPElXg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Berrak Nil</p>
<p><a target="_blank" href="https://aframe.io/">A-Frame</a> is a web framework for building virtual reality experiences. Ever since its introduction in late 2015, it quickly became a favorite among artists and creators of all backgrounds who want to experiment with <a target="_blank" href="https://github.com/immersive-web/webxr/blob/master/explainer.md">WebXR</a>.</p>
<p>I am a creative coder with a background in audio. Diving into the sonic possibilities of this new platform was a very exciting and rewarding journey. Most of my A-Frame experience was confined to standard desktop and smartphone environments and not VR. I am sharing my findings. I want to create a sort of an unofficial manual on how to implement, use and create audio in A-Frame. In this first part, we will take a look at how to use A-Frame’s out of the box audio capabilities.</p>
<p><strong>Prerequisites</strong></p>
<p>This write-up assumes you have some experience with A-Frame. You don’t have to be an expert on it but knowing how the basics work will make following this tutorial easier. If you haven’t had a chance to check it out yet, you can start <a target="_blank" href="https://aframe.io/docs/0.8.0/introduction/">here</a>.</p>
<h3 id="heading-a-frame-sound-component">A-Frame Sound Component</h3>
<p>A-Frame is a framework based on <a target="_blank" href="https://threejs.org/">Three.js.</a> The sound component it provides is a <a target="_blank" href="https://github.com/aframevr/aframe/blob/v0.8.0/src/components/sound.js">wrapper</a> around the Three.js <a target="_blank" href="https://threejs.org/docs/#api/en/audio/PositionalAudio">positional audio component</a> (or non-positional depending on what we choose, but more on that later), which uses the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API">Web Audio API</a>.</p>
<p>This means we get things like positional audio, volume control and audio playback out of the box, as soon as we use an A-Frame sound component.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*ZDC3HgFpM-xU_3cfgP2vTQ.png" alt="Image" width="646" height="412" loading="lazy">
_A-Frame sound component properties, screenshot taken from [A-Frame Docs](https://aframe.io/docs/0.8.0/components/sound.html" rel="noopener" target="<em>blank" title=")</em></p>
<p>But how do we add this component to our scenes and provide audio feedback to user interactions and/or create a <a target="_blank" href="https://en.wikipedia.org/wiki/Soundscape">soundscape</a>?</p>
<p>To demonstrate this I created an A-Frame project from scratch. It is based on user interactions with a desktop computer. (i.e. to use with a mouse and a keyboard). The principles should transfer to other types of controls for the most part.</p>
<p>You have the option to either start with a fresh copy of the project [<a target="_blank" href="https://glitch.com/~a-frame-audio-tutorial-starter">Glitch</a>][<a target="_blank" href="https://github.com/berraknil/a-frame-audio-tutorial/tree/starter">GitHub</a>] — with no sounds attached to it — and follow along while implementing the provided sounds yourself. Or you can check out the finished version [<a target="_blank" href="https://glitch.com/~a-frame-audio-tutorial-complete">Glitch</a>][<a target="_blank" href="https://github.com/berraknil/a-frame-audio-tutorial/tree/master">GitHub</a>] and follow along by reading the code.</p>
<h3 id="heading-the-kitchen">The Kitchen</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*XnHzLrB2S17DUeetCPElXg.png" alt="Image" width="800" height="415" loading="lazy"></p>
<p>Before we start the audio implementation process, let’s take a look at our scene. We have several 3D models here (courtesy of <a target="_blank" href="https://poly.google.com/">Google Poly</a>). Our <a target="_blank" href="https://poly.google.com/view/38PMRiku8qj">kitchen</a> is a complete model by itself. Items like the <a target="_blank" href="https://poly.google.com/view/6kN4sv3u9RM">espresso machine</a>, <a target="_blank" href="https://poly.google.com/view/9H9k1nAXSuH">radio</a>, the <a target="_blank" href="https://poly.google.com/view/bYF5rVRy_kp">frying pan</a> and <a target="_blank" href="https://poly.google.com/view/dccGDIUzA2y">the egg</a> on top of it are separate models that are added to the scene on top of the kitchen.</p>
<p>Now let’s see the methods we can use to add sounds to this scene.</p>
<h3 id="heading-user-interaction-sounds"><strong>User Interaction Sounds</strong></h3>
<p>User interaction sounds are usually one-shot sounds. This means they are short samples that play once when triggered. They are not continuous or looped like environment audio or music. Which means we need to find a way to put an audio file on our scene and then trigger it when our user interacts with that object. (e.g. clicks the mouse button, hovers over it etc.).</p>
<p>To trigger a sound on user interaction, we can:</p>
<ol>
<li>Put a sound on a model</li>
<li>Put a sound on a <a target="_blank" href="https://aframe.io/docs/0.8.0/introduction/html-and-primitives.html">primitive</a>, like a box geometry</li>
<li>Put a primitive on an  component</li>
</ol>
<p>So let’s go through our options one by one and see the use cases for each one.</p>
<h4 id="heading-putting-a-sound-on-a-model">Putting a Sound on a Model</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*dBWexbENGrlzW7Dj4jvS0Q.png" alt="Image" width="800" height="412" loading="lazy"></p>
<p>Who doesn’t want to start the day with a fresh cup of espresso? (If that’s not you, feel free to grab a tea model <a target="_blank" href="https://poly.google.com/search/tea">from here</a> and go with that instead.)</p>
<p>I would say half of the satisfaction of having that caffeine boost is the sound our beloved espresso machine makes. To make sure our scene provides that aural feedback, we implement a sound that will respond to user interaction.</p>
<p>First let’s take a look at how our espresso machine works under the hood</p>
<p>We start by loading our model with the A-Frame loader. Then we set the position, rotation and scale of the model within the scene, by using the named properties.</p>
<p>Our model is referenced by the id “#coffeeMaker”, instead of the relative path of the file. All the models for this project is registered in the <a target="_blank" href="https://aframe.io/docs/0.8.0/core/asset-management-system.html">Asset Management System</a> beforehand.</p>
<p>Easiest way to add a sound to our espresso machine is by adding the sound component to it by using it as an HTML attribute on the object.</p>
<p>We reference our sound by using the asset management system again, and setting the volume of it to 1. This means it will be heard at 100%. Now for the most important part, we set the “on” property of the sound to the “click” value. This means when a user clicks on this object, the sound will be triggered.</p>
<p>We don’t use the autoplay or loop properties here as this is a one-shot that depends on user interaction. We leave the positional property as “on” by default. Otherwise we would hear the sound at the same volume level at all times, no matter how distant we are from the object. Sound wouldn’t have any panning and would always play exactly where we are, instead of to the left, right or behind us depending on our position relative to the object.</p>
<p><strong>NOTE: Positional sounds like these should be rendered mono to make the spatial cognition of the sound easier, while background music or audio ambiances that are not positional preferably should be rendered stereo.</strong></p>
<h4 id="heading-time-to-crack-a-few-eggs">Time to Crack a Few Eggs</h4>
<p>Now it’s your turn, go ahead and implement the provided frying egg sound to the egg model, which is placed on top of the frying pan. For a challenge, you can also try to use a few additional <a target="_blank" href="https://aframe.io/docs/0.8.0/components/sound.html#properties">sound properties</a> of your choosing. Go around the scene after putting the egg sound in place and test your implementation to see if it sounds realistic (or unrealistic if that’s what you are going for!)</p>
<p>Did you do it?</p>
<p>Great!</p>
<p>Your code for the egg model now should look approximately like this (with your desired properties and values)</p>
<h4 id="heading-putting-a-sound-on-a-geometry">Putting a Sound on a Geometry</h4>
<p>So we can add our sounds to the models by simply adding them as an HTML attribute. What if we want to put a sound to an object that is already part of a bigger model and not a separate entity by itself?</p>
<p>Let’s say we want to add a sound to the red bottle on the right, which should make it sound like we are picking it up when we click on it.</p>
<p>If we put the sound on the kitchen model like we did with the smaller models, it would mean that the sound would trigger no matter where we clicked on the model itself, instead of only on the bottle like we want.</p>
<p>We can solve this problem by using a geometry which we can click on, aligning it to where the bottle is, and adding the sound property to it.</p>
<h4 id="heading-a-frame-inspector-to-the-rescue">A-Frame Inspector to the Rescue</h4>
<p>For the next steps I highly recommend that you start creating and positioning objects inside your scene right in the browser by using the <a target="_blank" href="https://aframe.io/docs/0.8.0/introduction/visual-inspector-and-dev-tools.html">A-Frame Inspector</a>. You can then copy and use this code instead of guesswork as to where your object should be positioned.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*nlhq4AvrGji6G1uNNGI9Ag.gif" alt="Image" width="800" height="450" loading="lazy">
<em>Open the A-Frame Inspector by using the <code>&amp;lt;ctrl&amp;gt; + &amp;lt;alt&amp;gt; +</code> i shortcut.</em></p>
<p>Let’s start by creating a geometry primitive on our scene, a cylinder should work well given our bottle’s shape.</p>
<p>Now scale and position this cylinder by using the A-Frame inspector. It can cover our bottle and respond to user interaction on the correct spot.</p>
<p><strong>NOTE: If you add this geometry inside the model, it would enable you to move or rotate the parent model and preserve the correct position of everything inside.</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*AP6J0D-ZQelnlc9alwD1lA.gif" alt="Image" width="800" height="450" loading="lazy">
<em>Scale and position the cylinder inside the scene by using the controls top right</em></p>
<p>You can paste the code you copied from the inspector and just move the scale, position and rotation values inside the .</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*NZ8RVt_7L_gBtpz3S-ofig.png" alt="Image" width="800" height="417" loading="lazy">
<em>Copy the entity and its properties by using the button on the top right</em></p>
<p>Make sure to bring down the opacity of the material to 0, so our bottle can stay visible inside the cylinder geometry. As a final step, add the provided bottle sound to the object, like you did before with the espresso machine and the egg.</p>
<p>Now your cylinder code should look like this…</p>
<p>…and respond to user interaction correctly.</p>
<h4 id="heading-using-an-component">Using an  Component</h4>
<p><a target="_blank" href="https://aframe.io/docs/0.8.0/primitives/a-sound.html">&lt;a-sou</a>nd&gt; is a primitive wrapper around the A-Frame sound component and allows us to use audio without attaching it to anything else on the scene. However if we want to trigger this sound on interaction, we still need a type of geometry which will allow us to interact with this object.</p>
<p>We can put this geometry on anywhere else on the scene. (think of a user interface menu button which will trigger a non-positional sound). Or we can put it directly on to  and then position it on top of the object we want to hear audio feedback from.</p>
<p>Which means to add a sound to our toaster, we can do the reverse of what we just did and create an  component and attach a clickable geometry to it.</p>
<h3 id="heading-environment-audio">Environment Audio</h3>
<p>We saw a couple of the ways we can use to implement sounds that respond to user interactions. But what about sounds that don’t require the user to do anything to play? These are sounds that go through the scene from beginning to end, to create atmosphere, mood, a sense of place?</p>
<p>If we take a look at our kitchen, we can see that there is a big fridge to the left, which is dead silent right now. Not to mention, whether we are consciously aware of it or not, almost all the environments we occupy (unless they are an <a target="_blank" href="https://en.wikipedia.org/wiki/Anechoic_chamber">anechoic chamber</a>) have something called a <a target="_blank" href="https://en.wikipedia.org/wiki/Presence_(sound_recording)">presence or a room tone</a>.</p>
<p>Electric hums, machinery, air conditioning units and alike create the room tone with or without us adding on top of it acoustically. So, to reflect that, our choice should be an ongoing. In this case a looping sound which is present throughout our scene.</p>
<p><strong>NOTE: .mp3 format by its nature <a target="_blank" href="https://sound.stackexchange.com/questions/25846/is-it-possible-to-loop-mp3-without-gaps">does not loop seamlessly</a> in most platforms, there’s always a very short gap between loops which breaks the audio consistency, and therefore for looping sounds other formats like .wav or .ogg should be used.</strong></p>
<h4 id="heading-adding-room-tone">Adding Room Tone</h4>
<p>Now let’s add the provided room tone to our scene. We have several options depending on what type of A-Frame project we are working on. If we have only one room-as is the case here-we can put our room tone directly to our . Or if we have several rooms in our scene with different characteristics, we can put the room tone in to a plane geometry which could act as the ground. Or in an  object which we can put in the center of the room. In all cases we have to make sure our room tone is not positional, as opposed to all the other sounds we used previously on this project.</p>
<p>Given that we are only working with a single room/environment in here, we can put our room tone directly into the scene itself. We set the positional property to false, to make sure sound is heard equally throughout the room.</p>
<p>We also set the autoplay property to true since we don’t need user interaction to hear the room tone.</p>
<p><strong>NOTE: Audio autoplay in most browsers either already require or will require user interaction to start. Which means to automatically play sounds like background music or ambient audio you need to use a menu screen or a mute/unmute button or something alike to enable audio autoplay.</strong></p>
<h3 id="heading-music">Music</h3>
<p>For the final piece of our audio puzzle, let’s add some music to our scene. We can either choose to add this as diegetic music that’s coming from the radio in our scene, or as extra-diegetic music which is non-existent in the virtual world we created, but specifically for the user/viewer/player who is experiencing and controlling this virtual world.</p>
<p>To do the latter, we would need to put our music either onto our camera () or to our first-person character (if that is an option) and make sure the audio is non-positional. In this scene I chose to go with the former and put the music to the radio model as a source inside the virtual world.</p>
<p>We can add the provided music track (composed by yours truly) to our radio model just like we added all the sounds up to this point.</p>
<h4 id="heading-playback-control">Playback Control</h4>
<p>Our music plays whenever we click on the radio, but what if we want to pause it and then play it again?</p>
<p>To have this functionality we need to <a target="_blank" href="https://aframe.io/docs/0.8.0/introduction/writing-a-component.html">write a custom A-Frame component.</a> Then add that component as an HTML attribute to any object we want to add that functionality to, just like we added the “sound” component to our models before.</p>
<p>You can either write your A-Frame components inline, or write it in an external JavaScript file and then link to it from the html, like I did for this project.</p>
<p>Now we have an audio-toggle component that enables us to play and pause the sound we are hearing. It also allows us to change the autoplay ability via the “playing” property.</p>
<p>And that’s it! <a target="_blank" href="https://a-frame-audio-tutorial-complete.glitch.me/">We have an A-Frame scene with music, environment sounds and interactive audio.</a></p>
<p>In the next part we will take a look at how to integrate <a target="_blank" href="https://tonejs.github.io/">Tone.js</a> to an A-Frame project and writing more custom components with advanced audio functionality.</p>
<p>Thanks for reading!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Build a Multiplayer Browser-based VR Game with A-Frame, PubNub, and WebVR ]]>
                </title>
                <description>
                    <![CDATA[ By Namratha Subramanya Advancements in technology have made Virtual Reality (VR) more immersive and affordable than ever. This immersive environment can be similar to the real world. Or it can be fantastical, creating an experience that is not possib... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/build-a-multiplayer-browser-based-vr-game-with-a-frame-pubnub-and-webvr-b7de33ba088/</link>
                <guid isPermaLink="false">66c346608ced2460cf9e9b65</guid>
                
                    <category>
                        <![CDATA[ coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Virtual Reality ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vr ]]>
                    </category>
                
                    <category>
                        <![CDATA[ webvr ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 27 Aug 2018 20:50:01 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*Iu7_DRv1Pr_9dHfkr22ZVw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Namratha Subramanya</p>
<p>Advancements in technology have made Virtual Reality (VR) more immersive and affordable than ever. This immersive environment can be similar to the real world. Or it can be fantastical, creating an experience that is not possible in ordinary reality.</p>
<p>Better yet, high-quality VR devices are available at low prices these days. With a number of smartphone-compatible VR headsets such as Google Cardboard, Samsung Gear VR, Oculus Rift and HTC Vive, VR is showing to be the next big thing.</p>
<p>In this tutorial, we’ll take advantage of that and build a real-time, multiplayer VR game using A-Frame, PubNub, Glitch, and WebVR.</p>
<p>The <a target="_blank" href="https://github.com/namrathasubramanya/VR-Bowling-game">full GitHub code repository can be found here</a>.</p>
<h3 id="heading-webvr">WebVR</h3>
<p><a target="_blank" href="https://webvr.info/">WebVR</a> is an open specification that makes it possible to experience VR in your browser. It is a JavaScript browser API that acts as an interface for the VR hardware. WebVR is cross-platform and can be used to develop, view and share VR content on any browser that supports VR. With WebVR, you can open up a browser and get into VR just by clicking a link. Working with WebVR directly requires knowledge of JavaScript and WebGL.</p>
<h3 id="heading-a-frame">A-Frame</h3>
<p><a target="_blank" href="https://aframe.io/">A-Frame</a> is a virtual reality framework that is built upon the WebVR API. It uses the WebVR API to gain access to VR headset sensor data (position, orientation) to transform the camera and to render content directly to VR headsets. A-Frame is an open community project that uses the WebVR API along with HTML, CSS, JavaScript, and Three.js. A-Frame aims for highly immersive and interactive VR content with native-like performance. At the same time, A-Frame wants everyone to be able to get involved with VR content creation. A-Frame supports all major headsets with their controllers.</p>
<h3 id="heading-glitch">Glitch</h3>
<p><a target="_blank" href="https://glitch.com/~aframe">Glitch</a> provides an online code editor with instant deployment and hosting of websites. The editor supports both front-end and back-end code as well as multiple files and directories. Glitch lets you remix (i.e., copy) existing projects and make them our own and instantly host and deploy changes for everyone to see. Firefox Nightly allows you to debug the VR content using debug console.</p>
<h3 id="heading-gaming-environment">Gaming Environment</h3>
<h4 id="heading-a-frame-physics-system">A-Frame Physics System</h4>
<p><code>aframe-physics-system</code> is middleware that initializes the physics engine and exposes A-Frame components for us to apply to entities. When we use its <code>static-body</code> or <code>dynamic-body</code> components, <code>aframe-physics-system</code> creates a <code>Cannon.Body</code> instance and attaches it to our A-Frame entities, so on every frame, it adjusts the entity’s position, rotation, etc. to match the body.</p>
<h4 id="heading-ball">Ball</h4>
<p><code>&lt;a-sphe</code>re&gt; primitive creates a spherical shape. You can define its radius color and position. Becau<code>se of aframe-physics-</code>system, the ball can be converted into a dynamic-body with a certain mass.</p>
<h4 id="heading-bowling-lane">Bowling Lane</h4>
<p><code>&lt;a-b</code>ox&gt; creates shapes such as boxes, cubes, or walls. You can create a rectangle box and make a bowling lane out of it by placing pins and ball on top of it.</p>
<h4 id="heading-pins">Pins</h4>
<p><code>&lt;a-cylind</code>er&gt; primitive is used to create tubes and curved surfaces. These cylinders can be used as bowling pins in the game. Be sure to define the radius, height, position, and mass of the cylinder.</p>
<h4 id="heading-tracks">Tracks</h4>
<p>The ball cannot roll in the same direction every time you throw it. You can define any number of tracks for the ball to roll, and this track can, in turn, define the direction. This game has 5 tracks, and the movement of the ball on these tracks is controlled by 5 triangles or, let’s say, pointers on the bowling lane.</p>
<h4 id="heading-surroundings">Surroundings</h4>
<p>A scene is represented by the <code>&lt;a-sce</code>ne&gt; element. The scene is the global root object, and all entities are contained within the scene. The objects’ friction, restitution, and iterations are set to values of 0.001, 0.3 and 30 respectively.</p>
<p>A-Frame has an asset management system that allows us to place our assets in one place and to preload and cache assets for better performance. We place such assets within <code>&lt;a-asse</code>ts&gt;.</p>
<p>The scale component defines a shrinking, stretching, or skewing transformation of an entity. You can use the scale component to transform a box into a wall behind the bowling lane.</p>
<p>On similar lines, a box can be converted into a button attached to the wall by using the scale component. <code>&lt;a-te</code>xt&gt; can add text into your virtual environment.</p>
<p><code>&lt;a-b</code>ox&gt; can also be used to build borders next to the bowling lane.</p>
<h3 id="heading-the-game">The Game</h3>
<h4 id="heading-rolling-the-ball">Rolling the Ball</h4>
<p>As discussed earlier, the ball can roll over 5 imaginary tracks on the bowling lane. This can be achieved using <code>&lt;a-animati</code>on&gt;. Animations can be attached in A-Frame th<code>rough &lt;a-a</code>nimation&gt; element by making it as a child of the entity to animate.</p>
<p>Now you can bind these animations of the ball with the 5 pointers so that the animation begins every time one of the triangles is clicked. This can be achieved by writing a component. We can register the component in JavaScript and use it declaratively from the DOM. Components are configurable, reusable, and shareable.</p>
<h4 id="heading-falling-of-pins">Falling of Pins</h4>
<p>When a dynamic-body of mass 17.5 rolls towards 10 dynamic bodies of mass 1.25, some of them tend to fall. After every knockdown, one can count the number of pins that are down. We can check the position of the pins at the end of the animation. If any of the pin’s rotation has its x-value not equal to 0 or -0 then it means that the pin isn’t standing upright. By counting the number of pins that are lying down, you can calculate the score of the player.</p>
<p>The above line captures the x-value of the rotation attribute of a pin. This way you can fetch x-value of rotation attribute of all the pins and save it into an array. Now you can loop through the array and check every value and increment the <code>strike</code> counter.</p>
<h4 id="heading-new-game">New Game</h4>
<p>The player can start a new game at any point of time by clicking on the New Game button on the wall. It automatically refreshes the game.</p>
<h4 id="heading-moving-camera">Moving Camera</h4>
<p>You can move the camera at any point during the game. Here, I have chosen to move the camera every time the player rolls the ball for a better view of the falling pins.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*kZFpH7Qepl0i1OtR7jwmrg.png" alt="Image" width="800" height="450" loading="lazy"></p>
<h3 id="heading-pubnub">PubNub</h3>
<p>With less than 1/4th of a second latency, PubNub can smoothly publish and subscribe messages between multiple VR devices. Let’s convert this single-player game into a 2-player game.</p>
<p>You’ll now have to initialize your PubNub keys. <a target="_blank" href="https://admin.pubnub.com/#/register/?utm_source=Syndication&amp;utm_medium=Medium&amp;utm_campaign=SYN-CY18-Q3-Medium-Aug-17">Sign up for a PubNub account</a> and create a project in the <a target="_blank" href="https://admin.pubnub.com/#/register?utm_source=Syndication&amp;utm_medium=Medium&amp;utm_campaign=SYN-CY18-Q3-Medium-Aug-17">Admin Dashboard</a>.</p>
<h4 id="heading-deciding-the-turns">Deciding the Turns</h4>
<p>Every player gets two turns. The player switch turns after every two shots. So after every two shots, PubNub can notify the other user that they can take control. In this game, every time the player gets his/her turn the 5 triangle pointers surface on the bowling lane. And when it’s not their turn, the 5 triangle pointers are hidden.</p>
<p>Hide the pointers when it’s not your turn. Here, instead of hiding, I am setting the position to 0.</p>
<p>Make the pointer surface back to the bowling lane when it is your turn. By doing this, you’ll be taking control of the tracks again.</p>
<h4 id="heading-replicating-the-state-of-pins-after-knockdown">Replicating the State of Pins After Knockdown</h4>
<p>After every knockdown, you can capture the position of pins that are down and send it to the other user using PubNub. By doing so, you can replicate one player’s screen on other players’ screens. In the code below, you can see that the position and rotation values of pin 1 are passed to other players using PubNub. On similar lines, you can send rotation and position values of all the pins through PubNub.</p>
<h4 id="heading-switching-between-static-and-dynamic-bodies">Switching Between Static and Dynamic Bodies</h4>
<p>Earlier we used <code>aframe-physics-system</code> to convert the A-Frame objects into dynamic bodies. When the player isn’t rolling the ball and is just replicating the screen of another player, the ball should not be a dynamic body in order to avoid falling of extra pins.</p>
<p>When it is the current player’s turn, dynamics is set to true, and the <code>dynamic-body</code> properties are added.</p>
<p>When it’s not the player’s turn, dynamics is set to false, and the <code>dynamic-body</code> properties are removed.</p>
<h4 id="heading-player-2">Player 2</h4>
<p>Once you are done with publishing data through PubNub from Player 1’s screen, you can read the data by subscribing to PubNub’s channel.</p>
<p>When PubNub receives data related to the position of fallen pins’ position and rotation, you can set the attribute of pins on player 2’s screen to the same values as Player 1 and hence make the two screens identical.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Congratulations! Every time you roll the ball on Player 1’s screen, you can see Player 2’s screen replicating all the movements. Now you can revert this by publishing Player 2’s data back to Player 1 and convert your game into a fully functional 2-player game. It can be converted into a multiplayer game as well. Happy VR gaming!</p>
<p><strong>The <a target="_blank" href="https://github.com/namrathasubramanya/VR-Bowling-game">full GitHub code repository can be found here</a>.</strong></p>
<p>_Originally published at <a target="_blank" href="https://www.pubnub.com/blog/build-multiplayer-browser-based-vr-game-aframe-webvr/?utm_source=Syndication&amp;utm_medium=Medium&amp;utm_campaign=SYN-CY18-Q3-Medium-Aug-17">www.pubnub.com</a>._</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to build a multiplayer VR web app ]]>
                </title>
                <description>
                    <![CDATA[ By Srushtika Neelakantam In this article, we’ll learn about three great frameworks/libraries that allow any web developer to build a VR app that works on any device in minutes. It will also allow networked realtime interaction by peers from all over ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-build-a-multiplayer-vr-web-app-7b989964fb38/</link>
                <guid isPermaLink="false">66c34f93912fb29c4f156c23</guid>
                
                    <category>
                        <![CDATA[ Apps ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vr ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 12 Jun 2018 16:26:11 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*cmZG_OoXi3eVMxALqspC_g.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Srushtika Neelakantam</p>
<p>In this article, we’ll learn about three great frameworks/libraries that allow any web developer to build a VR app that works on any device in minutes. It will also allow networked realtime interaction by peers from all over the world.</p>
<p>Virtual reality (VR) has come to an amazing level where it does not need any introduction. However, from a developer’s perspective, building simple VR apps still seems to be a complex task, let alone networked multiplayer ones.</p>
<h3 id="heading-what-will-we-build">What will we build?</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*cmZG_OoXi3eVMxALqspC_g.jpeg" alt="Image" width="800" height="600" loading="lazy">
_Picture taken at [Martin Splitt](https://www.wearedevelopers.com/congress/" rel="noopener" target="_blank" title=""&gt;WeAreDevelopers World Congress by &lt;a href="https://twitter.com/g33konaut/status/996753762172760065" rel="noopener" target="<em>blank" title=")</em></p>
<p>By the end of this tutorial, you will have a VR app similar to the one seen in the above picture. It will have a basic VR scene where multiple users can connect to your app from their mobile phones by simply hitting a URL on their mobile phone’s browsers.</p>
<p>Don’t know or understand a lot of the terms I just used? Don’t worry, we’ll have a look at all of it shortly, and it will all start to make sense soon!</p>
<p>Basically, for every user who joins your application, a new avatar will appear in your VR scene (Note: I’m just using a fancy term ‘avatar’ for that set of boxes which barely resembles a real human :P ). These avatars will rotate/move in realtime, according to the movement of users’ phones in real life.</p>
<p>This app was demo-ed during my talk at <a target="_blank" href="https://www.wearedevelopers.com/congress/">WeAreDevelopers</a> World Congress 2018. You can check out the slides below.</p>
<h3 id="heading-skip-to-live-demo">Skip to live demo</h3>
<p>The complete project is hosted on <a target="_blank" href="http://glitch.com">Glitch</a> — I think it’s the easiest way to host your community projects or demos. It also allows multiple developers to collaborate on a project remotely. You should totally check it out.</p>
<p>Instructions for the <a target="_blank" href="http://go.ably.io/vr-demo"><strong>live demo</strong></a>:</p>
<ul>
<li>open up the link in a browser window on your computer/mobile.</li>
<li>open up another instance of the application in another browser window/mobile.</li>
</ul>
<p>You can see the avatar of each of these instances in the other. Try moving the mobile phone in the air and you’ll see that the corresponding avatar seen on the computer browser moves as well. If you have two VR headsets (even cardboards are fine), you and a friend can put them on and see each other’s avatars move in the scene as you are moving your head in real life.</p>
<p>Play around a bit or read on further to understand what’s happening and how. You can also check out the complete code, hosted on GitHub. Make sure to read the readme file:</p>
<p><strong>Jump to the complete <a target="_blank" href="https://github.com/ably/tutorials/tree/ably-multiplayer-vr-tutorial">source code</a> on GitHub.</strong></p>
<h3 id="heading-what-will-we-use">What will we use?</h3>
<p>As mentioned before, our aim is to access VR directly in the browsers, without having to download anything. We shall use the <a target="_blank" href="https://webvr.info/">WebVR</a> library in order to achieve this.</p>
<p>WebVR is a web framework that allows us to build VR applications which are accessible directly on the web. This completely eliminates heavy downloads and installs, as well as making the VR app device-independent.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*VwBq28_q_l0J86HQd4GkdQ.png" alt="Image" width="512" height="512" loading="lazy">
_[WebVR](http://webvr.info" rel="noopener" target="<em>blank" title=") Logo</em></p>
<p>However, even though WebVR gives us the ability to leverage the many advantages of the web, it still requires a considerable amount of complex work. This may, in fact, require knowledge of WebGL and other libraries to be able to build a smooth experience.</p>
<h4 id="heading-a-frame">A-Frame</h4>
<p>This, again, tends to be a bottleneck for the developers of the web to build something that will be eventually served on the web itself. And so, Mozilla’s VR team built a framework on top of WebVR called <a target="_blank" href="http://aframe.io">A-Frame</a>.</p>
<p>A-Frame completely eliminates WebVR’s boilerplate code and allows developers to build VR apps with simple HTML custom tags. With, of course, JavaScript making various bits and piece work together, as always.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*SGUnFgjYGIgK5dgm8q43Qw.png" alt="Image" width="800" height="500" loading="lazy">
_[A-Frame](http://aframe.io" rel="noopener" target="<em>blank" title=") VR logo</em></p>
<h4 id="heading-ably">Ably</h4>
<p>Further, we’ll use <a target="_blank" href="http://ably.io">Ably Realtime</a> to implement all the realtime —and multiplayer — functionality in the application. Ably is a realtime data delivery platform that solves the realtime message delivery problem by offering features like <a target="_blank" href="https://www.ably.io/documentation/realtime/channels-messages">Pub/Sub</a> and <a target="_blank" href="https://www.ably.io/documentation/realtime/presence">Presence</a> out of the box.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*PzBxXwB9ydQRyPJmgYR4BQ.png" alt="Image" width="508" height="284" loading="lazy">
_[Ably Realtime](http://ably.io" rel="noopener" target="<em>blank" title=") logo</em></p>
<p><strong>Note</strong>: The limits for an Ably free account (that is used in the Live Demo) allow you to have a maximum of two instances of the app running at any time. If you wish to have more instances running, have a look at the Ably <a target="_blank" href="https://www.ably.io/pricing/self-service">self-service package</a> and buy more messages accordingly.</p>
<h4 id="heading-glitch">Glitch</h4>
<p>As you know by now, every WebVR application can be accessed from just a browser. This means we’ll need to host our files in order to be able to access them on a mobile device using a URL.</p>
<p><a target="_blank" href="https://glitch.com/">Glitch</a> is a very convenient way of doing this. You can simply create a new project. When you are done, a URL is readily available for use on any platform or device instantly.</p>
<h3 id="heading-authentication-and-assigning-unique-ids">Authentication and assigning unique ids</h3>
<p>First things first. We’ll need to setup an auth server that verifies our users’ credentials and authenticates them with Ably, while also assigning a random <code>clientId</code> to each of those. This <code>clientId</code> will serve as a way to identify each of these avatars separately, and handle information such as their respective position updates, and appearance/disappearance as per user login/logout. We’ll set up a simple <a target="_blank" href="https://expressjs.com/">express server</a> for this, as shown below:</p>
<p>If you observe closely, this express server serves the files present in the root directory of the project. So make sure the “index.html” file that you build further on is in the same folder as the “auth-server”.</p>
<p>If you wish to serve these files locally, rather than on Glitch, replace the code for the <code>listener</code> variable with the following:</p>
<p>Since this is only a tutorial, we are not actually checking any credentials before authenticating the clients. Ideally, the auth server would have a validation step.</p>
<p>The project structure is simple, with the following files all in the same parent folder:</p>
<ul>
<li>auth_server.js</li>
<li>index.html</li>
<li>main.js</li>
</ul>
<h3 id="heading-getting-started">Getting started</h3>
<p>Let’s start by building the basic VR setup for the application. We’ll use A-Frame’s <a target="_blank" href="https://aframe.io/docs/0.7.0/introduction/entity-component-system.html">entity-component-system</a> (ECS). ECS makes it easy to build any objects in the scene. Every object is treated as an entity which differs from other entities by the various components (or attributes) that are attached to it.</p>
<p>In your HTML file, start off by adding the HTML skeleton code:</p>
<p>The references refer to the following, respectively:</p>
<ol>
<li>Ably’s JS <a target="_blank" href="https://www.ably.io/download">client library</a></li>
<li>JQuery <a target="_blank" href="https://code.jquery.com/">Framework</a></li>
<li>A-Frame’s <a target="_blank" href="https://aframe.io/docs/0.8.0/introduction/installation.html">JS build</a></li>
<li>A local JS file (“main.js”) where we’ll add the logic of the app</li>
<li>A-frame’s <a target="_blank" href="https://aframe.io/aframe-registry/">community contributed</a> text component to conveniently add stylised text to our VR scene.</li>
</ol>
<p>All the objects we wish to include in our VR scene must go within the <code>a-scene</code> tag in our HTML file, as scene above (pun intended)! This is analogous to the <code>body</code> tag in regular HTML documents.</p>
<p>Next, we will add all the assets we wish to use within the <code>a-assets</code> tag. Adding all the resources under this tag makes sure that all your assets are pre-loaded before your app shows up. This prevents a crappy first look due to slow loading of part of the resources.</p>
<p>Feel free to use your own resources to give the app a customised feel! You can see that we have added two new tags in the above code snippet, let’s dig into them:</p>
<p><code>a-asset-item</code> — invokes the three.js file loaders. You can use this to load all file types.</p>
<p><code>a-mixin</code> — is a very useful tag that allows code reuse by letting you specify a set of properties (components) to be applied to a single entity. You can give it an <code>id</code> and reference it multiple times as we’ll see. We will have three mixins, each specifying certain attributes for the avatar that we intend to create — the eyes, pupils, and arms.</p>
<p>Now, let’s add all the static visual elements in our VR scene.</p>
<p>As you can see, we have implemented the complete app using ECS. However, this is not the only way that you can add objects to the scene. A-Frame comes with a few custom entities such as box, sphere, and so on. These custom entities are called <a target="_blank" href="https://aframe.io/docs/0.7.0/introduction/html-and-primitives.html#primitives">primitives</a>.</p>
<p>The code contains very easy to follow comments that explain what each of the entity-component sets is trying to implement in our app.</p>
<p>For VR newbies, <strong>here’s something interesting</strong> — a sky is like a layer that covers your 360 deg sphere inside which you assume yourself to be standing while experiencing a VR app. It is generally analogous to the sky in real-life which can be seen on the top and appears to drop down near the horizon. We use <code>a-sky</code> in A-Frame to add a sky and the resource to be used can be either a 360 deg image or just a solid colour.</p>
<p>Now comes another interesting part. We require a <strong>camera</strong> entity. This is a special entity offered by A-Frame. It grabs the continuously changing position as well as rotation values of your mobile phone while you are using an A-Frame powered VR app in the browser. The entity takes advantage of the various gyro sensors in your phone to achieve this under-the-hood. In a computer, the camera entity follows the <a target="_blank" href="https://aframe.io/docs/0.8.0/components/wasd-controls.html#sidebar">WASD</a> controls to capture the position and rotation.</p>
<p>Here’s how we can add a camera entity. We can optionally give it a shape and animation, which helps us track its movement by serving as a cursor.</p>
<p>By the end of this section, your VR app should ideally look like what’s shown below. But only if you haven’t switched the resources with your custom ones, of course!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*JNth10uakAwE1wwWKY5lJw.png" alt="Image" width="800" height="413" loading="lazy">
<em>First Look</em></p>
<p>Voilà! We just finished setting up the basic VR scene.</p>
<p>It’s now time to add some functionality to it — to make the avatars appear, disappear, and move around in realtime as the users log in and out of your application, or simply move their phone around.</p>
<h3 id="heading-adding-realtime-functionality">Adding realtime functionality</h3>
<p>It’s time to spin up some magic into our VR scene. Using Ably, it is very easy to implement this. We’ll use <a target="_blank" href="https://www.ably.io/documentation/realtime/channels-messages">Pub/Sub</a> and <a target="_blank" href="https://www.ably.io/documentation/realtime/channels-messages">Presence</a>, which are both offered as direct use out-of-the-box features by Ably.</p>
<p>Start by connecting your client/user to Ably. Since we are using <a target="_blank" href="https://www.ably.io/documentation/realtime/channels-messages">Token Authentication</a>, we’ll simply add a route to the auth server, as shown below:</p>
<p><strong>Note</strong>: we have specified <code>echoMessage: false</code>. This prevents your client from being subscribed to messages published by itself, ensuring lower message count/usage on the whole app. By default, this option is always true.</p>
<p>After successfully authenticating the client, we’ll store the id returned by the auth server in a variable so we can use it later on.</p>
<p>Next, let’s set up the first function that initialises our application. In this function, we set an initial position of the avatar. For simplicity, we’ll restrict the avatar’s rotation/movement to x-axis only, while keeping the coordinates on the other two planes as zero. The initial position on the x-axis is chosen randomly so that multiple avatars do not clutter at the same point in the scene as soon as they appear. We also set some initial attributes such as colour and dimensions.</p>
<p>In order to send this data to Ably, we need to create a channel. I’ve called it <code>vr-channel</code>. After that’s done, we can publish the initial attributes on this channel.</p>
<p>However, we want to continuously publish this data so all the other users are able to receive it in realtime. In other words, we want to publish data as the position and rotation attributes are changing. This data is directly handed to us by the camera entity in A-Frame. We just need to publish this data on the same channel at a high frequency. In this case, I’m publishing at every 100ms.</p>
<p><code>a-box</code> is a <a target="_blank" href="https://aframe.io/docs/0.7.0/introduction/html-and-primitives.html#primitives">primitive</a> in A-Frame that can be conveniently used to create a 3D box with basic attributes such as dimensions, position, rotation, color, and so on.</p>
<p>You can see that there are three subfunctions within the above function that we have not yet discussed. <a target="_blank" href="https://www.ably.io/documentation/realtime/presence">Presence</a> is a common term in the realtime world which gives you the information about a user/device’s online or connection status. In our case, we would:</p>
<ul>
<li>create and make the avatar appear in the scene only when a user comes online (hits the URL)</li>
<li>and, likewise, make it disappear as soon as a user quits the app (closes the browser window on their phone or browser).</li>
</ul>
<p>Additionally, Ably allows you to subscribe to presence events. A callback is fired every time a new user logs in or an existing user logs out. This is exactly what we require for our app.</p>
<p>Using <code>channel.presence.get()</code> you can get a list of all the members currently connected to Ably (are online).</p>
<p>Using <code>channel.presence.subscribe('enter')</code> you can get notified whenever a user becomes connected to Ably (comes online).</p>
<p>Using <code>channel.presence.subscribe('leave')</code> you can get notified whenever a user becomes disconnected from Ably (goes offline).</p>
<p>As soon as a user comes online, we need to subscribe everyone else to the attribute changes of the new user’s avatar. These changes, as you can observe, will be in the <code>attr</code> object due to changing position and rotation. Our goal is to update the avatar as these attributes update.</p>
<p>Before that, we need to ensure that the avatar exists at all, or if a new one needs to be created. We do this by using a simple map of avatars where we store the IDs of all the existing avatars, as shown:</p>
<p>Next, we need to make all the users subscribe to changes in the attributes of everyone else, apart from themselves. We do so by making them subscribe to the specific event on the same channel to which it is being published, like so:</p>
<p>When a new user enters, we need to create a new avatar with all the necessary attributes. The following function gets all the initial attributes over Ably. It creates a new avatar with these attributes, and attaches other parts like eyes, pupils, and arms relative to the position of the main box (representing the head of the avatar). This manual positioning becomes easier with the use of a <a target="_blank" href="https://aframe.io/docs/0.7.0/introduction/visual-inspector-and-dev-tools.html">visual inspector</a> tool that comes with A-Frame.</p>
<p>After we have built all the different parts of an avatar, we bind them all together by attaching them to a root avatar. This gives us a way to perform actions like position updates and so on on the avatar as a whole. You wouldn’t want a zombie-like situation with the head moving in one direction and eyes moving in the other, right? ;) This also makes it easy to delete the whole avatar when a user logs out.</p>
<p>If an avatar already exists, we simply update its position and rotation from the continually updating data in the <code>attr</code>object of the respective users.</p>
<p>Scroll back up to the <code>subscribeToAvatarChanges()</code> function. You will observe that the <code>updateAvatar()</code> is a callback function to a channel subscription which is invoked when the attributes of an existing avatar change. This makes it very easy for us to continually update the actual avatar as well, according to the changing data. We simply update the position and rotation with new values, as shown below:</p>
<p>Finally, we need to ensure that the avatar is removed from the scene whenever a user logs out/ goes offline. This can be done using presence again, by handling the <code>leave</code> event mentioned earlier. Here are a few things you need to do when a user logs out:</p>
<p>We start by deleting the corresponding entry in our array and follow it by deleting the complete avatar from the scene.</p>
<h3 id="heading-thats-it">That’s it!</h3>
<p>We have now successfully implemented a Multiplayer VR app that runs on the web and works in realtime. Go ahead and test it out with your friends and let them witness the magic! If you have been working in a local envrironment, you might need a local server to host your files, as mentioned above. I personally use <a target="_blank" href="http://glitch.com">Glitch</a> for all my VR projects.</p>
<p>You now know the basics of both A-Frame and Ably, allowing you to build both VR apps and realtime apps or — even better — a collaborative app, like the one we just did.</p>
<p>Ideas are already brewing in your mind? Go ahead and build that app you’ve always wanted to! Here’s the complete <a target="_blank" href="https://github.com/ably/tutorials/tree/ably-multiplayer-vr-tutorial">source code</a> for this application. Feel free to give a shout to me on <a target="_blank" href="https://twitter.com/Srushtika">Twitter</a> if you get stuck or would like to know more about something.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*HV4HpIxvpQPi6sM5ehvRfw.jpeg" alt="Image" width="800" height="533" loading="lazy">
_[Ably Realtime](http://twitter.com/Srushtika" rel="noopener" target="_blank" title=""&gt;Srushtika Neelakantam is a Dev Advocate for &lt;a href="http://ably.io" rel="noopener" target="<em>blank" title="). Photo Credits: Radka Klein</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ The iPhone X’s TrueDepth IR Camera: A Universe of Possibilities Beyond Animojis and Face ID ]]>
                </title>
                <description>
                    <![CDATA[ By James Hsu More than two months after the iPhone X launch, it remains a conundrum for some to put a finger on exactly which features might justify the $1000+ price Apple has given its flagship phone. Some might wager on the virtually edge-to-edge O... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-iphone-xs-truedepth-ir-camera-a-universe-of-possibilities-beyond-animojis-and-face-id-ebcb5d2a7aca/</link>
                <guid isPermaLink="false">66c361960cede4e9b1329cd7</guid>
                
                    <category>
                        <![CDATA[ Apple ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Apps ]]>
                    </category>
                
                    <category>
                        <![CDATA[ gaming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ iphone ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vr ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 17 Jan 2018 18:44:28 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*_-KvUHk8nytLHenewH4OpA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By James Hsu</p>
<p>More than two months after the iPhone X launch, it remains a conundrum for some to put a finger on exactly which features might justify the $1000+ price Apple has given its flagship phone.</p>
<p>Some might wager on the virtually edge-to-edge OLED display, which for the first time on an iPhone, does away with the tactile home button and prominent top and bottom bezels of every previous model. It is admittedly <em>gorgeous</em>.</p>
<p>As it turns out, however, the iPhone X’s most groundbreaking feature is not even discernible at first glance, even though it literally stares you in the face.</p>
<h3 id="heading-meet-the-truedepth-ir-camera">Meet the TrueDepth IR Camera</h3>
<p>Apple has been <a target="_blank" href="https://www.theguardian.com/technology/2014/may/30/pressure-tim-cook-innovation-apple">dogged by perceptions</a> that the company’s product roadmap has grown conservative and predictable in the six years following Steve Jobs’ passing. The new TrueDepth IR camera, as Apple calls the iPhone X’s secondary front-facing camera, could well help Apple dispel those rumors of complacency.</p>
<p>New to the iPhone X and housed in the black notch at the top of the display, the technology includes a number of high tech components such as a “flood illuminator,” infrared (IR) camera, and an infrared emitter. The latter emits 30,000 infrared dots in a known pattern when a face is detected, enabling the iPhone X to generate a 3D map of a user’s face. Notably, the TrueDepth IR camera can do this fast enough to support the creation of 3D motion data as well.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/xWH-g4d72HOuN1iNNBR9ySWUM3xKbCIL8t2E" alt="Image" width="800" height="571" loading="lazy">
<em>TrueDepth IR can create a 3D map of your face using an infrared camera and emitter. (Photo credit: Apple)</em></p>
<h4 id="heading-at-present-there-are-currently-two-supported-use-cases-for-the-new-truedepth-ir-camera-on-the-iphone-x"><strong>At present, there are currently two supported use cases for the new TrueDepth IR camera on the iPhone X:</strong></h4>
<ul>
<li><strong>Animoji</strong>, or animated emoji — the camera animates a 3D emoji with your captured facial expressions, which you can then send via Messenger or SMS.</li>
<li><strong>Face ID</strong> — the camera uses a locally stored 3D image of your face to authenticate and unlock your iPhone X. Because it uses 3D image data, it’s much harder to trick than previous mobile face recognition systems that used a 2D image and therefore could be fooled with a photo.</li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/yt6UE8WcjrPLl9-Nmrxx5rA77cWOtSK40vNK" alt="Image" width="511" height="279" loading="lazy">
<em>Animojis are certainly fun, but they only scratch the surface of what’s possible. (Photo credit: Apple)</em></p>
<h3 id="heading-what-thats-it">“What — that’s it?”</h3>
<p>Admittedly, the <em>current</em> use cases for this technology are limited.</p>
<p>Animoji are just emoji with a fun twist, and unlocking phones hasn’t exactly been a pain point for modern smartphone users, with the prevalence of fingerprint sensors on many phones and pattern drawing as an adequate secondary option.</p>
<p>What’s incredibly intriguing is that the TrueDepth IR camera technology can and will have much stronger applications in the very near future. As with the iPhone’s previous Touch ID (fingerprint sensor), an iOS SDK makes it easy for app developers to use Face ID and the TrueDepth IR camera for a myriad of other more compelling use cases. In fact, Face ID uses the exact same API as Touch ID, making implementation into mobile apps incredibly simple.</p>
<p>Here are some of the areas where the TrueDepth IR camera could spawn useful or interesting mobile applications:</p>
<h3 id="heading-financial-services-and-internet-banking">Financial Services and Internet Banking</h3>
<p>For more than a decade, the gold standard in Internet banking authentication has been two-factor authentication. One of the most common forms of two-factor authentication has involved sending a verification code sent to your phone or email address, which must then be manually entered along with your password to access your account.</p>
<p>In the past few years, mobile banking apps have been quick to add support for fingerprint-based authentication. This has made it easier than ever to access your bank accounts online using your mobile phone. For the banks, this means customers have easier access to their services, resulting in increased revenues.</p>
<p>Why, given the already enhanced convenience of fingerprint-based authentication, would banks care about implementing face recognition into their mobile apps? To understand why, let’s consider false positive rates — the rate at which any given authentication protocol provides a false authentication. Apple claims that Touch ID, its fingerprint based authentication, has a false positive rate of 1 in 50,000. Compare that to the chance of guessing a four-digit PIN, 1 in 10,000.</p>
<p>Now, let’s look at the iPhone X’s new Face ID feature. Apple claims Face ID has a false positive rate of approximately 1 in 1,000,000. <em>If true, this represents a 20-fold improvement in accuracy compared to fingerprint based authentication and 100-fold improvement over a four-digit PIN.</em></p>
<p>That’s sure to get the attention of the banks offering Internet banking, as well as of the consumers who also benefit from enhanced fraud protection. In fact, many banks have already implemented Face ID support into their iOS apps. Chase, for example, <a target="_blank" href="https://media.chase.com/content/pr/chase-mobile-app-introduces-face-id">added Face ID support within two weeks of the iPhone X’s launch</a>.</p>
<h3 id="heading-entertainment-and-fun">Entertainment and Fun</h3>
<p>iOS 11 introduced <a target="_blank" href="https://developer.apple.com/arkit/">ARKit</a>, a new framework that allows developers to easily create unparalleled augmented reality experiences for iPhone and iPad. Combined with the iPhone X’s TrueDepth IR camera, ARKit opens up a revolutionary capability for robust face tracking across multiple app categories.</p>
<p>Imagine:</p>
<ul>
<li>Entering the character creation screen for Assassin’s Creed: Identity and being able to not only choose your assassin’s class but also their visual identity, using your own face in place of the default character model’s</li>
<li>Having a more accurate view of a prospective match’s face before you choose to swipe left or swipe right on Tinder, Bumble, or POF</li>
<li>Being able to skip a trip to Sephora or ULTA and experiment with new makeup without shelling out for everything up front</li>
</ul>
<p>A few years ago, virtual reality (VR) technology was in the same place that the technology behind TrueDepth IR is now: a promising technology needing stronger applications in video games and entertainment.</p>
<p>Oculus, a virtual reality company, was founded in 2012 and ran a successful Kickstarter campaign that year, raising $2.5 million. Just two years later in 2014, Oculus was acquired by Facebook for <em>$2 billion</em>, or nearly one thousand times the initial financing round. Could companies that invest in entertainment applications using TrueDepth IR technology find a similar trajectory?</p>
<p>There are already precedents in the space, too. Two years ago — when face tracking was still based on two-dimensional images — <a target="_blank" href="http://www.latimes.com/business/technology/la-fi-tn-facebook-masquerade-20160309-snap-story.html">Facebook purchased (for an undisclosed amount) Masquerade</a>, a startup whose MSQRD app lets users create self-altered images and video using face tracking technology.</p>
<h3 id="heading-medical-and-fitness">Medical and Fitness</h3>
<p>Imagine being able to have a medical examination at any hour of the day, on-demand, from the convenience of your bed, sofa, or office chair. With the help of the iPhone X’s TrueDepth IR camera, this could become a reality.</p>
<p>TrueDepth IR technology has the potential to be used for medical imaging, because it can create detailed 3D maps of your face, including the surface of your skin. Notably, it can also capture 3D movement, including subtle changes in facial expression.</p>
<p>Consider the following potential medical use cases:</p>
<ul>
<li>Have a dermatologist examine an abnormal skin growth, with the ability to rotate the image for a better look at the structure of a potential tumor, for example.</li>
<li>Have your phone automatically alert you when it notices facial cues or subtle movements that could be associated with the onset of a stroke, seizure, or heart attack.</li>
<li>For recovering stroke patients, you might have an app that tracks any muscular degeneration over time and provides your doctors with this detailed 3D image data on demand.</li>
</ul>
<p>While these use cases would certainly not replace the need to have in-person examinations, regular screening via phone camera could play a supporting role in enabling early detection or regular monitoring of known medical conditions.</p>
<p>Consider also that Apple has published a software development kit (SDK) called Apple Healthkit, which allows app developers API access to rich health and fitness information across a variety of sources: fitness wearables, health devices, and software applications. New or updated mobile apps might combine health vitals from Apple Healthkit with 3D facial image data to offer a more complete assessment of users’ health or fitness.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Mooi2Z13sH3d4RBGrqMZgH8fyq6vtM-Qwv9p" alt="Image" width="800" height="571" loading="lazy">
<em>Apple Healthkit integrations will allow TrueDepth IR to be used for health and fitness assessments. (Photo credit: Apple)</em></p>
<h3 id="heading-the-future-is-here">The Future is Here</h3>
<p>The iPhone X is the first phone to offer depth-sensing IR cameras, but it certainly won’t be the last.</p>
<p>“With the wide spectrum of new use cases that the technology makes possible, the impetus is now on software developers and bold businesses to bring these applications to life,” said Harry Lee, CEO of <a target="_blank" href="https://citrusbits.com/">CitrusBits</a>. Based in Los Angeles and San Francisco, CitrusBits is a mobile app development agency that designs and develops award-winning mobile apps for some of the world’s best known brands, including Burger King, Symantec, and Quiksilver.</p>
<p>“Those that do embrace the technology now can enjoy first mover advantages such as the ability to build a sizable market share and enjoy strong network effects that discourage future market entrants — not to mention the opportunity to get bought up by Facebook, Microsoft, or another titan of industry,” Lee explains.</p>
<p>To see more stories like this one, subscribe to CitrusBits’ newsletter, <a target="_blank" href="http://eepurl.com/dhLqQ9">Bits &amp; Bytes</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Building Online Communities: Pupil Labs ]]>
                </title>
                <description>
                    <![CDATA[ By Gitter Will Patera and Moritz Kassner are the founders of Pupil — a mobile eye tracking platform, which they are building working closely with an open source community. Find out more about their exciting project & feel free to drop by the Pupil La... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/building-online-communities-pupil-labs-feb3999ccc44/</link>
                <guid isPermaLink="false">66c346ef160da468ed76f17c</guid>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Virtual Reality ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vr ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 17 Aug 2016 14:06:12 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*GkWBYwtyuYJyjiP706QG-Q.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Gitter</p>
<p><em>Will Patera and Moritz Kassner are the founders of Pupil — a mobile eye tracking platform, which they are building working closely with an open source community. Find out more about their exciting project &amp; feel free to drop by the Pupil Labs <a target="_blank" href="https://gitter.im/orgs/pupil-labs/rooms">community channel on Gitter.</a></em></p>
<p><strong>Tell us about a little bit about</strong> <strong>yourself.</strong></p>
<p>Will Patera and Moritz Kassner founded <a target="_blank" href="https://pupil-labs.com">Pupil Labs</a> in 2013. Andreas Bulling joined as the scientific adviser and partner in 2014. We develop open source software and build accessible hardware for mobile eye tracking and eye tracking integrations for VR/AR. We have backgrounds in computer science, industrial design, and architecture.</p>
<p><strong>What is Pupil? How did it all begin?</strong></p>
<p><a target="_blank" href="https://github.com/pupil-labs/pupil">Pupil</a> is an open source eye tracking platform. Pupil started as a part of our <a target="_blank" href="http://dspace.mit.edu/handle/1721.1/72626">joint Master’s thesis</a> at MIT. We wanted to be able to record and visualize what someone was looking at (gaze) while navigating through buildings. At the time, there were no accessible or open source mobile tracking tools. So, we decided to build our own hardware and software. We developed a mobile eye tracking headset with our own cameras and proof of concept along with capture and visualization software.</p>
<p>After finishing our thesis, we released the code (on Google Code — yes Google Code was still a thing in 2012) and published DIY instructions, and bill of materials, so that others could build their own mobile eye tracking headset and conduct research.</p>
<p>The community, developed organically around the initial open source codebase and wiki. We started receiving requests from the community to purchase eye tracking hardware, and in late 2013 we formed the company Pupil Labs. The company provides a way for us continue working on Pupil and pursuing the vision of the platform.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/oCEFneuXjtW0l8rznmrAjBnwhENLWxKXMJL8" alt="Image" width="800" height="600" loading="lazy">
<em>Pupil binocular mobile eye tracking headset.</em></p>
<p>Eye tracking is exciting because it intersects with a diverse range of research fields, application areas, and development topics. It’s fun to meet new people and learn about new areas where eye tracking is employed. Research areas include (but are not limited to): psychology, cognitive science, neuroscience, UI/UX, artificial intelligence, music, education, assistive technology, optics, ophthalmology, optometry, transportation and wayfinding, urban design, architecture, computer graphics, VR, AR, and more. Here are <a target="_blank" href="https://docs.google.com/spreadsheets/d/1ZD6HDbjzrtRNB4VB0b7GFMaXVGKZYeI0zBOBEEPwvBI/edit?usp=sharing">some academic publications</a> that cite Pupil.</p>
<p>On the development side it is equally diverse. Problems/projects address: ergonomics and physiology, optics, electrical engineering, computer vision, pupil detection algorithms and eye movement classification, visualization and more.</p>
<p><strong>What common goals do you have as a community?</strong></p>
<p>We share a common desire to make eye tracking accessible and reducing the barriers to obtaining robust eye tracking data for research and novel interfaces.</p>
<p><strong>What issues related to your project are you most excited about these days?</strong></p>
<p>We are really excited about our latest project called hmd-eyes — a community driven platform for open source eye tracking tools in VR, AR, and MR. We outline the goals of the project in this <a target="_blank" href="https://pupil-labs.com/blog/2016-04/eye-tracking-head-mounted-displays/">blog post</a>. The <a target="_blank" href="https://github.com/pupil-labs/hmd-eyes">github repo</a> for this project is somewhat bare-bones right now, but more coming soon. We also have a Gitter channel for this project at <a target="_blank" href="https://gitter.im/pupil-labs/hmd-eyes?utm_source=share-link&amp;utm_medium=link&amp;utm_campaign=share-link">hmd-eyes</a>.</p>
<p><strong>How do you expect VR to evolve in the next coming years? What will be the most interesting use cases in your opinion?</strong></p>
<p>There is certainly a lot of speculation and excitement surrounding VR and AR right now, and a lot of interest for eye tracking in VR/AR.</p>
<p>We think that it is only a matter of time — maybe only one to two more release cycles — until eye tracking will be integrated into consumerware HMDs (VR, AR, MR). This is exciting. But, will these consumerware platforms be accessible and open, or a black box? Will researchers and developers be able to access the fundamental pupil detection and mapping algorithms or develop their own methods? Will the work that you do within one SDK be portable or locked into one system?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/pf6Dk9frJ3c8oI4dBH2npkKP9iXbLA87MdZU" alt="Image" width="800" height="457" loading="lazy">
<em>Pupil Labs recently released an eye tracking addon for the HTC Vive AR Headset.</em></p>
<p>We develop eye tracking hardware add-ons for VR and AR headsets, and have initiated a project called hmd-eyes to create open source building blocks for eye tracking in HMDs. Our goal is to work with and support a community of researchers and developers in creating reusable open-source software modules for eye tracking in HMDs. We know that many developers have already thought of or implemented eye tracking software for HMDs and instead of re-inventing wheels, we should form a community to share knowledge and tools.</p>
<p>Foveated rendering has gotten a lot of press. It is exciting, but maybe just the tip of the application-iceberg. There is so much that can be done within AR/VR that requires robust eye tracking data. There is interesting research into cognition aware computing using eye tracking.</p>
<p><strong>What are the main issues discussed in the Pupil channel on Gitter?</strong></p>
<p>Before Gitter, our only way to get in touch with our community was through Github and a Google Group (mailing list). We still use the Google Group, but have found that Gitter is really nice for quick feedback and sharing within the community.</p>
<p>A lot of the questions from our community are about setup and workflow. When both software and hardware (especially something you wear) is involved, workflows can quickly get complicated. It’s nice to be able to give and receive rapid feedback on Gitter. This helps the community to improve documentation and understand critical areas where improvements can be made.</p>
<p>We also maintain a wiki for Pupil. The wiki is open for anyone in the community to edit and can serve as both reference for developers and a “getting started” for new members.</p>
<p>The Pupil channel is also used to share development progress and post videos to project demos and research papers. It’s always fun to see video demos!</p>
<p><strong>What are the factors that you have taken into account while creating and maintaining the community? What factors contribute to the success of your community?</strong></p>
<p>In the beginning it required a lot of fostering. Most of knowledge was with the maintainers, and we had to answer almost all questions. Now the community has matured to a level that it is self perpetuating and there is more active exchange among its users.</p>
<p><strong>How do you encourage participants’ commitment and contribution to the community?</strong></p>
<p>It is our duty as maintainers to make sure the community is welcoming and supportive, and try our best to give quick feedback. That being said, we feel like we are still learning on how to best encourage participation in the community.</p>
<p>It’s great when contributors step forward and answer questions, share their work in progress, improve documentation, open issues, and make pull requests.</p>
<p>We really envision the community to be driven by others as much as us. With members taking ownership over certain areas of expertise.</p>
<p><strong>Based on your experience, do you feel that the open source communities have changed and evolved over the past years? If so, how?</strong></p>
<p>The great thing about community driven open source work is that, in the best case, it is always changing and evolving. There are certainly more tools now than ever before, that enable people to work together from around the world and to facilitate getting work done online. As communities evolve, so do the enabling technologies.</p>
<p><strong>What advice would you give to someone who wants to start an online open source community?</strong></p>
<p>Just start your project publicly. Initially you may be writing to yourself. Do your best to write docs, updates and code that are concise and a pleasure to read.</p>
<p><strong>Anything else you want to add?</strong></p>
<p>We ❤ Gitter. Its great to connect with community members and interested newcomers. We also rely on it heavily for internal communication; keeping our distributed team connected and coordinated.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Best Gitter channels on: VR & AR ]]>
                </title>
                <description>
                    <![CDATA[ By Gitter Virtual reality is one of the biggest tech trends and a hot topic of 2016. Investment in that sector reached over 1 billion dollars early this year, while new applications of the technology are being uncovered daily — VR is now expected to ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/best-gitter-channels-on-vr-ar-33a55218726a/</link>
                <guid isPermaLink="false">66c345b14f1fc448a3678fc1</guid>
                
                    <category>
                        <![CDATA[ Augmented Reality ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Virtual Reality ]]>
                    </category>
                
                    <category>
                        <![CDATA[ vr ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 25 May 2016 15:53:54 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*5CPn10huO04M7gAvVb-Gkg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Gitter</p>
<p>Virtual reality is one of the biggest tech trends and a hot topic of 2016. Investment in that sector reached over 1 billion dollars early this year, while new applications of the technology are being uncovered daily — VR is now expected to transform education, travel, corporate training, healthcare, and even financial services. To give you an example, in April a surgery was livestreamed globally in VR for the first time, while attendees of this year’s Sundance film festival could enjoy <a target="_blank" href="http://www.sundance.org/blogs/news/new-frontier-projects-and-films-announced-for-2016-festival">more than 30 VR-related experiences</a>.</p>
<p>VR craze has reached Gitter too! Check out the list of channels below and don’t hesitate to join the conversation.</p>
<ul>
<li><a target="_blank" href="https://gitter.im/highfidelity/hifi?utm_source=blog&amp;utm_medium=content&amp;utm_campaign=vrar"><strong>highfidelity/hifi</strong></a> — High Fidelity (hifi) is an early-stage technology lab experimenting with Virtual Worlds and VR. This community is dedicated to open, decentralized virtual world using sensors to control avatars and dynamically assigned devices as servers.</li>
<li><a target="_blank" href="https://gitter.im/pupil-labs/hmd-eyes?utm_source=blog&amp;utm_medium=content&amp;utm_campaign=vrar"><strong>pupil-labs/hmd-eyes</strong></a> — Building blocks for eye tracking in Augmented Reality AR and Virtual Reality VR or more generally Head Mounted Displays HMD.</li>
<li><a target="_blank" href="https://gitter.im/OSVR/OSVR-Unreal?utm_source=blog&amp;utm_medium=content&amp;utm_campaign=vrar"><strong>OSVR/OSVR-Unreal</strong></a> — OSVR is an open-source software platform for virtual and augmented reality. It allows discovery, configuration and operation of hundreds of VR/AR devices and peripherals. OSVR supports multiple game engines, and operating systems and provides services such as asynchronous time warp and direct mode in support of low-latency rendering. OSVR software is provided free under Apache 2.0 license. OSVR is maintained by <a target="_blank" href="http://www.sensics.com/">Sensics</a> and <a target="_blank" href="http://www.razerzone.com/">Razer</a>.</li>
<li><a target="_blank" href="https://gitter.im/CoolGames/OSVR-HDK-Info-from-Cool-Games?utm_source=blog&amp;utm_medium=content&amp;utm_campaign=vrar"><strong>CoolGames/OSVR-HDK-Info-from-Cool-Game</strong>s</a> — This is a GitHub Contribution to the OSVR Project as Lee T. Davy develops his application using VR.</li>
<li><a target="_blank" href="https://gitter.im/wantedly/AiR-PingPong?utm_source=blog&amp;utm_medium=content&amp;utm_campaign=vrar"><strong>wantedly/AiR-PingPong</strong></a> <strong>—</strong> Project to hack a ping-pong table of Wantedly in AR</li>
<li><a target="_blank" href="https://gitter.im/vrpn/vrpn?utm_source=blog&amp;utm_medium=content&amp;utm_campaign=vrar"><strong>vrpn/vrpn</strong></a> <strong>—</strong> The Virtual-Reality Peripheral Network (VRPN) is a set of classes within a library and a set of servers that are designed to implement a network-transparent interface between application programs and the set of physical devices (tracker, etc.) used in a virtual-reality (VR) system. The idea is to have a PC or other host at each VR station that controls the peripherals (tracker, button device, haptic device, analog inputs, sound, etc). VRPN provides connections between the application and all of the devices using the appropriate class-of-service for each type of device sharing this link.</li>
<li><a target="_blank" href="https://gitter.im/artmobilis/ArtMobilis?utm_source=blog&amp;utm_medium=content&amp;utm_campaign=vrar"><strong>artmobilis/ArtMobilis</strong></a> — Project software documentation for a digital art in public space journey — a journey of digital works in augmented reality produced by artists.</li>
</ul>
<p>Looking for something else? Check out our <a target="_blank" href="https://gitter.im/explore/tags/javascript,php,ruby">Explore</a> section or easily <a target="_blank" href="https://gitter.im/home#createroom">start your own channel here.</a></p>
<p>Did we miss an channel that you think should be featured? Drop us a line in the <a target="_blank" href="https://gitter.im/gitterHQ/gitter">Gitter HQ</a> and we will add it to the list.</p>
<p>Happy coding!</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
