Проект Android Studio Native C++ для Meta Quest 3 с использованием Oculus Mobile SDK получает данные акселерометра со всC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проект Android Studio Native C++ для Meta Quest 3 с использованием Oculus Mobile SDK получает данные акселерометра со вс

Сообщение Anonymous »

Я пытаюсь использовать проект 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»