質問

ピクセルの配列にリップル効果を実装する必要があります。各ピクセルは、Argb色を表す32ビット整数です。誰もが開始する方法について何か提案をしていますか?

役に立ちましたか?

解決

一般に、リップル効果は、歪みの量が「波状」パターンのポイントごとに変化する画像のある種の歪みです。したがって、最初のタスクは、各ピクセルの数値を生成する「深度マッピング」を作成することです。直感的に深さマップは、元のピクセルの上の波及した水面の高さを表します。実験の出発点はそうかもしれません

#define X_CENTER 100   // x pixel position of center
#define Y_CENTER 100   // y pixel position of center
#define RADIUS 70      // approximate radius of circular wave train, in pixels
#define WAVELENGTH 10  // wavelength of ripples, in pixels
#define TRAINWIDTH 3.4 // approximate width of wave train, in wavelengths
#define SUPERPHASE 1.5 // phase vel. / group vel. (irrelevant for stills)

// returns a number from -1.0 to 1.0
double depth(int x, int y) {
  double dx = x - X_CENTER ; // or int, if the center coords are ints
  double dy = y - Y_CENTER ;
  double r = (sqrt(dx*dx+dy*dy)-RADIUS)/WAVELENGTH ;
  double k = r - (1-SUPERPHASE)*RADIUS/WAVELENGTH ;
  double a = 1 / (1.0 + (r/TRAINWIDTH)*(r/TRAINWIDTH));
  return a * sin(k*2*PI);
}

深さマップがある場合(必要なのが同じリップルを多くの異なる画像に適用することだけで事前に計算できます)、それをどうするかについてさまざまなオプションがあります。

  • その深さに比例して各ピクセルを明るくするか暗くする
  • 深さマップを数ピクセルの斜めにシフトし、に応じて明るくしたり暗くしたりします 違い シフトされたマップとシフトされていないマップの間。
  • 各ピクセルの深さとその(たとえば)東および南の隣人の違いに比例するベクトルによって、画像内の各ピクセルをわずかに動かします。特に、ベース画像に鮮明な軸並列エッジが含まれている場合、視覚的に心地よい結果を得るには、いくつかの平滑化またはオーバーサンプリングが必要になる場合があります。

これらの組み合わせとバリエーションの実験が必要になる場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top