У меня есть 3x3 android .graphics.Matrix , и я хочу применить все преобразования к матрице OpenGL 4x4 только для 2D-преобразований. До сих пор мне удавалось применить вращение и масштабирование. Я использовал пример из команды android ЗДЕСЬ для рендеринга треугольника. Я использовал этот класс для генерации android .graphics.Matrix из жестов пальцев, сделанных пользователем для масштаба , перемещения и перевода преобразований.
После этого я присоединяю MatrixGestureDetector к onTouchEvent из представления. В классе MyGLSurfaceView:
class MyGLSurfaceView : GLSurfaceView {
...
private val matrixGestureDetector = MatrixGestureDetector()
override fun onTouchEvent(e: MotionEvent): Boolean {
matrixGestureDetector.onTouchEvent(e)
requestRender()
return true
}
}
Затем я использовал его для преобразования android .graphics.Matrix в матрицу OpenGL в методе onDrawFrame в MyGLRenderer класс
...
lateinit var matrixGestureDetector: MatrixGestureDetector
override fun onDrawFrame(unused: GL10) {
...
// get graphics matrix values
val m = FloatArray(9)
matrixGestureDetector.matrix.getValues(m)
// set rotation and scaling from graphics matrix to form new 4x4 OpenGL matrix
val openGLMatrix = floatArrayOf(
m[0], m[3], 0f, 0f,
m[1], m[4], 0f, 0f,
0f, 0f, 1f, 0f,
0f, 0f, 0f, 1f
)
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, openGLMatrix, 0)
// draw shape, where scaling and rotation work
mTriangle.draw(scratch)
}
Чтобы применить перевод, я должен добавить m [2] и m [5] из android .graphics .Matrix значений и измените openGLMatrix на:
val openGLMatrix = floatArrayOf(
m[0], m[3], 0f, 0f,
m[1], m[4], 0f, 0f,
0f, 0f, 1f, 0f,
m[2], m[5], 0f, 1f
)
Теперь проблема в том, что размер окна просмотра OpenGL формируется из координат в диапазоне [-1,1], посмотрите на изображение ниже:
Но перевод значений X и Y из android .graphics.Matrix не находится в этом диапазоне, для этого я изменил это:
val scaleX: Float = m[android.graphics.Matrix.MSCALE_X]
val skewY: Float = m[android.graphics.Matrix.MSKEW_Y]
val translateX = m[android.graphics.Matrix.MTRANS_X]
val translateY = m[android.graphics.Matrix.MTRANS_Y]
val ratio = width.toFloat() / height
val openGLMatrix = floatArrayOf(
m[0], m[3], 0f, 0f,
m[1], m[4], 0f, 0f,
0f, 0f, 1f, 0f,
-ratio * (translateX / width * 2), -(translateY / height * 2), 0f, 1f
)
Теперь перевод работает, но масштабирование и поворот не выполняются в точке поворота (центральная точка вращения между двумя пальцами). Как применить все преобразования и есть ли пример кода для двумерных преобразований для жестов пальцев, который я могу найти где угодно?