Note: this article is short and doesn't give detailed answers as much as I would have liked. I started writing it a while ago and realized it had never been published. I haven't worked with QCAR for a couple of months now, so the subject isn't so fresh in my mind anymore. Here it goes...
I've worked with QCAR for about two months earlier this summer. Using the library is very easy, and it gives pretty good results in terms of responsiveness and robustness. But because my knowledge of OpenGL is very limited, my worst problem has been importing my own 3D model and making it render correctly (with textures and proper lighting).
Use Blender to triangulate
First, mobile devices don't run the standard OpenGL library, they run OpenGL ES. This means 3D models have to be triangulated or they won't render at all. Triangulation is the process of dividing all polygons into triangles.
Blender is a free open source 3D graphics application. It can easily be installed on any Ubuntu version by installing the package named blender. Using Blender you'll be able to triangulate your model when exporting to an .obj file. Then you'll have to export the .obj file to a .h, which finally can be imported into your QCAR/Android project. This might be "great" for testing, but in the long term, you'll run into dozens of problems of lighting, reflection, animation, etc.
A problem you might run into is using badly dimensioned textures. This problem was kind of hard to find for me as you only get runtime fatal errors which don't give any relevant detail. But you need to know that almost all mobile devices will only take squares and 2x1 / 1x2 rectangles for texture files. For example, these dimensions would work: 512 x 512, 32 x16 and 128 x 256 pixels. These would not : 1024 x 16, 512 x 64 pixels. Another thing with textures: depending on models, there are limits to the total number of texture files you can load at the same time in an application, and there are limits to their dimensions (1024, 512, and 256 pixels).
I recommend using Unity
According to Wikipedia, "Unity is an integrated authoring tool for creating 3D video games or other interactive content such as architectural visualizations or real-time 3D animations." In other words: it makes A LOT OF STUFF much better and much faster than an OpenGL developer (or a whole team) would do. What are the downsides? Size (approximately 16 to 20 MB when correctly compiled), cost ($400 for the Android license), and finally, support is not as good on Android as it is on iOS. More information available on Unity's website.
Even if Unity's solution isn't perfect (are there any perfect solutions anyway?), it is in my opinion a million times better than working with your own 3D model and custom OpenGL ES. You'll be able to simplify your model(s) to enhance performance (which is very important on mobile devices), lighting and other visual effects will be much easier to create, etc. Overall, you'll get a much better result for way less effort. Everyone wins!
Please visit QCAR's developer site for SDK download, documentation on how to start a QCAR project, how to integrate the Unity extension, and more.
In my previous post, Augmented Reality on Android, I listed several AR libraries for Android. After reading and trying some of them, I finally decided to go with Qualcomm's QCAR. By great coincidence, QCAR's first production-ready release happened this week with version 1.0.0.
My reasons for choosing QCAR
- Official support for a great list of devices, old and recent
- Their demos, tested on my Samsung Galaxy S, are way snappier than other libraries I tried
- It recognizes partial markers (when partly in the camera's sight)
- Great developer guide and API documentation
- Great developer community (forums)
Loading a 3D model
As stated in my previous post, I need to load a 3D model over a marker when it comes in the camera's sight. The model I have to load is a .obj file, but QCAR only "works" with .h files (the usual way of doing things in OpenGL). I found two ways of solving this problem:
- Converting .obj file to .h file using this script: OBJ2OPENGL
- Using a second library to load .obj files
Right now, I'm trying both options. I've had success with the min3d library, but I'm experiencing some image distortion. I still have a lot of work to do. Like I said before, I'm no Android expert, and I'm still learning the basics. I'll be back soon with more on this subject. In the meantime, feel free to post any comment or question.
---- EDIT (September 9, 2011) ----
I am not working on this project anymore, but I'd like to let everyone know I didn't use min3d. I converted my 3D model to OpenGL ES .h file. Read this post for more information.
Augmented reality is an old concept but only recently, we start seeing more and more of it on our phones. Here's my quest for finding a good library that will help me build an Android augmented reality as requested by a client. I want to add to at the moment of writing this, I'm fairly new to Android development and I'm about to create an AR application for the first time of my life. What are we waiting for?
- Display a 3D model of "something" on an event ticket
- Recognize a pattern or a picture (that will be printed on the ticket)
- Add a 3D model layer over the pattern or image
- Be as responsive as possible (lagging AR sucks)
Obviously, finding an AR library for this small project would be a good thing. After searching Google for a while, here's what I have found:
- Magnitude (Google Code project)
- Qualcomm AR or QCAR (Qualcomm AR SDK download page)
- ARToolKit (Sourceforce page)
- Popcode (Popcode official demos)
- AndAR (Google Code project)
- Android AR-Kit (GitHub page, tutorial)
- Mixare (Official website)
- NyARToolKit (Official website)
First, the project's last update was in July 2010. Not too old, but not that recent either. Second, it seems to be only based on GPS instead of marker recognition. Also, the author says it uses AR-KIT (listed 6th in my previous list), ported to Android. It can't help me.
Updated for the last time in December 2010, this project offers multiple target recognition and seems to have great documentation. This library is definitely worth a try.
Not much is said on the project's page, but it seems somewhat serious and works with marker recognition. Will probably give it a try.
Their demos look very great, but based on their documentation (if I understand well), it only works with specially designed Popcode markers, and as of now, there is no way to display my own 3D model, if it's not previously saved on the device's SD card. It seems to be a great library though, so investing more time to understand the way it works correctly would be a good thing.
Already tried it to create a green cube that appears on a marker. Works great and is very easy to use, but I experience a lot of lag with my Samsung Galaxy S. I'll take a look at the library's code and try to find what the problem is if I can't find a better library.
6. Android AR-Kit
This was originally an iPhone only library, but it has been ported to Android. Two major problems though: there has been no update since December 2009, and it only works with geographic localization.
This seems to be a very nice library that supports both Android and iPhone. Problem for me: it only works with geographic localization.
This project supports many languages (Java / Android / C# / ActionScript3 / C++). Here's the link for the Android project. The project is well alive with last commit on April 15. It supports multiple markers and is definitely worth a try.
Now I gotta make tests with: QCAR, ARToolKit, AndAR, and NyARToolKit. Stay tuned for the upcoming conclusion in a couple of days or weeks.