使用Android和OpenGL ES 2.0进行点缩放(捏合缩放)的比例调整

3

我正在尝试使用以下方法围绕点进行缩放:

  • 将图像移动到想要缩放的点(捏合缩放)
  • 进行缩放
  • 将图像移回原位

具体实现如下:

@Override
public boolean onScale(ScaleGestureDetector detector) {

    float scaleFactor = detector.getScaleFactor();

    float focusX = detector.getFocusX();
    float focusY = detector.getFocusY();

    Matrix.translateM(modelMatrix, 0, -focusX, -focusY, 0);
    Matrix.scaleM(modelMatrix, 0, scaleFactor, scaleFactor, 0);
    Matrix.translateM(modelMatrix, 0, focusX, focusY, 0);

但是当我创建结果MVP矩阵时,像这样:

Matrix.multiplyMM(MVPmatrix, 0,
    projectionMatrix, 0,
    modelMatrix, 0);

我得到了错误的缩放,它会进行缩放但不能正确地围绕点进行缩放。

请问可能的原因是什么,如何才能正确地围绕该点进行缩放?

1个回答

4
据我所知,Android Matrix 实用类中的方法是从右侧乘入新指定的变换。尽管文档中没有说明,但源代码 (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/opengl/Matrix.java) 明确表明它是这样工作的。
这意味着,当您将一系列子变换的变换矩阵组合在一起时,您调用的最后一个方法指定了应先应用于您的点的子变换。换句话说,您以与应用到您的点的顺序相反的顺序指定矩阵。
对于围绕点 (focusX, focusY) 旋转,您首先需要将平移 (-focusX, -focusY, 0.0f) 应用于您的点,然后是旋转,最后是平移 (focusX, focusY, 0.0f)。由于调用顺序与此相反,因此应该是:
Matrix.translateM(modelMatrix, 0, focusX, focusY, 0.0f);
Matrix.scaleM(modelMatrix, 0, scaleFactor, scaleFactor, scaleFactor);
Matrix.translateM(modelMatrix, 0, -focusX, -focusY, 0.0f);

我在这里也改变了scaleM()的最后一个参数。因为您在z方向的比例因子中使用了0,所以您会将整个几何图形压扁到x-y平面上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接