使用Android和OpenGL ES 2.0围绕点缩放(收缩缩放)

使用Android和OpenGL ES 2.0围绕点缩放(收缩缩放),android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我尝试使用以下方法围绕点进行缩放: 平移到要缩放的点(收缩缩放) 鳞片 翻译回 它看起来像: @Override public boolean onScale(ScaleGestureDetector detector) { float scaleFactor = detector.getScaleFactor(); float focusX = detector.getFocusX(); float focusY = detector.getFocusY();

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

  • 平移到要缩放的点(收缩缩放)
  • 鳞片
  • 翻译回
它看起来像:

@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);
我得到了不正确的缩放,因此它可以缩放,但不能围绕点正确缩放


您能告诉我原因是什么,以及如何正确地围绕该点进行缩放吗

据我所知,Android
Matrix
实用程序类中的方法从右侧乘以新指定的转换。我没有在文档中看到它的具体说明,但是源代码()明确地表明它是这样工作的

这意味着,当您组合子变换序列中的变换矩阵时,您调用的last方法指定应用于点first的子变换。换句话说,指定矩阵的顺序与应用于点的顺序相反

对于围绕点的旋转
(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平面中