В переполнении стека есть и другие сообщения о масштабировании, но я не нашел полезных для OpenGL, которые бы делали то, что я ищу.В настоящее время я использую функцию orthoM
для изменения положения камеры и масштабирования в OpenGL.Я заставил камеру перемещаться, и получил масштабирование пинча, чтобы работать, но масштабирование всегда масштабируется в центр системы координат представления поверхности OpenGL в 0,0
.Попробовав разные вещи, я еще не нашел способ, позволяющий камере перемещаться, а также позволяющий масштабировать изображение до точки касания пользователя (например, сенсорное управление в Clash of Clans похоже на то, что я пытаюсь сделать).сделать).
(Метод, который я сейчас использую для получения значения scale
, основан на этом сообщении .)
Моя первая попытка:
// mX and mY are the movement offsets based on the user's touch movements,
// and can be positive or negative
Matrix.orthoM(mProjectionMatrix, 0, ((-WIDTH/2f)+mX)*scale, ((WIDTH/2f)+mX)*scale,
((-HEIGHT/2f)+mY)*scale, ((HEIGHT/2f)+mY)*scale, 1f, 2f);
В приведенном выше коде я понимаю, что камера перемещается в направлении координаты 0,0
, поскольку по мере того, как scale
становится все меньше, значения краев камеры уменьшаются в направлении 0
.Таким образом, хотя зум идет в направлении центра системы координат, движение камеры движется с правильной скоростью на любом уровне масштаба.
Итак, я затем отредактировал код так:
Matrix.orthoM(mProjectionMatrix, 0, (-WIDTH/2f)*scale+mX, (WIDTH/2f)*scale+mX,
(-HEIGHT/2f)*scale+mY, (HEIGHT/2f)*scale+mY, 1f, 2f);
Отредактированный код теперь перемещает зум к центру экрана независимо от того, где в системе координат вида поверхности находится камера.есть (хотя это не полная цель), но движение камеры отключено, поскольку смещение не регулируется для разных уровней масштаба.
Я все еще работаю над поиском решения, ноесли у кого-нибудь есть какие-либо советы или идеи о том, как это можно реализовать, я был бы рад услышать.
Обратите внимание, я не думаю, что это имеет значение, но я делаю это в Android и используюJava.
РЕДАКТИРОВАТЬ:
С тех пор как я впервые опубликовал этот вопрос, я внес некоторые изменения в свой код.Я нашел этот пост , который объясняет логику того, как панорамировать камеру в правильное положение на основе масштаба, чтобы точка зума оставалась в том же положении.
Моя обновленная попытка:
// Only do the following if-block if two fingers are on the screen
if (zooming) {
// midPoint is a PointF object that stores the coordinate of the midpoint between
//two fingers
float scaleChange = scale - prevScale; // scale is the same as in my previous code
float offsetX = -(midPoint.x*scaleChange);
float offsetY = -(midPoint.y*scaleChange);
cameraPos.x += offsetX;
cameraPos.y += offsetY;
}
// cameraPos is a PointF object that stores the coordinate at the center of the screen,
// and replaces the previous values mX and mY
left = cameraPos.x-(WIDTH/2f)*scale;
right = cameraPos.x+(WIDTH/2f)*scale;
bottom = cameraPos.y-(HEIGHT/2f)*scale;
top = cameraPos.y+(HEIGHT/2f)*scale;
Matrix.orthoM(mProjectionMatrix, 0, left, right, bottom, top, 1f, 2f);
Код теперь работает немного лучше, но он все еще не совсем точен.Я проверил, как работает код, когда панорамирование отключено, а масштабирование работает лучше.Однако, когда панорамирование включено, масштабирование вообще не фокусируется на точке увеличения.