使用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平面中