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

时间:2014-07-01 19:23:17

标签: 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();

    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 个答案:

答案 0 :(得分:3)

据我所知,Android Matrix实用程序类中的方法将右侧新指定的转换相乘。我没有在文档中看到它,但源代码(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/opengl/Matrix.java)清楚地表明它以这种方式工作。

这意味着当您组合来自子变换序列的变换矩阵时,您调用的 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平面。