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.
Programming
VR Programming