A couple days back AppGameKit v2018.4.12 was released with the major new feature being AR (Augmented Reality) support. I decided to give the new AR functionality a shot and it was really impressive how easy it was. In order to get started with AR and AppGameKit you are going to need an AR compatible device. On iOS, this means an ARKit compatible device, which basically means an iPhone 6S or newer device, while on Android device you need an ARCore compatible device from this list of phones.
I modified the AR example slightly, to remove a bit of functionality and to instead load a simple Tie Fighter model I downloaded off the web and converted to .X format. AppGameKit can be coded using either C++ or their higher level Basic like script, which is what was used in this example. Here is the slightly modified source code used:
// set window properties SetWindowTitle( "AR Tie Fighter" ) SetWindowSize( 1024, 768, 0 ) // set display properties SetVirtualResolution( 1024, 768 ) SetOrientationAllowed( 1, 1, 1, 1 ) SetScissor(0,0,0,0) SetClearColor( 101,120,154 ) SetGenerateMipmaps( 1 ) UseNewDefaultFonts(1) SetPrintSize(20) // camera range from 0.1 meters to 40 meters SetCameraRange( 1, 0.1, 40 ) SetAmbientColor( 128,128,128 ) SetSunColor( 255,255,255 ) // load tie fighter LoadObject( 1, "tie.x") SetObjectPosition( 1, 0,0.1,0 ) LoadImage(1, "diffuse.jpg") SetObjectImage (1,1,0) SetObjectRotation(1,270,0,0) function ShowModel( show as integer ) SetObjectVisible( 1, show ) endfunction ShowModel( 0 ) function ScaleModel( amount as float ) SetObjectScalePermanent( 1, amount, amount, amount ) endfunction ScaleModel( 0.025 ) // create some planes to show detected surfaces, initially hidden for i = 101 to 150 CreateObjectPlane( i, 1,1 ) SetObjectRotation( i, 90,0,0 ) FixObjectPivot( i ) SetObjectVisible( i, 0 ) SetObjectColor( i, 255,255,255,128 ) // 50% transparent SetObjectTransparency( i, 1 ) next i // add some buttons to control various features AddVirtualButton( 1, 100,565,100 ) AddVirtualButton( 2, 100,665,100 ) SetVirtualButtonText( 1, "Scale +" ) SetVirtualButtonText( 2, "Scale -" ) AddVirtualButton( 3, 924,665,100 ) SetVirtualButtonText( 3, "Hide" ) function ShowHUD( show as integer ) SetVirtualButtonVisible( 1, show ) SetVirtualButtonVisible( 2, show ) SetVirtualButtonVisible( 3, show ) SetVirtualButtonActive( 1, show ) SetVirtualButtonActive( 2, show ) SetVirtualButtonActive( 3, show ) endfunction // initialize AR, if possible ARSetup() while( ARGetStatus() = 1 ) // wait while user is being prompted to install ARCore Sync() endwhile AnchorID as integer = 0 ShowPlanes as integer = 1 ambientScale# = 1.0 do // get light estimation ambient = ARGetLightEstimate() * 255 * ambientScale# SetAmbientColor( ambient,ambient,ambient ) // check screen tap for plane hits, but only if buttons are visible if ( GetPointerReleased() and ShowPlanes = 1 ) // check the point that the user tapped on the screen numHits = ARHitTest( GetPointerX(), GetPointerY() ) if ( numHits > 0 ) ShowModel( 1 ) // delete any previous anchor, could keep it around instead if ( AnchorID > 0 ) then ARDeleteAnchor( AnchorID ) // hit test results are ordered from closest to furthest // place the object at result 1, the closest AnchorID = ARCreateAnchorFromHitTest( 1 ) ARFixObjectToAnchor( 1, AnchorID ) else // if the user didn't tap on any planes then hide the object ShowModel( 0 ) endif // clean up some internal resources ARHitTestFinish() endif // place the buttons at the edge of the screen // needs to be done regularly in case orientation changes SetVirtualButtonPosition( 1, GetScreenBoundsLeft()+105, GetScreenBoundsBottom()-210 ) SetVirtualButtonPosition( 2, GetScreenBoundsLeft()+105, GetScreenBoundsBottom()-105 ) SetVirtualButtonPosition( 3, GetScreenBoundsRight()-105, GetScreenBoundsBottom()-105 ) // detect button presses if they are visible if ( ShowPlanes = 1 ) if ( GetVirtualButtonPressed(1) ) ScaleModel( 1.05 ) endif if ( GetVirtualButtonPressed(2) ) ScaleModel( 0.95 ) endif if ( GetVirtualButtonPressed(3) ) ShowPlanes = 1 - ShowPlanes ShowHUD( 0 ) endif else // screen tap whilst button are hidden shows them again if ( GetPointerReleased() ) ShowPlanes = 1 - ShowPlanes ShowHUD( 1 ) endif endif // hide old planes for i = 101 to 150 SetObjectVisible( i, 0 ) next i // show detected planes if ( ShowPlanes ) numPlanes = ARGetPlanes(0) // this demo stops at 50 planes, but there is no internal limit if numPlanes > 50 then numPlanes = 50 for i = 1 to numPlanes SetObjectPosition( i+100, ARGetPlaneX(i), ARGetPlaneY(i), ARGetPlaneZ(i) ) SetObjectRotation( i+100, ARGetPlaneAngleX(i), ARGetPlaneAngleY(i), ARGetPlaneAngleZ(i) ) SetObjectScale( i+100, ARGetPlaneSizeX(i), 1, ARGetPlaneSizeZ(i) ) SetObjectVisible( i+100, 1 ) next i ARGetPlanesFinish() endif if ( ShowPlanes ) Print( "FPS: " + str(ScreenFPS()) ) select( ARGetStatus() ) case 2 : Print( "AR Active" ) : endcase case -1 : Print( "AR Not Available" ) : endcase case -2 : Print( "AR Install Rejected" ) : endcase endselect Print( "Number of Planes Detected: " + str(numPlanes) ) Print( "Light Estimation: " + str(ARGetLightEstimate()) ) Print( "Light Boost: " + str(ambientScale#,1) ) endif // draw the camera feed, and then the rest of the scene ARDrawBackground() Sync() RotateObjectLocalZ(1,1) loop
You can see the results of this code and get a bit more detail by watching the video below:
If you are interested in learning more about AppGameKit, be sure to check out our Closer Look available here.