Anonymous
Проект Android Studio Native C++ для Meta Quest 3 с использованием Oculus Mobile SDK получает данные акселерометра со вс
Сообщение
Anonymous » 14 май 2024, 07:18
Я пытаюсь использовать проект Native C++ для Android Studio для создания приложения в Meta Quest 3 для сбора данных x, y, z акселерометра гарнитуры, однако мой код работает правильно, но в logcat значения x, y и z акселерометра Данные z всегда равны нулю, независимо от того, как я перемещаю гарнитуру в Meta quest 3.
Я использую последнюю функцию 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;
Я также пытаюсь получить скорость и ориентацию, однако оба значения тоже равны 0. Ниже приведен мой код на C++.
Код: Выделить всё
#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.");
}
Я ожидаю, что данные акселерометра будут не равны 0 и будут отражать истинное значение, когда я запускаю это приложение. Добавляя отладчик в свой код, я обнаружил, что track.status недействителен и возвращает 0. Я думаю, именно поэтому он не возвращает истинное значение. Я ищу способы сделать его действительным.
Подробнее здесь:
https://stackoverflow.com/questions/784 ... dk-get-the
1715660300
Anonymous
Я пытаюсь использовать проект Native C++ для Android Studio для создания приложения в Meta Quest 3 для сбора данных x, y, z акселерометра гарнитуры, однако мой код работает правильно, но в logcat значения x, y и z акселерометра Данные z всегда равны нулю, независимо от того, как я перемещаю гарнитуру в Meta quest 3. Я использую последнюю функцию VrApi.h из Oculus Mobile SDK: [code] 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; [/code] Я также пытаюсь получить скорость и ориентацию, однако оба значения тоже равны 0. Ниже приведен мой код на C++. [code]#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."); } [/code] Я ожидаю, что данные акселерометра будут не равны 0 и будут отражать истинное значение, когда я запускаю это приложение. Добавляя отладчик в свой код, я обнаружил, что track.status недействителен и возвращает 0. Я думаю, именно поэтому он не возвращает истинное значение. Я ищу способы сделать его действительным. Подробнее здесь: [url]https://stackoverflow.com/questions/78475155/android-studio-native-c-proj-for-meta-quest-3-using-oculus-mobile-sdk-get-the[/url]