Я пытаюсь создать приложение для 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;
}
Что я делаю неправильно?
Какой у вас выход? –
Вы, кажется, не используете матрицу modelViewMatrix, но все еще modelMatrix, хотя вы ее вычисляете. –
Извините, я никогда не использовал это, но если я правильно понял метод, вам нужно использовать modelViewMatrix для начала. Другие возможные проблемы - вы должны попытаться заменить порядок умножения на получение матрицы представления модели (порядок имеет значение при умножении матриц). Поскольку многие системы работают так, что происхождение находится внизу слева, вам может потребоваться использовать (0, высоту, ширину, -худож) для координат вида или инвертировать горизонтальную координату касания при использовании с полученными данными как (height-touch.y). –