我必须在像素数组上实现涟漪效应。每个像素都是代表 ARGB 颜色的 32 位整数。有人对如何开始有任何建议吗?
问问题
2456 次
1 回答
3
通常,涟漪效应是图像的某种失真,其中失真量以“波浪”图案逐点变化。所以第一个任务是创建一个“深度映射”,为每个像素生成一个数字。直观地说,深度图将表示原始像素上方波纹水面的高度。实验的起点可能是
#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);
}
当您拥有深度图时(如果您只想将相同的波纹应用于许多不同的图像,则可以预先计算),您有多种选择来处理它:
- 与深度成比例地使每个像素变亮或变暗
- 将深度图对角移动几个像素,并根据移位和未移位图之间的差异变亮或变暗。
- 将图像中的每个像素稍微移动一个向量,该向量与每个像素的深度与其(例如)东、南邻居的深度之间的差异成正比。为了获得视觉上令人愉悦的结果,可能需要进行一些平滑或过采样,尤其是当您的基础图像包含清晰的轴平行边缘时。
可能需要对这些组合和变化进行一些实验,以近似您对所需效果的心理图景。
于 2011-09-11T21:10:07.843 回答