2015-09-18 2 views
2

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

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?

+0

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

ответ

2

Просмотрев мой код, кажется, что 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, я думаю, что это причина, почему вы видите их перевернутыми.

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

Смежные вопросы