Help us understand the problem. What is going on with this article?

OpenGL ES1.0でビューポート領域と画面サイズを合わせる方法

More than 5 years have passed since last update.

はじめに

OpenGL ESGLSurfaceView を使ってアンドロイドアプリを作成するとき、ビューポート領域と画面サイズを合わせるための方法を紹介します。

GLSurfaceView.Rendererの設定

GLSurfaceView.Rendererインターフェースを実装するクラス内で設定をします。
ビューポートの設定と座標系の設定は、 onSurfaceChangedメソッド内で行います。
onSurfaceChangedメソッドは、画面の縦向きと横向きが変更されるときに呼ばれるため、縦向きと横向きの両方に対応するアプリを作成することも可能です。
ここで、SCREEN_WIDTHSCREEN_HEIGHTは作成するアプリの解像度とします。

GLRenderer.java
public class GLRenderer implements GLSurfaceView.Renderer {

    //
    // その他のフィールド・メソッドなど
    //

    @Override
    public void onSurfaceChanged(GL10 gl10, int w, int h) {
        // ビューポートの設定
        double scaleX = (double)w / SCREEN_WIDTH;
        double scaleY = (double)h / SCREEN_HEIGHT;
        double scale = scaleX > scaleY ? scaleY : scaleX;
        int dpW = (int)(scale * SCREEN_WIDTH);
        int dpH = (int)(scale * SCREEN_HEIGHT);
        int offsetX = (w - dpW) / 2;
        int offsetY = (h - dpH) / 2;
        gl10.glViewport(offsetX, offsetY, dpW, dpH);

        // 投影変換行列の設定
        gl10.glMatrixMode(GL10.GL_PROJECTION);
        gl10.glLoadIdentity();
        // 幅、高さを設定
        // ビューポート領域内の座標系を左上(0, 0)、右下(SCREEN_WIDTH, SCREEN_HEIGH)に設定
        // 3Dを描画するときはZ方向の描画距離を変更する
        gl10.glOrthof(0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, -1.0f, 1.0f);

        // タッチスクリーンの領域設定
        // 今回は使用しない
        // TouchManager.setScreenArea(offsetX, h - dpH - offsetY, dpW, dpH);
    }
}

イメージ図

glOrthofメソッドで指定した領域 (SCREEN_WIDTH, SCREEN_HEIGHT) がビューポート内に描画されます。
ビューポートのY方向のオフセットは描画可能な領域の下部からの距離となります。
viewport.png

おわりに

描画と同様に、画面タッチの座標も変換しなければいけません。
次回は、タッチ座標の変換について記述したクラスを紹介します。

参考

http://tatoapps.wordpress.com/2013/08/17/SurfaceViewとCanvasで画面サイズに合わせて描画する方法-android/

saw_km
情報系の大学生してます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした