モーションを追加する

画面上にオブジェクトを描画するのは OpenGL の基本的な機能ですが、他の言語でも Android グラフィック フレームワーク クラス(CanvasDrawable オブジェクト。OpenGL ES が提供する追加機能では、 描画オブジェクトを 3 次元またはその他の独自の方法で移動、変換して、 魅力的なユーザー体験を提供します

このレッスンでは、OpenGL ES を使用するためのもう一歩として、モーションの追加方法を学びます。 回転する形状に変更できます。

図形を回転する

OpenGL ES 2.0 による描画オブジェクトの回転は比較的簡単です。レンダラで 変換行列(回転行列)を作成してから、射影と結合して カメラビュー変換行列:

Kotlin

private val rotationMatrix = FloatArray(16)

override fun onDrawFrame(gl: GL10) {
    val scratch = FloatArray(16)

    ...

    // Create a rotation transformation for the triangle
    val time = SystemClock.uptimeMillis() % 4000L
    val angle = 0.090f * time.toInt()
    Matrix.setRotateM(rotationMatrix, 0, angle, 0f, 0f, -1.0f)

    // Combine the rotation matrix with the projection and camera view
    // Note that the vPMatrix factor *must be first* in order
    // for the matrix multiplication product to be correct.
    Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0)

    // Draw triangle
    mTriangle.draw(scratch)
}

Java

private float[] rotationMatrix = new float[16];
@Override
public void onDrawFrame(GL10 gl) {
    float[] scratch = new float[16];

    ...

    // Create a rotation transformation for the triangle
    long time = SystemClock.uptimeMillis() % 4000L;
    float angle = 0.090f * ((int) time);
    Matrix.setRotateM(rotationMatrix, 0, angle, 0, 0, -1.0f);

    // Combine the rotation matrix with the projection and camera view
    // Note that the vPMatrix factor *must be first* in order
    // for the matrix multiplication product to be correct.
    Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0);

    // Draw triangle
    mTriangle.draw(scratch);
}

この変更を行っても三角形が回転しない場合は、 GLSurfaceView.RENDERMODE_WHEN_DIRTY 設定する必要があります。

連続レンダリングを有効にする

ここまで、このクラスのサンプル コードに注意深く従って作業を進めてきた場合、 ダーティ時のみ描画モードを設定する行をコメントアウトしてください。そうでない場合は OpenGL を使用します。 シェイプを 1 だけ回転し、GLSurfaceView コンテナから requestRender() が呼び出されるのを待ちます。

Kotlin

class MyGLSurfaceView(context: Context) : GLSurfaceView(context) {

    init {
        ...
        // Render the view only when there is a change in the drawing data.
        // To allow the triangle to rotate automatically, this line is commented out:
        // renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
    }
}

Java

public class MyGLSurfaceView(Context context) extends GLSurfaceView {
    ...
    // Render the view only when there is a change in the drawing data.
    // To allow the triangle to rotate automatically, this line is commented out:
    //setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

ユーザーの操作なしでオブジェクトを変更する場合を除き、通常は フラグがオンになっています。この呼び出しは、次のレッスンで説明しますので、このコードのコメント化を解除しておいてください。 もう一度クリックします。