Я работаю над OpenGL ES 2.0 для приложения с дополненной реальностью для Android. Моя цель - показать виртуальный объект (на данный момент, прямоугольник) в заданной позиции, чтобы создать впечатление, что он имеет реальное местоположение в мире. Пока что я могу отобразить синий прямоугольник, где я хочу (например, в точке (0; 0,5; -1) в метрах).
Когда я поворачиваю голову, прямоугольник движется в противоположном направлении, что является ожидаемым поведением. Тем не менее, это не «достаточно быстро»: я все еще могу видеть половину этого, когда я вообще не должен видеть это, потому что я смотрю в другом направлении.
Моей первой мыслью было, что проблема была связана со слишком большим полем зрения, когда я создавал матрицу проекции. Как показано ниже, я использую перспективную проекцию:
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, (float)width, (float)height);
Matrix.setIdentityM(mProjectionMatrix, 0);
Matrix.perspectiveM(mProjectionMatrix, 0, mFOV_Y, DisplayConst.SCREEN_RATIO, mZNear, DisplayConst.GLASSES_FAR_PLANE);
// mFOV_Y: 12.0f (degrees); screenRatio: 1.8f; nearPlane: 0.01f; farPlane: 100.0f (meters);
}
Тем не менее, даже при теоретическом FOV_Y гарнитуры AR, которую я использую, проблема все еще остается. Мне нужно дать действительно низкое значение (+ -3 °), чтобы приблизить что-то правильное, что меня беспокоит, потому что я думаю, что оно не соответствует реальному значению.
Для камеры OpenGL я обновляю на каждом шаге рисования параметры eyePos и LookAt в соответствии с положением гарнитуры AR, и эта часть работает, как и ожидалось.
Я что-то упустил в матрице вида или проекции, которая могла бы вызвать такой эффект?