« Android Market で有料アプリが1ヶ月でどれくらい売れたか | メイン | 球の描画2 »
2011年06月12日
3D プログラミング:: 球の描画1
Tweet @jin1016をフォロー球の描画は、主に2パターンの方法があると思う。
1. 地球儀のような、緯度と経度で割って描画する方法。
2. 正二十面体を、さらに割って描画する方法。
1 の方法は赤道付近でポリゴンが荒く、北極・南極に近づくと細かくなっていき効率が悪い。
ただ、プログラムで球を描くケースはゲーム画面内ではほとんどない。
単にデバッグ時に当たり描画用に出す程度ではないかと思う。
とりあえず、今回は地球儀のような方法で描画してみる。
以下ソースはJava ( JOGL 2.0 ) 。
まずトライアングルストリップで描ける中間部分を描画し、後で上下端をトライアングルファンで描画している。
三角関数がわかればそれほど難しくないと思う。
加法定理を使っているのは、何度も sin/cos を計算するコストを減らすため。
上下端を別に分けているが、頂点のリストを作って後で描画するのなら、まとめてやってしまった方が加法定理の計算部分うかせられる。
そもそも毎回計算して描かなくても、頂点のリストを1度作って、マトリックスで拡大縮小すれば済む話でもあるんだけど。
public void draw( Sphere shape, GL2 gl ) { final int div_h = 40; // 水平方向分割数 // 中間の帯の部分はトライアングルストリップで描ける // 加法定理によって、垂直方向のsin/cos値を更新する float rd = radius * accu_v_s; // 1個後の半径 float accu_s = sinTheta; // 水平方向sin // 加法定理によって、水平方向のsin/cos値を更新する // 上半球の描画 // 加法定理によって、水平方向のsin/cos値を更新する // 下半球の描画 // 加法定理によって、水平方向のsin/cos値を更新する ( 逆回転 ) |
で、上記ソースをコンパイルしてアプレットにしたものをここに置く。
分割数が多いのでそれなりに綺麗。
投稿者 Takenori : 2011年06月12日 01:49
comments powered by Disqus