Заранее прошу прощения за мой длинный пост.Как использовать экспериментальный API-интерфейс с проектом Tango Project
Моя цель - создать сетчатое приложение для проекта Tango Yellowstone для создания 3D-карты строительных интерьеров. Я намерен использовать экспериментальный API-интерфейс, добавленный в последних версиях кода танго-примеров-c.
Я использую точку помутнения-JNI-пример (Тьюринга) в качестве отправной точки и до сих пор сделано следующее:
Установить параметр config_experimental_enable_scene_reconstruction танго конфигурации в point_cloud_app.cc (см docs)
// Enable scene reconstruction ret = TangoConfig_setBool(tango_config_, config_experimental_enable_scene_reconstruction", true); if (ret != TANGO_SUCCESS) { LOGE("PointCloudApp: config_experimental_enable_scene_reconstruction() failed" "with error code: %d", ret); return ret; }
Добавлена extractMesh нативный метод в TangoJNINative.java
// Extracts the full mesh from the scene reconstruction. public static native float extractMesh();
Добавлено соответствие extractMesh функции к jni_interface.cc
JNIEXPORT void JNICALL Java_com_projecttango_experiments_nativepointcloud_TangoJNINative_extractMesh( JNIEnv*, jobject) { app.ExtractMesh(); }
- метод
Добавлено ExtractMesh в point_cloud_app.cc
void PointCloudApp::ExtractMesh() { // see line 1245 of tango_client_api.h mesh_ptr = new TangoMesh_Experimental(); TangoService_Experimental_extractMesh(mesh_ptr); mesh = *mesh_ptr; LOGE("PointCloudApp: num_vertices: %d", mesh.num_vertices); float float1, float2, float3; float1 = mesh.vertices[1][0]; float2 = mesh.vertices[1][1]; float3 = float1 + float2; // these lines show I can use the vertex data LOGE("PointCloudApp: First vertex, x: %f", mesh.vertices[1][0]); // this line causes app to crash; printing the vertex data seems to be the problem }
Добавлено TangoMesh_Experimental объявление в point_cloud_app.h
// see line 1131 of tango_client_api.h TangoMesh_Experimental* mesh_ptr; TangoMesh_Experimental mesh;
Добавлена дополнительная кнопка для вызова собственного метода extractMesh. (Не показывая этот, как это довольно просто)
Для справки, здесь TangoMesh_Experimental STRUCT из API:
// A mesh, described by vertices and face indices, with optional per-vertex
// normals and colors.
typedef struct TangoMesh_Experimental {
// Index into a three-dimensional fixed grid.
int32_t index[3];
// Array of vertices. Each vertex is an {x, y, z} coordinate triplet, in
// meters.
float (*vertices)[3];
// Array of faces. Each face is an index triplet into the vertices array.
uint32_t (*faces)[3];
// Array of per-vertex normals. Each normal is a normalized {x, y, z} vector.
float (*normals)[3];
// Array of per-vertex colors. Each color is a 4-tuple of 8-bit {R, G, B, A}
// values.
uint8_t (*colors)[4];
// Number of vertices, describing the size of the vertices array.
uint32_t num_vertices;
// Number of faces, describing the size of the faces array.
uint32_t num_faces;
// If true, each vertex will have an associated normal. In that case, the
// size of the normals array will be equal to num_vertices. Otherwise, the
// size of the normals array will be 0.
bool has_normals;
// If true, each vertex will have an associated color. In that case, the size
// of the colors array will be equal to num_vertices. Otherwise, the size of
// the colors array will be 0.
bool has_colors;
} TangoMesh_Experimental;
Мое текущее понимание этой структуры является:
Три указателя в
float (*vertices)[3];
указывают на адреса в начале трех комментариев ry для координат x, y и z для вершин для сетки (то же самое верно для цветов нормалей и цветов). Конкретная вершина состоит из компонентов x, y и z, найденных в определенном индексе в трех массивах.Аналогично, массив
uint32_t (*faces)[3]
имеет три указателя на начало трех фрагментов памяти, но вместо этого здесь имеет место набор из трех элементов, которые указывают номера из трех вершин (из массива вершин (каждый с тремя координатами)) составляют это лицо.
Текущее состояние я могу извлечь сетку, и напечатать некоторые из них на консоль, а затем выходит из строя без ошибок
PointCloudApp: PointCloudApp: num_vertices: 8044
Если я опускаю последнюю строку я добавил в point_cloud_app.cc (# 4, выше), приложение не сбой.Я могу получить доступ к данным вершин и сделать с ним что-то, но распечатать его с помощью LOGE приводит к сбою в 9 раз из 10. Иногда он корректно печатает значение без сбоев. Могут ли данные вершин иметь отверстия или недопустимые значения?
Я попытался вернуть test_float из JNI обратно в java, но он снова сработает, когда я попытаюсь это сделать.
Предложения?
_ «Предложения?» _ - Правильно инициализируйте аргументы, которые вы передаете функции - т. Е. ** не ** передайте ему значение нулевого указателя, оно не принимает его. Исправьте свой код, вместо того чтобы беспокоиться об изменении кода. –
Спасибо, @CaptainObvlious. Я получил его, добавив эту строку 'mesh_ = new TangoMesh_Experimental();' в point_cloud_app.cc перед вызовом 'TangoService_Experimental_extractMesh (mesh_)'. – Nate
Теперь застрял на извлечении данных вершин. – Nate