I have finally made some thorough testing of how Oculus Rift work with various AGKVR commands.
To approach this seriously, I wrote a program which displays all the AGKVR information I could find:
// Project: HMD data
// Created: 2018-03-21
// show all errors
SetErrorMode(2)
// set window properties
SetWindowTitle( "HMD data" )
SetWindowSize( 1024, 1024, 0 )
SetWindowAllowResize( 1 ) // allow the user to resize the window
// set display properties
SetVirtualResolution( 1024, 1024 ) // doesn't have to match the window
SetAntialiasMode( 1 ) // 1=4xMSAA
SetSyncRate( 90, 0 )
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts
//Load the AGKVR plugin
#import_plugin AGKVR
/*===============================================================================
VR TECH STUFFIE
===============================================================================*/
//Set the Camera Range in AGKVR
//It is necessary to use this command for setting the camera's range instead of the standard AGK SetCameraRange command
//AGKVR.SetCameraRange( 0.01, 1000.0 )
AGKVR.SetCameraRange( 0.01, 1000.0 )
//Initialiaze AGKVR
// The parameters are the Right and Left Eye image ID's that will be used to render to the HMD
InitError As Integer
RightEyeImg As Integer = 500
LeftEyeImg As Integer = 501
InitError = AGKVR.Init( RightEyeImg, LeftEyeImg )
// InitError = 0: SUCCESS!
// InitError = 1: Unable to init VR runtime
// InitError = 2: Compositor initialization failed.
//This command will lock the player's heading direction
//to follow the turn angle of the HMD. This would be common in FPS games, where
//you want the forward moving direction's turn angle to change based on where the
//player is looking. LockPlayerTurn is ON(1) by default
AGKVR.LockPlayerTurn( 1 )
//This command will lock the player's heading direction (forward on the Z axis)
//to follow the pitch angle of the HMD. This would be useful in a freeflight style game
//where you want the forward moving direction's pitch angle to change based on where the
//player is looking. LockPlayerPitch is OFF(0) by default
AGKVR.LockPlayerPitch( 0 )
myStr as String
myText = CreateText(myStr)
SetTextPosition ( myText, 10, 10 )
SetTextSize ( myText, 25 )
SetTextVisible( myText, 0 )
SetTextColor( myText, 0, 0, 0, 255 )
SetTextMaxWidth( myText, 800 )
theFont = LoadFont( "Now-Medium.otf" )
SetTextFont( myText, theFont )
/*===============================================================================
DISPLAYED TEXT
===============================================================================*/
screen2D = CreateObjectPlane( 1.024, 1.024 )
SetObjectPosition(screen2D, 0.0, 1.8, 0.6)
setObjectRotation (screen2D, 0, 0, 0)
screen2DImg = CreateRenderImage (1600,1600,0,0)
dataInput = 1 // the kind of input displayed at the monitor
do
// Escape to exit
if GetRawKeyPressed(27)
AGKVR.Shutdown() // Clean shutdown
End
endif
if GetRawKeyPressed(49) then dataInput = 1 // 1 === SETUP COMMANDS:
if GetRawKeyPressed(50) then dataInput = 2 // 2 === PLAYER COMMANDS:
if GetRawKeyPressed(51) then dataInput = 3 // 3 === CONTROLLER COMMANDS: (LEFT)
if GetRawKeyPressed(52) then dataInput = 4 // 4 === CONTROLLER COMMANDS: (RIGHT)
if GetRawKeyPressed(53) then dataInput = 5 // 5 === CHAPERONE COMMANDS:
if GetRawKeyPressed(54) then dataInput = 6 // 6 === DEVICE INFO COMMANDS:
if dataInput = 1
myStr = "SETUP COMMANDS:" + Chr(10) + Chr(10)
myStr = myStr + "HMD present: " + trueFalse(AGKVR.IsHmdPresent()) + Chr(10)
myStr = myStr + "Runtime installed: " + trueFalse(AGKVR.IsRuntimeInstalled()) + Chr(10)
myStr = myStr + "Tracking space: " + seatedStanding(AGKVR.GetTrackingSpace()) + Chr(10)
myStr = myStr + "World scale: " + str(AGKVR.GetWorldScale()) + Chr(10)
endif
if dataInput = 2
myStr = "PLAYER COMMANDS:" + Chr(10) + Chr(10)
myStr = myStr + "Player X position: " + str(AGKVR.GetPlayerX()) + Chr(10)
myStr = myStr + "Player Y position: " + str(AGKVR.GetPlayerY()) + Chr(10)
myStr = myStr + "Player Z position: " + str(AGKVR.GetPlayerZ()) + Chr(10)
myStr = myStr + "Player X angle: " + str(AGKVR.GetPlayerAngleX()) + Chr(10)
myStr = myStr + "Player Y angle: " + str(AGKVR.GetPlayerAngleY()) + Chr(10)
myStr = myStr + "Player Z angle: " + str(AGKVR.GetPlayerAngleZ()) + Chr(10)
myStr = myStr + "HMD X position: " + str(AGKVR.GetHMDX()) + Chr(10)
myStr = myStr + "HMD Y position: " + str(AGKVR.GetHMDY()) + Chr(10)
myStr = myStr + "HMD Z position: " + str(AGKVR.GetHMDZ()) + Chr(10)
myStr = myStr + "HMD X angle: " + str(AGKVR.GetHMDAngleX()) + Chr(10)
myStr = myStr + "HMD Y angle: " + str(AGKVR.GetHMDAngleY()) + Chr(10)
myStr = myStr + "HMD Z angle: " + str(AGKVR.GetHMDAngleZ()) + Chr(10)
myStr = myStr + "Right hand X position: " + str(AGKVR.GetRightHandX()) + Chr(10)
myStr = myStr + "Right hand Y position: " + str(AGKVR.GetRightHandY()) + Chr(10)
myStr = myStr + "Right hand Z position: " + str(AGKVR.GetRightHandZ()) + Chr(10)
myStr = myStr + "Right hand X angle: " + str(AGKVR.GetRightHandAngleX()) + Chr(10)
myStr = myStr + "Right hand Y angle: " + str(AGKVR.GetRightHandAngleY()) + Chr(10)
myStr = myStr + "Right hand Z angle: " + str(AGKVR.GetRightHandAngleZ()) + Chr(10)
myStr = myStr + "Left hand X position: " + str(AGKVR.GetLeftHandX()) + Chr(10)
myStr = myStr + "Left hand Y position: " + str(AGKVR.GetLeftHandY()) + Chr(10)
myStr = myStr + "Left hand Z position: " + str(AGKVR.GetLeftHandZ()) + Chr(10)
myStr = myStr + "Left hand X angle: " + str(AGKVR.GetLeftHandAngleX()) + Chr(10)
myStr = myStr + "Left hand Y angle: " + str(AGKVR.GetLeftHandAngleY()) + Chr(10)
myStr = myStr + "Left hand Z angle: " + str(AGKVR.GetLeftHandAngleZ()) + Chr(10)
endif
if dataInput = 3
myStr = "CONTROLLER COMMANDS:: (LEFT)" + Chr(10) + Chr(10)
myStr = myStr + "Left controller found: " + trueFalse(AGKVR.LeftControllerFound()) + Chr(10)
myStr = myStr + "Left controller X axis: " + str(AGKVR.LeftController_JoyX()) + Chr(10)
myStr = myStr + "Left controller Y axis: " + str(AGKVR.LeftController_JoyY()) + Chr(10)
myStr = myStr + "Left controller trigger: " + str(AGKVR.LeftController_Trigger()) + Chr(10)
myStr = myStr + "Left controller grib: " + trueFalse(AGKVR.LeftController_Grip()) + Chr(10) // is it really an integer? Yes.
myStr = myStr + "Left controller button 1: " + trueFalse(AGKVR.LeftController_Button1()) + Chr(10)
myStr = myStr + "Left controller button 2: " + trueFalse(AGKVR.LeftController_Button2()) + Chr(10)
myStr = myStr + "Left controller finger pointed: " + trueFalse(AGKVR.LeftController_GetFingerPointed()) + Chr(10)
myStr = myStr + "Left controller thumbs up: " + trueFalse(AGKVR.LeftController_GetThumbUp()) + Chr(10) //
myStr = myStr + "Left controller Axis trigger X [0]: " + str(AGKVR.LeftController_AxisTriggerX(0)) + Chr(10)
myStr = myStr + "Left controller Axis trigger X [1]: " + str(AGKVR.LeftController_AxisTriggerX(1)) + Chr(10)
myStr = myStr + "Left controller Axis trigger X [2]: " + str(AGKVR.LeftController_AxisTriggerX(2)) + Chr(10)
myStr = myStr + "Left controller Axis trigger X [3]: " + str(AGKVR.LeftController_AxisTriggerX(3)) + Chr(10)
myStr = myStr + "Left controller Axis trigger X [4]: " + str(AGKVR.LeftController_AxisTriggerX(4)) + Chr(10)
myStr = myStr + "Left controller Axis trigger X [5]: " + str(AGKVR.LeftController_AxisTriggerX(5)) + Chr(10)
myStr = myStr + "Left controller Axis trigger Y [0]: " + str(AGKVR.LeftController_AxisTriggerY(0)) + Chr(10)
myStr = myStr + "Left controller Axis trigger Y [1]: " + str(AGKVR.LeftController_AxisTriggerY(1)) + Chr(10)
myStr = myStr + "Left controller Axis trigger Y [2]: " + str(AGKVR.LeftController_AxisTriggerY(2)) + Chr(10)
myStr = myStr + "Left controller Axis trigger Y [3]: " + str(AGKVR.LeftController_AxisTriggerY(3)) + Chr(10)
myStr = myStr + "Left controller Axis trigger Y [4]: " + str(AGKVR.LeftController_AxisTriggerY(4)) + Chr(10)
myStr = myStr + "Left controller Axis trigger Y [5]: " + str(AGKVR.LeftController_AxisTriggerY(5)) + Chr(10)
myStr = myStr + "buttons:" + Chr(10)
for allB = 0 to 63
myStr = myStr + str(allB) + ":" + checkmarks(AGKVR.LeftController_ButtonPressed(allB))
next
endif
if dataInput = 4
myStr = "CONTROLLER COMMANDS:: (RIGHT)" + Chr(10) + Chr(10)
myStr = myStr + "Right controller found: " + trueFalse(AGKVR.RightControllerFound()) + Chr(10)
myStr = myStr + "Right controller X axis: " + str(AGKVR.RightController_JoyX()) + Chr(10)
myStr = myStr + "Right controller Y axis: " + str(AGKVR.RightController_JoyY()) + Chr(10)
myStr = myStr + "Right controller trigger: " + str(AGKVR.RightController_Trigger()) + Chr(10)
myStr = myStr + "Right controller grib: " + trueFalse(AGKVR.RightController_Grip()) + Chr(10) // is it really an integer? Yes.
myStr = myStr + "Right controller button 1: " + trueFalse(AGKVR.RightController_Button1()) + Chr(10)
myStr = myStr + "Right controller button 2: " + trueFalse(AGKVR.RightController_Button2()) + Chr(10)
myStr = myStr + "Right controller finger pointed: " + trueFalse(AGKVR.RightController_GetFingerPointed()) + Chr(10)
myStr = myStr + "Right controller thumbs up: " + trueFalse(AGKVR.RightController_GetThumbUp()) + Chr(10)
myStr = myStr + "Right controller Axis trigger X [0]: " + str(AGKVR.RightController_AxisTriggerX(0)) + Chr(10)
myStr = myStr + "Right controller Axis trigger X [1]: " + str(AGKVR.RightController_AxisTriggerX(1)) + Chr(10)
myStr = myStr + "Right controller Axis trigger X [2]: " + str(AGKVR.RightController_AxisTriggerX(2)) + Chr(10)
myStr = myStr + "Right controller Axis trigger X [3]: " + str(AGKVR.RightController_AxisTriggerX(3)) + Chr(10)
myStr = myStr + "Right controller Axis trigger X [4]: " + str(AGKVR.RightController_AxisTriggerX(4)) + Chr(10)
myStr = myStr + "Right controller Axis trigger X [5]: " + str(AGKVR.RightController_AxisTriggerX(5)) + Chr(10)
myStr = myStr + "Right controller Axis trigger Y [0]: " + str(AGKVR.RightController_AxisTriggerY(0)) + Chr(10)
myStr = myStr + "Right controller Axis trigger Y [1]: " + str(AGKVR.RightController_AxisTriggerY(1)) + Chr(10)
myStr = myStr + "Right controller Axis trigger Y [2]: " + str(AGKVR.RightController_AxisTriggerY(2)) + Chr(10)
myStr = myStr + "Right controller Axis trigger Y [3]: " + str(AGKVR.RightController_AxisTriggerY(3)) + Chr(10)
myStr = myStr + "Right controller Axis trigger Y [4]: " + str(AGKVR.RightController_AxisTriggerY(4)) + Chr(10)
myStr = myStr + "Right controller Axis trigger Y [5]: " + str(AGKVR.RightController_AxisTriggerY(5)) + Chr(10)
myStr = myStr + "buttons:" + Chr(10)
for allB = 0 to 63
myStr = myStr + str(allB) + ":" + checkmarks(AGKVR.RightController_ButtonPressed(allB))
next
endif
if dataInput = 5
myStr = "CHAPERONE COMMANDS:" + Chr(10) + Chr(10)
myStr = myStr + "Play area size X: " + str(AGKVR.Chaperone_GetPlayAreaSizeX()) + Chr(10)
myStr = myStr + "Play area size Z: " + str(AGKVR.Chaperone_GetPlayAreaSizeZ()) + Chr(10)
myStr = myStr + "Are bounds visible: " + trueFalse(AGKVR.Chaperone_AreBoundsVisible()) + Chr(10)
myStr = myStr + "play area point 1X: " + str(AGKVR.Chaperone_GetPlayAreaPoint1X()) + Chr(10)
myStr = myStr + "play area point 1Y: " + str(AGKVR.Chaperone_GetPlayAreaPoint1Y()) + Chr(10)
myStr = myStr + "play area point 1Z: " + str(AGKVR.Chaperone_GetPlayAreaPoint1Z()) + Chr(10)
myStr = myStr + "play area point 2X: " + str(AGKVR.Chaperone_GetPlayAreaPoint2X()) + Chr(10)
myStr = myStr + "play area point 2Y: " + str(AGKVR.Chaperone_GetPlayAreaPoint2Y()) + Chr(10)
myStr = myStr + "play area point 2Z: " + str(AGKVR.Chaperone_GetPlayAreaPoint2Z()) + Chr(10)
myStr = myStr + "play area point 3X: " + str(AGKVR.Chaperone_GetPlayAreaPoint3X()) + Chr(10)
myStr = myStr + "play area point 3Y: " + str(AGKVR.Chaperone_GetPlayAreaPoint3Y()) + Chr(10)
myStr = myStr + "play area point 3Z: " + str(AGKVR.Chaperone_GetPlayAreaPoint3Z()) + Chr(10)
myStr = myStr + "play area point 4X: " + str(AGKVR.Chaperone_GetPlayAreaPoint4X()) + Chr(10)
myStr = myStr + "play area point 4Y: " + str(AGKVR.Chaperone_GetPlayAreaPoint4Y()) + Chr(10)
myStr = myStr + "play area point 4Z: " + str(AGKVR.Chaperone_GetPlayAreaPoint4Z()) + Chr(10)
endif
if dataInput = 6
myStr = "DEVICE INFO COMMANDS:" + Chr(10) + Chr(10)
myStr = myStr + "HMD Serial number: " + AGKVR.HMD_GetSerialNumber() + Chr(10)
//myStr = myStr + "HMD tracking system: " + AGKVR.HMD_GetTrackingSystem() + Chr(10)
myStr = myStr + "HMD Model number: " + AGKVR.HMD_GetModelNumber() + Chr(10)
myStr = myStr + "HMD Manufacturer: " + AGKVR.HMD_GetManufacturer() + Chr(10)
myStr = myStr + "Right Controller serial number: " + AGKVR.RCntrl_GetSerialNumber() + Chr(10)
//myStr = myStr + "Right Controller tracking system: " + AGKVR.RCntrl_GetTrackingSystem() + Chr(10)
myStr = myStr + "Right Controller model number: " + AGKVR.RCntrl_GetModelNumber() + Chr(10)
myStr = myStr + "Right Controller Manufacturer: " + AGKVR.RCntrl_GetManufacturer() + Chr(10)
myStr = myStr + "Left Controller serial number: " + AGKVR.LCntrl_GetSerialNumber() + Chr(10)
//myStr = myStr + "Left Controller tracking system: " + AGKVR.LCntrl_GetTrackingSystem() + Chr(10)
myStr = myStr + "Left Controller model number: " + AGKVR.LCntrl_GetModelNumber() + Chr(10)
myStr = myStr + "Left Controller Manufacturer: " + AGKVR.LCntrl_GetManufacturer() + Chr(10)
endif
SetTextString( myText, myStr )
/*===============================================================================
RENDER 2D
===============================================================================*/
SetTextVisible( myText, 1 )
SetRenderToImage(screen2DImg,0)
SetClearColor( 255, 255, 255 ) // Setting the clear / background colour for the 2D render
ClearScreen() // Clear the render image before rendering
Update2D( GetFrameTime() )
Render2DFront()
setrendertoscreen()
SetTextVisible( myText, 0 )
setObjectImage(screen2D,screen2DImg,0)
/*===============================================================================
RENDER TO VR
===============================================================================*/
AGKVR.UpdatePlayer( )
//This command renders to the HMD.
AGKVR.Render( )
/*===============================================================================
RENDER TO SCREEN
===============================================================================*/
SetCameraPosition( 1, 0.0, 1.80, 0.0)
SetCameraLookAt(1, getObjectX(screen2D), getObjectY(screen2D), getObjectZ(screen2D), 0.0)
Sync()
loop
function trueFalse (meNumber as Integer)
reply as String
if meNumber = 0
reply = "NO"
else
reply = "YES"
endif
endfunction reply
function checkmarks (meNumber as Integer)
reply as String
if meNumber = 0
reply = "[ ] "
else
reply = "[V] "
endif
endfunction reply
function seatedStanding (meNumber as Integer)
reply as String
if meNumber = 0
reply = "SEATED"
else
reply = "STANDING"
endif
endfunction reply
To use my program remember to click on its window to make it active, so it accepts keyboard input. Use the number keys to change what information is displayed:
1 :: Setup Commands
2 :: Player Commands
3 :: Controller Commands (Left)
4 :: Controller Commands (Right)
5 :: Chaperone commands
6 :: Device Info commands
Using the program above I got the following info for the Oculus Rift CV1. (I have no VIVE, so I can't test that. If anyone has VIVE and could check how it worked, it would be super helpful!)
LEFT TOUCH CONTROLLER:
---------------------------------------------------------------------------------------------
float AGKVR.LeftController_JoyX() // Left Touch Controller: Thumbstick X axis (-1.0 to +1.0)
float AGKVR.LeftController_JoyY() // Left Touch Controller: Thumbstick Y axis (-1.0 to +1.0)
float AGKVR.LeftController_Trigger() // Left Touch Controller: Trigger (0.0 to 1.0)
integer AGKVR.LeftController_Grip() // Left Touch Controller: Grip
integer AGKVR.LeftController_Button1() // Left Touch Controller: Button Y
integer AGKVR.LeftController_Button2() // Left Touch Controller: Button X or Thumbstick click
integer AGKVR.LeftController_GetFingerPointed() // Left Touch Controller: Not touching trigger
integer AGKVR.LeftController_GetThumbUp() // Left Touch Controller: Not touching Button Y, Button X or the thumbstick
float AGKVR.LeftController_AxisTriggerX(0) // Left Touch Controller: Thumbstick X axis (-1.0 to +1.0)
float AGKVR.LeftController_AxisTriggerX(1) // Left Touch Controller: Trigger (0.0 to 1.0)
float AGKVR.LeftController_AxisTriggerX(2) // Left Touch Controller: Grip (0.0 to 1.0)
float AGKVR.LeftController_AxisTriggerY(0) // Left Touch Controller: Thumbstick Y axis (-1.0 to +1.0)
integer AGKVR.LeftController_ButtonPressed(1) // Left Touch Controller: Button Y
integer AGKVR.LeftController_ButtonPressed(2) // Left Touch Controller: Grip
integer AGKVR.LeftController_ButtonPressed(7) // Left Touch Controller: Button X
integer AGKVR.LeftController_ButtonPressed(32) // Left Touch Controller: Thumbstick Click
integer AGKVR.LeftController_ButtonPressed(33) // Left Touch Controller: Trigger
integer AGKVR.LeftController_ButtonPressed(34) // Left Touch Controller: Grip
RIGHT TOUCH CONTROLLER:
---------------------------------------------------------------------------------------------
float AGKVR.RightController_JoyX() // Right Touch Controller: Thumbstick X axis (-1.0 to +1.0)
float AGKVR.RightController_JoyY() // Right Touch Controller: Thumbstick Y axis (-1.0 to +1.0)
float AGKVR.RightController_Trigger() // Right Touch Controller: Trigger (0.0 to 1.0)
integer AGKVR.RightController_Grip() // Right Touch Controller: Grip
integer AGKVR.RightController_Button1() // Right Touch Controller: Button B
integer AGKVR.RightController_Button2() // Right Touch Controller: Button A or Thumbstick click
integer AGKVR.RightController_GetFingerPointed() // Right Touch Controller: Not touching trigger
integer AGKVR.RightController_GetThumbUp() // Right Touch Controller: Not touching Button A, Button B or the thumbstick
float AGKVR.RightController_AxisTriggerX(0) // Right Touch Controller: Thumbstick X axis (-1.0 to +1.0)
float AGKVR.RightController_AxisTriggerX(1) // Right Touch Controller: Trigger (0.0 to 1.0)
float AGKVR.RightController_AxisTriggerX(2) // Right Touch Controller: Grip (0.0 to 1.0)
float AGKVR.RightController_AxisTriggerY(0) // Right Touch Controller: Thumbstick Y axis (-1.0 to +1.0)
integer AGKVR.RightController_ButtonPressed(1) // Right Touch Controller: Button B
integer AGKVR.RightController_ButtonPressed(2) // Right Touch Controller: Grip
integer AGKVR.RightController_ButtonPressed(7) // Right Touch Controller: Button A
integer AGKVR.RightController_ButtonPressed(32) // Right Touch Controller: Thumbstick Click
integer AGKVR.RightController_ButtonPressed(33) // Right Touch Controller: Trigger
integer AGKVR.RightController_ButtonPressed(34) // Right Touch Controller: Grip
DEVICE INFO:
---------------------------------------------------------------------------------------------
string AGKVR.HMD_GetModelNumber() // "Oculus Rift CV1"
string AGKVR.HMD_GetManufacturer() // "Oculus"
string AGKVR.RCntrl_GetModelNumber() // "Oculus Rift CV1 (Right Controller)"
string AGKVR.RCntrl_GetManufacturer() // "Oculus"
string AGKVR.LCntrl_GetModelNumber() // "Oculus Rift CV1 (Left Controller)"
string AGKVR.LCntrl_GetManufacturer() // "Oculus"
BTW, the following commands didn't work, so I skipped them:
AGKVR.HMD_GetTrackingSystem()
AGKVR.RCntrl_GetTrackingSystem()
AGKVR.LCntrl_GetTrackingSystem()
... Also, I noticed that the AGKVR documentation is missing AGKVR.Shutdown()