おーばーどらいヴ

前に実装しようとして、時間の都合で挫折した波紋表現を模索中。。。やっぱジリ貧で費用対効果を鑑みると切り捨てた方がいいのかもしれん。

なんか最近検索すると波紋資料が見つからんので、うろ覚えを捻りだしましょう。マトリックス上に振幅をプロットしていくと考え、振幅をP(x,y)とする。ここで、1フレーム後のマトリックスをP'(x,y)とすると、

P'(x,y) = (P(x,y)*2 + P(x-1,y) + P(x,y-1) + P(x+1,y) + P(x,y+1) ) / 6;

こんな式だった…気がする。要は、1手前の状態の周囲1ピクセルの平均をとってるだけですね。うろ覚えだからホントに動くかは知らん。つうか、毎フレームこんなビデオメモリ転送なんかしたくないので却下。1年前だったか、自分のマシンで普通に動いてはいたけどね。マトリクスをテクスチャとして保持しておいて、ピクセルシェーダか何かの処理に流し込むといい感じにできるかもね。…そろそろ、2Dのゲームにピクセルシェーダをサポートするビデオカード要求してもOKか?それとも、ピクセルシェーダまで使わなくてもいけるの?わっかんねぇな。

まあ、波紋なんて波面な訳ですから、中心座標からの距離で位相が決まるサインウェーブでいい気がします。1波長分のテクスチャを予め作っておいて、それを拡縮して重ね合わせればいいんじゃないの?つう結論に。で、

for( int y=0; y<HEIGHT; y++)
{
  int tmp_y = y - HEIGHT/2; // 中心からのy距離

  for( int x=0; x<WIDTH; x++)
  {
    int tmp_x = x - WIDTH/2; // 中心からのx距離

    double phase = (2 * PI) * (sqrt(tmp_x*tmp_x + tmp_y*tmp_y) / 20); // 位相:20ドットで1波長進む感じに
    int val = 0xff/2 + (int)( (0xff/2) * sin( phase ) );  // 振幅(255階調)

    P[x][y] = val;
  }
}

書いてみました。が、なんかクッキリドーナツみたいな画像になっちゃうんだよなー。20ピクセル幅ちう狭さでサインウェーブ描かせるから、キレイにグラデにならないのかもしれんなぁ。。。←今ココ


なんか助言とかあったらいってみるといいよ←えらそう