More Related Content Similar to Paug paris 2011 Similar to Paug paris 2011 (20) Paug paris 20111. Creating Novel Augmented Reality
Applications for Android
www.diotasoft.com
Sebastian Knödel Ludovic Perrier Yohan Hadjedi
skn@diotasoft.com lpe@diotasoft.com yha@diotasoft.com
sekond ludovic_perrier nah0y
PAUG 1
2. Content
Brief History of Mobile AR
Mobile AR SDKs & APIs
Qualcomm AR SDK (QCAR)
QCAR & Unity3D
Mobile AR Games
Future of mobile AR
PAUG 2
3. Brief History of Mobile AR
Sensor based tracking
GPS position
Compass orientation
Courtesy Wikitude Wikitude 2009
Vision based tracking
Courtesy TU Graz
Special Marker 1999 ARToolkitPlus 2007 NyARToolkit 2009
PAUG 3
4. Brief History of Mobile AR
Vision based tracking
Courtesy Qualcomm
Qualcomm AR
Courtesy Metaio
Natural Features
Diotasoft - Werber 2010 Metaio/Juneio
PAUG 4
6. Qualcomm AR SDK (QCAR)
• Library for mobile AR development Different target types
• Android only
• Supported devices Qualcomm CPU
(Nexus One/S, HTC Desire)
• SDK with Eclipse integration
PAUG 6
7. Workflow QCAR
Mobile application
Target Images (jpg/png)
App Logic & Rendering
Engine
Target Position
QDevNet
QCAR library
Target Management
Application
Target.dat Config.xml Target Resources
PAUG 7
8. QCAR API
Virtual Multi Image Image
Button Target Target
Marker Developer Application
Tracker
Camera Rendering
Android
PAUG 8
9. Developing with QCAR
Initialize
Java
SDK myApp extends Activity{ C/CPP
void onCreate(){ myNativeRenderFrame(JNIEnv *, jobject){
glClear(…);
Initialize_App();
Initialize_QCAR(); // Render video background:
Load QCAR::Renderer::getInstance().begin();
Tracker mLoadTrackerTask = new LoadTrackerTask(); for(i … state.getNumActiveTrackables()) {
QCAR::Trackable* trackable =
state.getActiveTrackable(i);
mRenderer = new myRenderer();
mGlView.setRenderer(mRenderer); modelViewMatrix =
Update convertPose2GLMatrix(trackable->getPose());
Camera myRenderer implements glMatrixMode(GL_MODELVIEW);
Pose GLSurfaceView.Renderer{ glLoadMatrixf(modelViewMatrix.data);
void onDrawFrame(GL10 gl){ …
myNativeRenderFrame(); …
} Add Your OpenGLES 1.1/2.0 Render Code Here
} …
}
Update GL }
Rendering // finish GL Rendering
void onPause(){ QCAR::Renderer::getInstance().end();
QCAR.onPause(); }
}
void onDestroy(){
QCAR.deinit();
Close SDK }
};
PAUG 9
11. QCAR and Unity3D
Workflow
• Create Target QDevNet
• Add target resources to project
• Add ARCamera Prefab
• Add myTarget Prefab
• Add 3D objects, physics, shaders,
Game Logic, etc.
• Deploy on Android device
PAUG 11
12. Soundplugin for Unity3D
public class JavaClass{ JavaClass.java SoundManager.java
private Activity mActivity;
public static void initSounds(Context theContext)
public JavaClass(Activity currentActivity) { {
mActivity = currentActivity; …
SoundManager.initSounds(mActivity);
SDK }
mAudioManager =
(AudioManager) mContext.getSystemService
public int ActivitySoundPlay(int id, (Context.AUDIO_SERVICE);
float volume) { }
return SoundManager.playSound(id, volume,…);
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
NativeJavaBridge.CPP (JNI)
jclass cls_Activity = jni_env->FindClass("com/unity3d/player/UnityPlayer");
jclass cls_JavaClass = jni_env->FindClass("com/diotasoft/pluginunity/JavaClass");
activitySoundPlay = jni_env->GetMethodID(cls_JavaClass, "ActivitySoundPlay", "(IFFIF)I");
…
}
NDK int playSound(int index, float volume, int repeat, float pitch) {
jint currentStream = (jint)jni_env->CallObjectMethod(JavaClass, activitySoundPlay, index, volume,
repeat, pitch);
…
}
public class AndroidSoundPoolPlugin : MonoBehaviour {
AndroidSoundPlugin.CS (C#)
Unity [DllImport("javabridge")]
private static extern int playSound(int index, float volume, int repeat, float pitch);
[DllImport("javabridge")]
private static extern void stopSound(int currentStream);
};
PAUG 12
14. Conclusions
QCAR Android SDK/NDK QCAR Unity
• Open system (hands on) • Closed system
• Existant code integration • Fast content creation
• Features you implement • Plugins & profiling
• Developer community • Rich feature sets provided
PAUG 14