我试图使用方法扩展这一点:
看起来像:
@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);
我得到了不正确的缩放比例,因此它会缩放,但它不能正确地缩放点。
你能告诉我们可能是什么原因以及如何正确地扩展这一点?
答案 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平面。