2015-10-06 6 views
0

Я пытаюсь создать приложение для Android с использованием OpenGL ES, но у меня возникли проблемы с обработкой сенсорного ввода.Преобразование координат объекта в координаты экрана, Android OpenGL ES

Я создал класс CubeGLRenderer, который порождает куб. CubeGLRenderer отвечает за матрицу проекции и просмотра, а Куб отвечает за модельную матрицу. Куб движется вдоль положительной оси X, без движения в Y, ни Z.

CubeGLRenderer обновляет матричном каждый кадр, чтобы двигаться вместе с кубом, делая куб смотреть стационарно на экране:

Matrix.setLookAtM(mViewMatrix, 0, 0.0f, cubePos.y, -10.0f, 0.0f, cubePos.y, 0.0f, 0.0f, 1.0f, 0.0f); 

Матрица проецирования вычисляется всякий раз, когда изменяется размер экрана (т.е. когда изменяется ориентация устройства). Затем две матрицы перебираются и передаются в Cube.draw(), где она применяет свою модельную матрицу и отображает экран.

До сих пор так хорошо. Давайте перейдем к проблеме.

Я хочу прикоснуться к экрану и вычислить угол от центра координат экрана куба до точки экрана, к которому я коснулся.

Я думал, что просто выполнил это с помощью GLU.gluProject(), но я либо не использую его правильно, либо просто не понял его вообще.

Вот код, я использую, чтобы вычислить координаты экрана от мира куба координаты:

public boolean onTouchEvent(MotionEvent e) { 
    Vec3 cubePos = cube.getPos(); 
    float[] modelMatrix = cube.getModelMatrix(); 
    float[] modelViewMatrix = new float[16]; 
    Matrix.multiplyMM(modelViewMatrix, 0, mViewMatrix, 0, modelMatrix, 0); 
    int[] view = {0, 0, width, height}; 
    float[] screenCoordinates = new float[3]; 
    GLU.gluProject(cubePos.x, cubePos.y, cubePos.z, modelViewMatrix, 0, mProjectionMatrix, 0, view, 0, screenCoordinates, 0); 


    switch (e.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      Log.d("CUBEAPP", "screenX: " + String.valueOf(screenCoordinates[0])); 
      break; 
    } 

    return true; 
} 

Что я делаю неправильно?

+0

Какой у вас выход? –

+0

Вы, кажется, не используете матрицу modelViewMatrix, но все еще modelMatrix, хотя вы ее вычисляете. –

+0

Извините, я никогда не использовал это, но если я правильно понял метод, вам нужно использовать modelViewMatrix для начала. Другие возможные проблемы - вы должны попытаться заменить порядок умножения на получение матрицы представления модели (порядок имеет значение при умножении матриц). Поскольку многие системы работают так, что происхождение находится внизу слева, вам может потребоваться использовать (0, высоту, ширину, -худож) для координат вида или инвертировать горизонтальную координату касания при использовании с полученными данными как (height-touch.y). –

ответ

0

Те же вычисления, которые вы выполняете в вершинном шейдере, который вы используете для визуализации куба, должны использоваться для перевода центра куба в пространство экрана.

Обычно вы умножаете каждую каждую вершину куба на матрицу modelViewProjection и затем отправляете ее в шейдер фрагмента. Вы должны использовать ту же самую матрицу, которую вы используете в вершинном шейдере, и умножить на нее центр куба. Однако умножение матрицы 4x4 на вершину Vec4 (x, y, z, 1) даст вам результат Vec4 (x2, y2, z2, w). Чтобы получить координаты экрана, вам нужно разделить x2 и y2 на w! После того, как вы разделите его на w, ваши координаты xy будут находиться в пределах диапазона [-1.1,1] x [-1.1].

Для получения точного пикселя вам потребуется нормализовать x2/w и y2/w в [0..1], а затем умножить его на ширину и высоту разрешения экрана.

Надеюсь, это поможет.

+0

Конечно! Большое спасибо! –

+0

Привет @AbuHassan вы решили это? ..... Я также пытаюсь получить расположение экрана, я использовал метод gluporoject, но результаты очень странные ... У меня есть следующие матрицы и вершины – pritam001

+0

float sRectVerts [] = { -0,5f, -0,5f, 0,0f, -0,5f, 0,5f, 0,0f, 0,5f, 0,5f, 0,0f, 0,5f, -0,5f, 0,0f}; float [] modelView = target.getViewMatrix(); float [] projection = target.getProjectionMatrix(); float [] modelViewprojectionarray = target.getModelViewProjectionMatrix(); – pritam001

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