ポリゴンの移動・回転・拡大縮小

ポリゴンの移動・回転・拡大縮小


こんにちは。本日は前回表示したポリゴンの移動や回転、拡大縮小をやってみようと思います。

まず必要な変数は以下のものになります。
private float posX, posY; // ポリゴンの位置情報
private float moveX, moveY; // 移動量

private float angle; // 回転角度
private float sclX, sclY; // 拡大縮小率

これらの変数を用意したらonSurfaceChanged()の中で初期化しましょう。
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
mScreenWidth = width;
mScreenHeight = height;

mVertexBuffer = makeFloatBuffer(vertex);
mColorBuffer = makeFloatBuffer(colors);

posX =
posY = 0.0f;
moveX =
moveY = 0.01f;

angle = 0.0f;

sclX =
sclY = 1.0f;
}
以上で変数の用意は完了です。

次はonDrawFrame()内に必要なメソッドを追加していきましょう。
まずは絶対必要なのが以下の2つです。

glPushMatrix();
glPopMatrix();

複数のオブジェクトを表示した際に相互に影響を与えないようにするためだと今は思っていて下さい。この2つのメソッドを描画開始前と描画終了後に入れます。

そして移動をするメソッドは
glTranslatef(float x, float y, float z);

回転するメソッドは
glRotatef(float angle, float x, float y, float z);

拡大縮小するメソッドは
glScalef(float x, float y, float z);

これらを使います。
現在は2Dで表示を行っていますので、glTranslatef()とglScalef()のzには0.0fを入れておきます。

この時に注意が必要なのはOpenGLの特徴として描画メソッドに近い方から設定されるという特性があります。
ですので順番としては 移動 -> 回転 -> 拡大縮小 ですので

glTranslatef();
glRotatef();
glScalef();

描画処理

となります。(興味がある方はglTranslatef()とglRotatef()の順番を入れ替えてみて下さい)

実際にソースコードを書くと以下のようになります。
@Override
public void onDrawFrame(GL10 gl) {

// Xプラス方向へ移動
posX += moveX;
if(posX > 1.0f){
posX = -1.0f;
}

// 回転
angle++;
if(angle > 360.0f){
angle = 0.0f;
}

// 画面をクリア
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

// ビューポートの設定
gl.glViewport(0, 0, mScreenWidth, mScreenHeight);
gl.glMatrixMode(GL10.GL_PROJECTION);

// マトリクス情報を初期化
gl.glLoadIdentity();

// 左上が(0.0f, 0.0f)
gl.glOrthof(0.0f, 1.0f, 1.0f, 0.0f, 1.0f, -1.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glPushMatrix();

// 頂点配列を有効にする
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

// 頂点配列を指定する
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);

// 頂点カラーを有効にする
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

// 頂点カラー配列を指定する
gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);

gl.glTranslatef(posX, posY, 0.0f);
gl.glRotatef(angle, 0, 0, 1);
gl.glScalef(sclX, sclY, 0.0f);

// 描画
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

// 有効にしたものを無効にする
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

gl.glPopMatrix();
}

以上でポリゴンの移動や回転拡大縮小が出来るはずです。
次回はポリゴンへテクスチャの貼付け方法を紹介しようと思います。


この記事はあなたの役に立ちましたか?他の人達にも役立ちそうでしたら、上のボタンより共有をお願いします。共有して頂けたら今後提供する記事の参考やモチベーションアップにつながります。

Categorized: Android