Заранее извиняюсь за свой длинный пост.
Моя цель — создать приложение для создания сетки для устройства Project Tango Yellowstone для создания 3D-карты интерьеров зданий. Я намерен использовать экспериментальный API создания сетки, добавленный в последние версии кода tango-examples-c.
Я использую point-cloud-jni-example (turing) в качестве отправной точки и до сих пор делал следующее:
Установите параметр конфигурации танго config_experimental_enable_scene_reconstruction в point_cloud_app.cc (см. документы)
// 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 из 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];
указывают на адреса в начале трех блоков памяти для координат 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, но он снова вылетает, когда я пытаюсь это сделать.
Предложения?
mesh_ = new TangoMesh_Experimental();
в point_cloud_app.cc перед вызовомTangoService_Experimental_extractMesh(mesh_)
. - person Nate   schedule 14.08.2015