XR_BD_body_tracking
note
Pico has published official documentation for XR_BD_body_tracking
extension on 05 Feb 2025 with OpenXR 1.1.45 release. You can see it here. This article also covers Pico's private functions related to body-tracking.
Doesn't require any Android permissions for now.
Functions
xrCreateBodyTrackerBD
XrResult xrCreateBodyTrackerBD(
XrSession session,
const XrBodyTrackerCreateInfoBD* createInfo,
XrBodyTrackerBD* bodyTracker);
xrDestroyBodyTrackerBD
XrResult xrDestroyBodyTrackerBD(
XrBodyTrackerBD bodyTracker);
xrLocateBodyJointsBD
XrResult xrLocateBodyJointsBD(
XrBodyTrackerBD bodyTracker,
const XrBodyJointsLocateInfoBD* locateInfo,
XrBodyJointLocationsBD* locations);
xrStartBodyTrackingCalibAppBD
XrResult xrStartBodyTrackingCalibAppBD(
XrInstance instance,
const char* currentPackageName,
XrCalibAppFlagBD flag);
xrGetBodyTrackingStateBD
XrResult xrGetBodyTrackingStateBD(
XrInstance instance,
XrBodyTrackingStatusCodeBD* statusCode,
XrBodyTrackingErrorCodeBD* errorCode);
Types
XrBodyTrackerBD
typedef struct XrBodyTrackerBD_T* XrBodyTrackerBD;
XrBodyTrackingStatusCodeBD
typedef enum XrBodyTrackingStatusCodeBD {
XR_BODYTRACKING_INVALID_BD = 0,
XR_BODYTRACKING_VALID_BD = 1,
XR_BODYTRACKING_LIMITED_BD = 2,
} XrBodyTrackingStatusCodeBD;
XrBodyTrackingErrorCodeBD
typedef enum XrBodyTrackingErrorCodeBD {
XR_BT_ERROR_INNER_EXCEPTION_BD = 0,
XR_BT_ERROR_TRACKER_NOT_CALIBRATED_BD = 1,
XR_BT_ERROR_TRACKER_NUM_NOT_ENOUGH_BD = 2,
XR_BT_ERROR_TRACKER_STATE_NOT_SATISFIED_BD = 3,
XR_BT_ERROR_TRACKER_PERSISTENT_INVISIBILITY_BD = 4,
XR_BT_ERROR_TRACKER_DATA_ERROR_BD = 5,
XR_BT_ERROR_USER_CHANGE_BD = 6,
XR_BT_ERROR_TRACKING_POSE_ERROR_BD = 7,
} XrBodyTrackingErrorCodeBD;
XrCalibAppFlagBD
typedef enum XrCalibAppFlagBD {
XR_CALIB_MOTION_TRACKER_1_BD = 0,
XR_CALIB_MOTION_TRACKER_2_BD = 1,
} XrCalibAppFlagBD;
XrBodyJointSetBD
#define XR_BODY_JOINT_WITHOUT_ARM_COUNT_BD 16
#define XR_BODY_JOINT_COUNT_BD 24
typedef enum XrBodyJointSetBD {
XR_BODY_JOINT_SET_DEFAULT_BD = 0,
//Low accuracy: 16 joints
XR_BODY_JOINT_SET_BODY_WITHOUT_ARM_BD = 1,
//High accuracy: 24 joints
XR_BODY_JOINT_SET_FULL_BODY_JOINTS_BD = 2,
XR_BODY_JOINT_SET_MAX_ENUM_BD = 0x7FFFFFFF,
} XrBodyJointSetBD;
XrBodyTrackerCreateInfoBD
typedef struct XrBodyTrackerCreateInfoBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
XrBodyJointSetBD jointSet;
} XrBodyTrackerCreateInfoBD;
const static XrStructureType XR_TYPE_BODY_TRACKER_CREATE_INFO_BD = 1000385001;
type
must beXR_TYPE_BODY_TRACKER_CREATE_INFO_BD
next
must beNULL
or a valid pointer to the next structure in a structure chain See also:XrBodyTrackerBoneLengthBD
bodyJointSet
must be a validXrBodyJointSetBD
value
XrBodyTrackerBoneLengthBD
typedef struct XrBodyTrackerBoneLengthBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
float headLength;
float neckLength;
float torsoLength;
float hipLength;
float upperLegLength;
float lowerLegLength;
float footLength;
float shoulderLength;
float upperArmLength;
float lowerArmLength;
float handLength;
} XrBodyTrackerBoneLengthBD;
const static XrStructureType XR_TYPE_BODY_TRACKER_BONE_LENGTH_BD = 1000385005;
type
must beXR_TYPE_BODY_TRACKER_BONE_EXT_BD
next
must beNULL
or a valid pointer to the next structure in a structure chain
XrBodyJointsLocateInfoBD
typedef struct XrBodyJointsLocateInfoBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
XrSpace baseSpace;
XrTime time;
} XrBodyJointsLocateInfoBD;
const static XrStructureType XR_TYPE_BODY_JOINTS_LOCATE_INFO_BD = 1000385002;
type
must beXR_TYPE_BODY_JOINTS_LOCATE_INFO_BD
next
must beNULL
or a valid pointer to the next structure in a structure chain
XrBodyJointLocationBD
typedef struct XrBodyJointLocationBD {
XrSpaceLocationFlags locationFlags;
XrPosef pose;
float radius;
} XrBodyJointLocationBD;
radius
is undeclared by official docs, but decompilation shows that it is used.
XrBodyJointLocationsBD
typedef struct XrBodyJointLocationsBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
XrBool32 allJointPosesTracked;
uint32_t jointLocationCount;
XrBodyJointLocationBD* jointLocations;
} XrBodyJointLocationsBD;
const static XrStructureType XR_TYPE_BODY_JOINT_LOCATIONS_BD = 1000385003;
type
must beXR_TYPE_BODY_JOINTS_LOCATE_INFO_BD
next
must beNULL
or a valid pointer to the next structure in a structure chain
XrBodyJointVelocityBD
typedef struct XrBodyJointVelocityBD {
XrSpaceVelocityFlags velocityFlags;
XrVector3f linearVelocity;
XrVector3f angularVelocity;
} XrBodyJointVelocityBD;
XrBodyJointVelocitiesBD
typedef struct XrBodyJointVelocitiesBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
uint32_t jointCount;
XrBool32 isActive; //unused
XrBodyJointVelocityBD* jointVelocities;
} XrBodyJointVelocitiesBD;
const static XrStructureType XR_TYPE_BODY_JOINT_VELOCITIES_BD = 1000385007;
XrSpaceAccelerationFlagsBD
typedef XrFlags64 XrSpaceAccelerationFlagsBD;
static const XrSpaceAccelerationFlagsBD XR_SPACE_ACCELERATION_LINEAR_VALID_BIT_BD = 0x00000001;
static const XrSpaceAccelerationFlagsBD XR_SPACE_ACCELERATION_ANGULAR_VALID_BIT_BD = 0x00000002;
XrBodyJointAccelerationBD
typedef struct XrBodyJointAccelerationBD {
XrSpaceAccelerationFlagsBD accelerationFlags;
XrVector3f linearAcceleration;
XrVector3f angularAcceleration;
} XrBodyJointAccelerationBD;
XrBodyJointAccelerationsBD
typedef struct XrBodyJointAccelerationsBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
uint32_t jointCount;
XrBool32 isActive; //unused
XrBodyJointAccelerationBD* jointAccelerations;
} XrBodyJointAccelerationsBD;
const static XrStructureType XR_TYPE_BODY_JOINT_ACCELERATIONS_BD = 1000385008;
XrBodyJointActionBD
typedef enum XrBodyJointActionBD {
XR_NONE_ACTION_BD = 0x00000000,
XR_TOUCH_GROUND_BD = 0x00000001,
XR_KEEP_STATIC_BD = 0x00000002,
XR_TOUCH_GROUND_TOE_BD = 0x00000004,
XR_FOOT_DOWN_ACTION_BD = 0x00000008,
} XrBodyJointActionBD;
XrBodyJointActionsBD
typedef struct XrBodyJointActionsBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
uint32_t jointCount;
XrBool32 isActive; //unused
XrBodyJointActionBD* jointActions;
} XrBodyJointActionsBD;
const static XrStructureType XR_TYPE_BODY_JOINT_ACTIONS_BD = 1000385006;
XrBodyJointGlobalLocationsBD
typedef struct XrBodyJointGlobalLocationsBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
uint32_t jointCount;
XrPosef* jointGlobalLocations;
} XrBodyJointGlobalLocationsBD;
const static XrStructureType XR_TYPE_BODY_JOINT_GLOBAL_LOCATIONS_BD = 1000385009;
XrBodyJointBD
typedef enum XrBodyJointBD {
XR_BODY_JOINT_PELVIS_BD = 0,
XR_BODY_JOINT_LEFT_HIP_BD = 1,
XR_BODY_JOINT_RIGHT_HIP_BD = 2,
XR_BODY_JOINT_SPINE1_BD = 3,
XR_BODY_JOINT_LEFT_KNEE_BD = 4,
XR_BODY_JOINT_RIGHT_KNEE_BD = 5,
XR_BODY_JOINT_SPINE2_BD = 6,
XR_BODY_JOINT_LEFT_ANKLE_BD = 7,
XR_BODY_JOINT_RIGHT_ANKLE_BD = 8,
XR_BODY_JOINT_SPINE3_BD = 9,
XR_BODY_JOINT_LEFT_FOOT_BD = 10,
XR_BODY_JOINT_RIGHT_FOOT_BD = 11,
XR_BODY_JOINT_NECK_BD = 12,
XR_BODY_JOINT_LEFT_COLLAR_BD = 13,
XR_BODY_JOINT_RIGHT_COLLAR_BD = 14,
XR_BODY_JOINT_HEAD_BD = 15,
XR_BODY_JOINT_LEFT_SHOULDER_BD = 16,
XR_BODY_JOINT_RIGHT_SHOULDER_BD = 17,
XR_BODY_JOINT_LEFT_ELBOW_BD = 18,
XR_BODY_JOINT_RIGHT_ELBOW_BD = 19,
XR_BODY_JOINT_LEFT_WRIST_BD = 20,
XR_BODY_JOINT_RIGHT_WRIST_BD = 21,
XR_BODY_JOINT_LEFT_HAND_BD = 22,
XR_BODY_JOINT_RIGHT_HAND_BD = 23,
XR_BODY_JOINT_COUNT_BD = 24,
XR_BODY_JOINT_MAX_ENUM_BD = 0x7FFFFFFF,
} XrBodyJointBD;
XrSystemBodyTrackingPropertiesBD
typedef struct XrSystemBodyTrackingPropertiesBD {
XrStructureType type;
void* XR_MAY_ALIAS next;
XrBool32 supportsBodyTracking;
} XrSystemBodyTrackingPropertiesBD;
const static XrStructureType XR_TYPE_SYSTEM_BODY_TRACKING_PROPERTIES_BD = 1000385004;
Include in next sequence chain for xrGetSystemProperties
.