GLSurfaceview でピンチ ツー ズームを実装しようとしていますが、機能しません。写真の中心にズームインする方法を知っています。これは簡単です (私が投稿しているサンプルは、既にイメージの中心にピンチしてズームします)。しかし、指の座標を考慮する方法がわかりません。
プロジェクト自体はギャラリー アプリなので、手の込んだ 3D 回転は必要ありません。ピンチ ツー ズーム ジェスチャに基づいて画像の一部を拡大する方法を見つける必要があります。おそらく、これは 3 ~ 5 行のコードの問題である可能性がありますが、これを行う正しい方法を見つけることができませんでした。
つまり、シーン マトリックスは、ズームのために Z 軸に変換されるだけでなく、特定の deltaX および deltaY 量によって変換 (移動) され、拡大しているポイントをその場所に保持します。
私のシーンは次のように設定されています。
(レンダリング モードは RENDERMODE_WHEN_DIRTY に設定されています)
// Screen size (in screen pixels.
private int mViewportWidth;
private int mViewportHeight;
// Rectangle for render area.
private RectF mViewRect = new RectF();
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
mViewportWidth = width;
mViewportHeight = height;
float ratio = (float) width / height;
mViewRect.top = 1.0f;
mViewRect.bottom = -1.0f;
mViewRect.left = -ratio;
mViewRect.right = ratio;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 20f, (float) width / height, .1f, 100f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
ピンチツーズームを実装する描画領域:
@Override
public synchronized void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
//Pinch-To-Zoom transformation should be implemented here
//code below doesn't work
gl.glTranslatef(-delta.x,-delta.y, -currentScale);
//the drawing is done here
//...
}
同じレンダー クラスのメソッドで、ピンチ ジェスチャとスケールの中間点を取得します。
private float currentScale = 6f;
/**
*
* @param scaleAbsolute - scale value from ScaleGestureListener
* @param focusX - X coordinate of pinch-to-zoom gesture in screen coordinates
* @param focusY - Y coordinate of pinch-to-zoom gesture in screen coordinates
*/
public void zoom(float scaleAbsolute, float focusX, float focusY) {
//the initial value of currentScale is 6f and by zooming in, we are decresing this value
//currentScale is used as the Z value (so lower number = bigger zoom)
currentScale = currentScale / scaleAbsolute;
//Keep track of deltaX/deltaY here? How?
}
グローバル deltaX および deltaY 値を追加する必要があると思いますが、現在のズーム レベルに基づいて X、Y シフトを計算する方法がわかりません。
画面座標をシーン座標に変換するヘルパー関数を次に示します。
/**
* Translates screen coordinates into view coordinates.
*/
public void translate(PointF pt) {
pt.x = mViewRect.left + (mViewRect.width() * pt.x / mViewportWidth);
pt.y = mViewRect.top - (-mViewRect.height() * pt.y / mViewportHeight);
}