AR.js - Augmented Reality for the Web
Logo by Simon Poulter
AR.js is a lightweight library for Augmented Reality on the Web, coming with features like Marker based and Location based AR.
Welcome to the official repository!
- Very Fast : it runs efficiently even on phones - 60 fps on my 2 year-old phone!
- Open Source : It is completely open source and free of charge!
- Standards : It works on any phone with webgl and webrtc
AR.js v2.0.0 is out!
AR.js v2.0.0 introduces, for the first time, another type of Augmented Reality: Location Based.
AR.js can now be used with its default Marker Based feature, with Location Based or both combined.
See the project that has been integrated into AR.js: GeoAR.js.
You can find additional details below.
Try it on Mobile
It works on all platforms. Android, IOS and window phone. It runs on any browser with WebGL and WebRTC (for iOS, you need to update to iOS11),
To try it on your phone, it is only 2 easy steps, check it out!
- Open this hiro marker image in your desktop browser.
- Open this augmented reality webapps in your phone browser, and point it at your screen.
You are done! It will open a webpage which read the phone webcam, localize a hiro marker and add a 3D model on top of it!
What "Marker Based" means
artoolkit, and so it is marker based.
artoolkit is a software with years of experience doing augmented reality. It is able to do a lot!
More details about markers:
What "Location Based" means
here.Check out the Location Based documentation:
AR.js, on its
aframe implementation, comes with few custom components that make possible to integrate data from GPS sensors.
Basically, you can add
gps-entity-place - custom
aframe entities that have a specific longitude/latitude values.
You can add them with a script, loading them from APIs (Foursquare, Google Maps, and so on) or just add them statically on your HTML.
Once you have added one or more gps-entities, and added the
gps-camera on the
camera entity, the system calculates, at every frame, your position and the distance of places from you.
Using your phone sensors for orientation/position, AR.js is able to show on your camera a content for each place on its 'physical' place (so if you point the camera towards the place in real life, you will see the content near it).
If you move the camera, it calculates again orientation and position. If places are far, it shows smaller content. If places are near you, it shows it bigger.
Learn more with this article.
Show place icon for every place. Clicking on the icon will show the place name.
Show icon and place name above. Clicking on places will redirect to a certain URL (now mocked up).
Every example uses the
places.js script to load places. You set your places using static data, with specific coordinates, adding these info in the first lines of code (there are comments to explain it better).
Otherwise, as default, the script searches for places of interest near the user using Foursquare APIs. Please retrieve valid API credentials here in order to use it. Place credentials (replace both Client Secret and Client Id) on
You can also use GeoAR.js without the script, adding
gps-entity-place entities directly on the
index.html file.as documentated here.
- Get Started
- Guides for Beginners
- Advanced Guides
- Augmented Website
- Browser Support
Augmented Reality for the Web in less than 10 lines of HTML
<!doctype HTML> <html> <script src="https://aframe.io/releases/1.0.0/aframe.min.js"></script> <script src="https://raw.githack.com/jeromeetienne/AR.js/2.1.4/aframe/build/aframe-ar.js"></script> <body style='margin : 0px; overflow: hidden;'> <a-scene embedded arjs> <a-marker preset="hiro"> <a-box position='0 0.5 0' material='color: yellow;'></a-box> </a-marker> <a-entity camera></a-entity> </a-scene> </body> </html>
See on codepen
A-Frame magic :) All details are explained in this super post "Augmented Reality in 10 Lines of HTML - AR.js with a-frame magic" by @AndraConnect.
Guides for beginners
- AR.js introduction and insight on markers
- Details about 3D models that can be used with AR.js
- "WebVR for Augmented Reality - Using WebVR to write cross-platform AR applications" by @jerome_etienne
- "AR-Code:a Fast Path to Augmented Reality - From QR Code to AR.js content" by @jerome_etienne
- Location Based (GPS) Augmented Reality on the Web
- Tutorial for Location Based Augmented Reality on the Web
- How to deliver AR.js only with a QR Code
- How to handle click with AR.js
- 10 tips to enhance your AR.js app performances
- "Area Learning with Multi-Markers in AR.js - For a Larger & More Stable Augmented Reality" by @AndraConnect
- Great post about WebAR for designer by nexus interactive arts
Try to get inspired by this great works:
- Click Places - set up remote credentials to fetch remote places (
- Only HTML - add new places statically on html (
- Examples inspired from AR.js - not AR.js based from @stemkoski
- AR-gif: Easy to use web components to do web augmented reality. Currently supporting gifs, but open for contributions to add 3d objects, videos and so on.
- AR.js on gitter: https://gitter.im/AR-js/Lobby
- Trello board for ongoing work: https://trello.com/b/63F7JlvD/arjs
- Pattern Marker Generator: Generate a pattern marker with your own image.
- ARCode Generator: Generator of AR-Code (source)
We are still early in the project but here are some initial numbers to give you an idea.
- I got 60fps stable on nexus6p
- Some reports Sony Xperia Z2 (2.5 years old) runs around 50fps - this is a 170euro phone
- Some reports ~50fps on a old nexus5, and ~60fps on nexus 9 - nexus5 is 3.5 years old!
- Some reports it working on windows phone edge!! 13fps on Lumia 950 for some. 40-45fps on lumia 930 for others.
Obviously you mileage may vary. The performance you get will depend on 3 things: How heavy your 3D is, How you tune your parameters and the hardware that you are using.
Standing on the Shoulders of Giants
So we shown it is now possible to do 60fps web-based augmented reality on a phone. This is great for sure but how did we get here ? By standing on the shoulders of giants! It is thanks to the hard work from others, that we can today reach this mythic 60fps AR. So I would like to thanks :
- three.js for being a great library to do 3d on the web.
- artoolkit! years of development and experiences on doing augmented reality
- chromium! thanks for being so fast!
Only thanks to all of them, I could do my part : Optimizing performance from 5fps on high-end phone, to 60fps on 2years old phone.
After all this work done by a lot of people, we have a web-based augmented reality solution fast enough for mobile!
Now, many people got a phone powerful enough to do web AR in their pocket. I think this performance improvement makes web AR a reality. i am all exited by what people are gonna with it :)
Recently, we’ve been getting creative and working on developing new things with AR.js. One of them is playing around with shadows, syncing the position of virtual lights with reality for a more life-like finish:
We’ve been collaborating very closely with Fredrick Blomqvist. His input has had a great impact on AR.js innovation and we want to thank him. Together, we’ve been implementing refraction, giving the 3d a transparent/glassy effect. It ended up having a nice polished look. What do you guys think?
- At the three.js level is the main one. It is working well and efficiently
- a-frame component - it export
<a-marker>tag. It becomes real easy to use. It allows the things three.js extension does. Here are some slides aframe-artoolkit
- webvr-polyfill: it is kind of working - still a work-in-progress
/three.jsis the extension to use it with pure three.js
/aframeis the extension to use it with a-frame
/webvr-polyfillis the WebVR polyfill so you can reuse your #AR / #VR content easily
What's Next ?
We did good on performance, but there are still a lot of room for optimisation. Using webworkers would increase cpu usage. Compiling in webassembly instead of asm.js should improve loading time and likely cpu performance. And obviously, we can still do more parameters tweaking :)
I would like people start experience augmented reality and play with it. This is highly creative! Just look at this puzzle game in #AR playing with mirror and laser beam. You could do it with AR.js, so opensource and running on normal phones, no need to buy a new device. isn't that great!
Demo tested on the following browser setups:
- Desktop Chrome with webcam and 2 tabs (one for Hero, one for result) (works!)
- Android native 4.4.2 (doesn't work, doesn't ask for permission to use camera. I see white background and text)
- Android native 5.0 (doesn't work, doesn't ask for permission, I see white background and text)
- Chrome on Android 4.4.2 (works!)
- Chrome on Android 5.0 (doesn't work, asks for permission, I see black background, text and a chart)
- Safari and Chrome on iOS < 11 (doesn't work, doesn't ask for permission, I see white background and text)
- Microsoft Edge on Windows 10 (Chrome on Google Pixel phone to view hologram)
Credits: @HelloDeadline, @sorianog
It is all open source! jsartoolkit5 is under LGPLv3 license and additional permission. And All my code in AR.js repository is under MIT license. :)