English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

AndroidでOpenGLをベースにGLSurfaceView上で三角形を描画し、投影とカメラビューを使用する方法の例

この記事では、AndroidのOpenGLを基にGLSurfaceView上で三角形を描画し、投影とカメラビューの方法を使用する例を紹介します。以下に詳細を共有します。

三角形の定義

OpenGLは物体を三次元座標で定義することができます。三角形を描画する前に、その各点の座標を定義する必要があります。一般的には配列を使用して各頂点の座標を保存します。

OpenGL ESデフォルト[0,0,0](X,Y,Z)はGLSurfaceViewの中心に配置されています[1,1,0]右上角に配置されています,[-1,-1,0]左下角に配置されています。

三角形を描画する

三角形を描画する前に、OpenGLに頂点配列を使用していることを伝える必要があります。その後、描画関数を使用して三角形を描画します。

実験手順:

1. 新しいクラスTriangleを追加

以下はコードです:

public class Triangle {
  public Triangle()
  {
     float triangleCoords[] = {
          // X, Y, Z これは等边三角形です
          -0.5f, -0.25f, 0,
           0.5f, -0.25f, 0,
           0.0f, 0.559016994f, 0
        };
        // 三角形の頂点キャッシュを初期化
        ByteBuffer vbb = ByteBuffer.allocateDirect(
            // (座標値の数) * 4 bytes per float)
            triangleCoords.length * 4);
        vbb.order(ByteOrder.nativeOrder());// デバイスのハードウェアのオーダーを使用
        triangleVB = vbb.asFloatBuffer(); // ByteBufferから浮動小数点キャッシュを作成
        triangleVB.put(triangleCoords); // 浮動小数点キャッシュに頂点座標を追加
        triangleVB.position(0); // キャッシュを読み取る最初の座標
  }
  public void draw(GL10 gl)
  {
    gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f); //設定現在の色
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);//設定頂点
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);//三角形を描画する
  }
  private FloatBuffer triangleVB;
}

2. myGLRendererクラスにメンバーprivateTriangle mTriangleを追加し、コンストラクタで初期化します。

以下はコードです:

public myGLRenderer()
{
    mTriangle = new Triangle();
}

3. myGLRendererクラスのonSurfaceCreated()関数の最後にglEnableClientState()メソッドを追加して頂点配列を有効にします。

以下はコードです:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // TODO自動-生成方法存根
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}

4. myGLRendererクラスのonDrawFrame()関数の最後に三角形描画メソッドを追加します。

以下はコードです:

@Override
public void onDrawFrame(GL10 gl) {
    // TODO自動-生成方法存根
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    mTriangle.draw(gl);
}

これで、平面三角形の描画が完了しました。しかし、この三角形は定義したように等边三角形ではありません。これは、OpenGLが常にスクリーンが正方形であると仮定しているため、描画時に実際のスクリーンの長さと幅の比率によって最終的なグラフィックが伸びるためです。正しい表示を得るために、グラフィックを正しい位置に投影する必要があります。この機能は次のセクションで実現します。

Androidデバイスのスクリーンは通常正方形ではありませんが、OpenGLはデフォルトで正方形の座標系をこのデバイスに投影します。これにより、グラフィックが実際の比率で表示されません。この問題を解決するために、OpenGLの投影モードとカメラビューを使用して、グラフィックの座標を変換して異なるデバイスの表示に適応することができます。

実験手順:

1. myGLRendererクラスのonSurfaceCreated()関数を変更してGL10.GL_PROJECTIONモードで、スクリーンの長さと幅の比率を計算し、それを使用してオブジェクトの座標を変換します。

以下はコードです:

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    // TODO自動-生成方法存根
    gl.glViewport(0, 0, width, height);
    float ratio = (float) width / height;
    gl.glMatrixMode(GL10.GL_PROJECTION); // 現在の行列を投影行列に設定します
    gl.glLoadIdentity(); // 行列を初期値にリセットします
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 長さと幅の比率に基づいて投影行列を設定します
}

2. myGLRendererのonDrawFrame()メソッドを変更し、MODELVIEWモードを有効にし、GLU.gluLookAt()を使用して視点を設定します。

以下はコードです:

@Override
public void onDrawFrame(GL10 gl) {
  // TODO自動-生成方法存根
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    // 現在のマトリックスをモデルビュー模式に設定します
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();  // マトリックスをデフォルトの状態にリセットします
    // 視点の設定
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    mTriangle.draw(gl);
}

このようにして、描画する図形の比例は常に正確であり、デバイスの影響を受けて伸び曲がることはありません。

Androidに関する詳細な内容に興味を持つ読者は、以下の本サイトの特集を確認してください:《Android グラフィックスと画像処理の技術的まとめ》、《Android 開発入門と上級教程》、《Android デバッグの技術と一般的な問題解決方法のまとめ》、《Android メディア操作の技術的まとめ(オーディオ、ビデオ、録音など)》、《Android 基本コンポーネントの使い方のまとめ》、《Android ビュー View の技術的まとめ》、《Android レイアウト layout の技術的まとめ》および《Android コントロールの使い方のまとめ》

本稿の内容が皆様のAndroidプログラム設計に役立つことを願っています。

声明:本文の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーにより自発的に提供された内容であり、本サイトは所有権を持ちません。人工的な編集は行われていません。著作権に関する問題があれば、メールで notice#w までお知らせください。3codebox.com(メール送信時は、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れた場合、本サイトは即座に侵害を疑われる内容を削除します。)

おすすめ