Интеграция jPCT-AE и ARToolKit в Android

Я использую ARToolKit для Android для создания приложения дополненной реальности. Я могу без проблем применить матрицу проекции и матрицу преобразования маркеров в OpenGL, как объяснено в примере ARSimple. Однако я не нашел способа правильно применить их к камере jPCT-AE. Вот что я сделал для камеры:

Camera cam = world.getCamera();
Matrix projMatrix = new Matrix();
projMatrix.transformToGL();
projMatrix.setDump(ARToolKit.getInstance().getProjectionMatrix());

cam.setPosition(projMatrix.getTranslation());
cam.setBack(projMatrix);

и для объекта:

Matrix objMat = new Matrix();
objMat.transformToGL();
objMat.setDump(ARToolKit.getInstance().queryMarkerTransformation(markerID));
cube.setTranslationMatrix(objMat);
cube.setRotationMatrix(objMat);

Это почти работает: я могу видеть 3D-объект, если маркер находится в центре экрана. Однако, когда я перемещаю маркер, он быстро исчезает с экрана. Кроме того, куб (и другие модели, которые я пытался загрузить), кажется, отображается каким-то «перевернутым» способом. Для того, что я прочитал в Интернете, матрицы ARToolKit относятся к мировым координатам OpenGL (в то время как jPCT-AE имеет свои собственные координаты), а также что проекционная матрица jPCT-AE построена внутри на основе fov, ближней и дальней плоскости отсечения. , положение и вращение, и тогда я не могу установить его напрямую.

Как преобразовать матрицу проекции и матрицу маркеров в механизм jPCT-AE?


person Giuppe    schedule 18.09.2015    source источник
comment
Я сделал это с немного большей степенью успеха (объект немного смещен). Я проверю код, который у меня есть, в понедельник. Я комментирую здесь только для того, чтобы вы знали, что придет ответ (отказ от ответственности: с моей точки зрения, вы сделали это так же, как и я).   -  person shalafi    schedule 19.09.2015


Ответы (1)


Просматривая мой код, кажется, что JPCT-AE неправильно получает положение и обратный вектор из матрицы (хотя я не вижу причин, почему это не так), но он делает это, когда вы разделяете их на отдельные векторы. Это только мои выводы из проб и ошибок.

Вот как я сделал это для камеры, используя векторы направления и вверх.

float[] projection = ARToolKit.getInstance().getProjectionMatrix();
Matrix projMatrix = new Matrix();
projMatrix.setDump(projection);
projMatrix.transformToGL();
SimpleVector translation = projMatrix.getTranslation();
SimpleVector dir = projMatrix.getZAxis();
SimpleVector up = projMatrix.getYAxis();
mCamera.setPosition(translation);
mCamera.setOrientation(dir, up);

А затем для модели я извлекаю перемещение и вращение. Важно очистить перевод, так как это не абсолютная позиция, а модификация текущей позиции. Я думаю, это может быть вашей основной проблемой, почему объекты уходят за пределы экрана.

float[] transformation = ARToolKit.getInstance().queryMarkerTransformation(markerID);
Matrix dump = new Matrix();
dump.setDump(transformation);
dump.transformToGL();
mModel.clearTranslation();
mModel.translate(dump.getTranslation());
mModel.setRotationMatrix(dump);

Кроме того, вы должны сделать transformToGl после вызова setDump, я думаю, что это причина, по которой вы видите их инвертированными.

Наконец, вы должны повторно использовать матрицу между выполнениями вместо создания нового объекта в каждом кадре для оптимизации.

person shalafi    schedule 21.09.2015