Я пытаюсь реализовать игру типа «бей-моль» с использованием 3D (OpenGL ES) в Android. На данный момент у меня есть ОДНА трехмерная фигура (вращающийся куб) на экране в любой момент времени, которая представляет мою "моль". В моем представлении есть обработчик событий касания, который случайным образом устанавливает некоторые значения x, y в моем рендерере, заставляя куб перемещаться (используя glTranslatef ()).
Мне еще не приходилось сталкиваться с любым учебником или документацией, которые бы полностью связывали события касания экрана с 3D-сценой. Я проделал большую работу, чтобы добраться туда, где я нахожусь, но я не могу понять это до конца.
С developer.andrdoid.com Я использую то, что, как мне кажется, можно считать вспомогательными классами для Матриц: MatrixGrabber.java , MatrixStack.java и MatrixTrackingGL.java .
Я использую эти классы в своем методе GLU.glUnProject , который должен выполнять преобразование из реальных экранных координат в трехмерные или объектные координаты.
Отрывок:
MatrixGrabber mg = new MatrixGrabber();
int viewport[] = {0, 0, renderer._width, renderer._height};
mg.getCurrentModelView(renderer.myg);
mg.getCurrentProjection(renderer.myg);
float nearCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float farCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float x = event.getX();
float y = event.getY();
GLU.gluUnProject(x, y, -1.0f, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, nearCoords, 0)
GLU.gluUnProject(x, y, 1.0f, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, farCoords, 0)
Этот фрагмент выполняется без ошибок, но вывод не выглядит правильным. Я знаю, что экран имеет происхождение (0,0) в левом нижнем углу. И 3D-сцена, по крайней мере, моя, кажется, имеет происхождение прямо в середине экрана, как классическая декартова система. Поэтому запустите мой код, где координаты экрана (0, 718) касаются нижнего левого угла. Мои выводы из последних параметров в gluUnProject:
Рядом: {-2.544, 2.927, 2.839, 1.99}
Дальний: {0,083, 0,802, -0,760, 0,009}
Эти цифры не имеют никакого смысла для меня. Мое прикосновение даже было в 3-м квадранте, поэтому все мои значения x, y для ближнего и дальнего должны быть отрицательными, но это не так. В документации по gluUnProject не упоминается необходимость преобразования экранных координат. Опять же, та же самая документация заставит вас поверить, что Ближние и Дальние должны были быть массивами размера 3, но они должны быть размером 4, и у меня НЕТ КЛЕЯ, почему.
Итак, у меня есть два вопроса (я уверен, что больше подойдет).
- Как я могу убедиться, что получаю правильные ближние и дальние расстояния?
координаты на основе координат экрана.
- Как только у меня есть ближняя и дальняя координаты, как мне использовать это, чтобы найти, пересекает ли создаваемая ими линия объект на экране.