-1

私は Android OpenGL の初心者です。OpenGL を使用してボタンを描画しようとしています。GLSurface ビューにジェスチャー リスナーを追加しました。ユーザーが触れるたびにモーションイベントが発生します。私の質問は、motionevent.getx と motionevent.gety (ピクセル範囲内) をウィンドウまたはビューのオブジェクト座標に変換するにはどうすればよいですか?

4

1 に答える 1

0

誰かがそれを必要とする場合に備えて、この質問の投稿の解決策を見つけました。

   public float[] convertToObjectCoordinates(MotionEvent event) {
        float[] worldPos = new float[2];
        float[] invertedMatrix, transformMatrix,
                normalizedInPoint, outPoint, mProjMatrix, mVMatrix;
        invertedMatrix = new float[16];
        transformMatrix = new float[16];
        mProjMatrix = new float[16];
        mProjMatrix = mRenderer.getmProjMatrix();
        mVMatrix = new float[16];
        //Change the Proj and ModelView matrix according to your model and view matrix or you can use your mvpMatrix directly instead of transform Matrix                                     
        Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0, 0, 0f, 0.0f, 1.0f, 0.0f);
        normalizedInPoint = new float[4];
        outPoint = new float[4];
        float y = screenHeight - event.getY();
        setHeightAndWidth();
        normalizedInPoint[0] = (float) ((event.getX()) * 2.0f / screenWidth - 1.0);
        normalizedInPoint[1] = (float) ((y) * 2.0f / screenHeight - 1.0);
        normalizedInPoint[2] = - 1.0f;
        normalizedInPoint[3] = 1.0f;
        Matrix.multiplyMM( transformMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
        Matrix.invertM(invertedMatrix, 0, transformMatrix, 0);
        Matrix.multiplyMV(outPoint, 0, invertedMatrix, 0, normalizedInPoint, 0);
        if (outPoint[3] !=  0.0)
        {
            worldPos[0] = outPoint[0] / outPoint[3];
            worldPos[1] = outPoint[1] / outPoint[3];
        } else {
            Log.e("Error", "Normalised Zero Error");
        }
        return worldPos;
    }

これは、Android OpenGL2.0 向けの次の投稿からのリメイクです 。Android OpenGL ES 2.0 の画面座標を世界座標に調整 EROl の回答 EROl の返信に感謝します。

      public void setHeightAndWidth() {
         screenHeight = this.getHeight();
         screenWidth = this.getWidth();
      }

上記のメソッドは、正確なビューの高さと幅を提供するように、GLSurfaceView クラスに記述する必要があります。ビューが画面全体を占める場合は、ディスプレイ メトリックを使用して画面全体の幅と高さを取得することもできます。

于 2013-02-11T20:48:48.903 に答える