OpenGL ES 2 ущипнуть, чтобы увеличить по центральной точке Android - PullRequest
0 голосов
/ 11 июня 2018

У меня проблемы с реализацией функции масштабирования в моем приложении.

В настоящее время масштабирование работает правильно, но я хочу переместить центр увеличения от центра поверхности к средней точке касания.

Вот части моего Renderer класса:

override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {

    this.width = width;
    this.height = height;
    GLES20.glViewport(0, 0, width, height)
    aspectRatioGlobal = width.toFloat() / height.toFloat()
    top = PORTRAIT_NEAR_LIMIT * Math.tan(60 * (Math.PI / 360.0)).toFloat()
    bottom = -top;
    left = bottom * aspectRatioGlobal
    right = top * aspectRatioGlobal
    Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, zNear, zFar)

    ....

override fun onDrawFrame(gl: GL10?) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
    Matrix.setIdentityM(intersectionUnprojectionMatrix, 0)
    Matrix.setLookAtM(intersectionUnprojectionMatrix, 0, 0f, 0f, cameraZ, 0f, 0f, 0f, 0f, 1.0f, 0.0f)
    if (!onImageLoaded) {
        resizeImageOnStart(rectangle?.getImageParameters(context)!!)
        displayImage()
        onImageLoaded = true
    } else {
        Matrix.setIdentityM(modelViewMatrix, 0)
        Matrix.setLookAtM(modelViewMatrix, 0, 0f, 0f, cameraZ, 0f, 0f, 0f, 0f, 1.0f, 0.0f)
        // Matrix.translateM(modelViewMatrix, 0, cameraX, cameraY, 0f)
        Matrix.scaleM(modelViewMatrix, 0, currentImageWidth, currentImageHeight, 1f)
        Matrix.scaleM(modelViewMatrix, 0, scaleFactor, scaleFactor, 1f)
        // Matrix.translateM(modelViewMatrix, 0, -cameraX, -cameraY, 0f)
        Matrix.multiplyMM(resultMatrix, 0, projectionMatrix, 0, modelViewMatrix, 0)
    }
    rectangle?.draw(resultMatrix, context)

    ....

fun onScale(detector: ScaleGestureDetector) {
    var center = getWorldCoordinatesByScreenCoordinates(detector.focusX, detector.focusY)
    cameraX = center.x
    cameraY = center.y
    this.scaleFactor = detector.scaleFactor

Текущая логика:

  • ScaleGestureDetector ловит событие и отправляет егодля Renderer
  • Renderer устанавливает scaleFactor и вычисляет мировые координаты сенсорного центра ( getWorldCoordinatesByScreenCoordinates работает правильно)
  • onDrawFrame отображает измененные данные.

Основная проблема в том, что я не могу понять, как правильно трансформировать объект.Я пытался перевести объект, масштабировать его и перевести обратно (строки перевода теперь прокомментированы), но это не работает.Пожалуйста, помогите!

...