タイトルCocoaはやっぱり!出張版》8. OpenGLを使う(6)カテゴリーグラフィックス, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2002/2/19 14:2:34作成者新居雅行
■ アニメーション
クロスフェードさせるためには、OpenGLでアニメーションを表示させる必要があります。この場合は、単純にdisplayメソッドを繰り返し呼ぶだけで実現できます。例えば、以下のようになります。

//ソース:MyOpenGLView.m、メソッド:drawAnimation : 〜 setupTimer

- (void) drawAnimation : (NSTimer*) aTimer {
: アニメーションのための処理
[ self display ]; // 表示要求
}

NSTimer* animTimer; // アニメーションタイマー

- (void) setupTimer {
animTimer = [ NSTimer scheduledTimerWithTimeInterval : 0.03
target : self
selector : @selector( drawAnimation : )
userInfo : nil
repeats : YES ];
}

drawAnimation : メソッドで、アニメーションをワンステップ進める処理 ( 透明度を変えるなど ) を書いて、その後にdisplayメソッドを呼ぶようにしておきます。それをNSTimerを使って定期的に呼びます。setupTimerメソッドは、タイマーの初期化メソッドですので、initWithFrame : から呼ぶようにします。このサンプルでは、タイマーの間隔が0.03秒になっていますので、約1/30秒刻みで呼ばれますが、描画処理がさほど重くなければ、これくらい頻繁に呼び出しても問題なくなめらかに動いてくれます。

■ ビューのサイズが変わったとき
ビューのサイズが変化したときには、glViewport関数を使うことで、OpenGLに描画エリアが変化したことを伝えます。具体的には、以下のresizeView : メソッドに書いてあるように、ビューの位置を渡すだけです。

//メソッド:MyOpenGLView.m、メソッド:drawAnimation : 〜 setupTimer

- (void) resizeView : (NSRect) rect {

// 画面上の描画範囲を変更
glViewport( (GLint) rect.origin.x , (GLint) rect.origin.y,
(GLint) rect.size.width, (GLint) rect.size.height );

{ // 描画する座標の範囲を変更
float fRate = rect.size.width / rect.size.height;
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
if ( 1 <= fRate ) gluOrtho2D ( -fRate, fRate, -1, 1 );
else if ( 0 < fRate ) gluOrtho2D ( -1, 1, -1 / fRate, 1 / fRate );
}

}

ただし、ビュー内のOpenGLの座標系は、 ( -1.0, -1.0 ) 〜 ( +1.0, +1.0 ) のままですので、ビューが横に伸びた場合、表示されるイメージも横に伸びてしまいます。OpenGLの座標系を変えるには、gluOrto2D、glOrthoなどの関数を呼びます。このサンプルでは、短い方の辺の座標の範囲を -1.0 〜 +1.0 に固定して、長い方を比率で計算して求めています。

このメソッドをdrawRect : の先頭で呼んでおけばよいでしょう。以下が実行結果です。

◇リサイズ時の実行結果
 

■ おわりに
最近では、OpenGLは主要OSの大半に標準で搭載されていますが、他のOSでもOpenGLの扱いはCocoaと同様で、OpenGLの関数を直接呼ぶものが多いようです。そのため、Cocoa以外のOSのOpenGLのコードでもOpenGLの部分はそのまま流用できます。これは、サンプルコードは大量に入手できることを意味しますし、Cocoa上でOpenGLを勉強したとしても、OpenGLの知識は他のプラットホーム上でのそのまま通用することを意味します。

冒頭でも触れましたが、OpenGLが使われるケースというのは3Dソフトに限られなくなってきました。最近のPCにはほとんど3Dアクセラレーターが積まれるようになっていることも要因でしょう。従来では困難だったグラフィックの表現が比較的簡単にできますし、Cocoaからも簡単に使用できることも分かっていただけたと思います。他のソフトとの差別化にも、OpenGLは強力な味方になってくれるでしょう。

∽∽∽∽∽∽∽この項、以上∽∽∽∽∽∽∽[鶴薗賢吾]∽∽∽∽∽∽∽
関連リンクCocoaはやっぱり!