Я использую последнюю функцию VrApi.h из Oculus Mobile SDK:
Код: Выделить всё
const double predictedDisplayTime = vrapi_GetPredictedDisplayTime(mobile, 0);
const ovrTracking2 tracking = vrapi_GetPredictedTracking2(mobile, predictedDisplayTime);
float accX = tracking.HeadPose.LinearAcceleration.x;
float accY = tracking.HeadPose.LinearAcceleration.y;
float accZ = tracking.HeadPose.LinearAcceleration.z;
Код: Выделить всё
#include
#include
#include
#include // for usleep
#include "include/VrApi.h"
#include "include/VrApi_Helpers.h"
#include
#include
#include
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_oculusdemo_MainActivity_stringFromJNI(JNIEnv *env, jobject obj) {
ovrJava java;
java.Vm = nullptr;
java.Env = env;
java.ActivityObject = obj;
env->GetJavaVM(&java.Vm);
jclass clazz = env->GetObjectClass(obj);
jmethodID getSurfaceMethod = env->GetMethodID(clazz, "getSurface", "()Landroid/view/Surface;");
jobject surface = env->CallObjectMethod(obj, getSurfaceMethod);
ANativeWindow *window = ANativeWindow_fromSurface(env, surface);
if (!window) {
__android_log_print(ANDROID_LOG_ERROR, "NativeWindow", "Failed to get ANativeWindow");
return env->NewStringUTF("Failed to get ANativeWindow");
}
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, NULL, NULL);
EGLConfig config;
EGLint numConfigs;
EGLint configAttribs[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE };
eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
ovrInitParms initParms = vrapi_DefaultInitParms(&java);
if (vrapi_Initialize(&initParms) != VRAPI_INITIALIZE_SUCCESS) {
__android_log_print(ANDROID_LOG_ERROR, "VrApi", "Failed to initialize VrApi");
ANativeWindow_release(window);
eglDestroyContext(display, context);
eglTerminate(display);
return env->NewStringUTF("Failed to initialize VrApi");
} else {
__android_log_print(ANDROID_LOG_INFO, "VrApiSuccess", "VrApi initialized successfully");
}
ovrModeParms modeParms = vrapi_DefaultModeParms(&java);
modeParms.Display = reinterpret_cast(display);
modeParms.WindowSurface = reinterpret_cast(window);
modeParms.ShareContext = reinterpret_cast(context);
ovrMobile* mobile = vrapi_EnterVrMode(&modeParms);
if (!mobile) {
__android_log_print(ANDROID_LOG_ERROR, "VRMode", "Failed to enter VR mode");
vrapi_Shutdown();
ANativeWindow_release(window);
eglDestroyContext(display, context);
eglTerminate(display);
return env->NewStringUTF("Failed to enter VR mode");
} else {
__android_log_print(ANDROID_LOG_INFO, "VRModeSuccess", "Successfully entered VR mode");
}
for (int i = 0; i < 1000; ++i) {
const double predictedDisplayTime = vrapi_GetPredictedDisplayTime(mobile, 0);
const ovrTracking2 tracking = vrapi_GetPredictedTracking2(mobile, predictedDisplayTime);
// 检查tracking status
if (tracking.Status & VRAPI_TRACKING_STATUS_POSITION_VALID) {
float accX = tracking.HeadPose.LinearAcceleration.x;
float accY = tracking.HeadPose.LinearAcceleration.y;
float accZ = tracking.HeadPose.LinearAcceleration.z;
char info[256];
snprintf(info, sizeof(info), "Accelerometer Data - X: %f, Y: %f, Z: %f", accX, accY, accZ);
__android_log_print(ANDROID_LOG_INFO, "AccelerometerInfo", "%s", info);
} else {
__android_log_print(ANDROID_LOG_WARN, "TrackingStatus", "Tracking status invalid: %d", tracking.Status);
}
usleep(33333);
}
vrapi_LeaveVrMode(mobile);
vrapi_Shutdown();
ANativeWindow_release(window);
eglDestroyContext(display, context);
eglTerminate(display);
return env->NewStringUTF("Data collection finished.");
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... dk-get-the