Как ущипнуть зум в определенном месте в OpenGL ES 2? - PullRequest
0 голосов
/ 11 марта 2019

В переполнении стека есть и другие сообщения о масштабировании, но я не нашел полезных для 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);

Код теперь работает немного лучше, но он все еще не совсем точен.Я проверил, как работает код, когда панорамирование отключено, а масштабирование работает лучше.Однако, когда панорамирование включено, масштабирование вообще не фокусируется на точке увеличения.

...