以下使用numpy可能會讓您開始。它應該足夠快,儘管你可以在Python中獲得更快的速度(請看這裏看看http://www.scipy.org/PerformancePython)。
順便說有幾個缺點中描述的方法:
- 你無法控制的漣漪的速度 - 這樣做,你將不得不修改紋波函數中使用的等式(如果你的身影然後你就完成了)
- 「池」的「深度」是固定的(可能太淺)。我添加了一個深度參數來放大效果
- 該文章讀取整數像素偏移量 - 你會得到一個更好的結果與插值(我想你可以用opengl做到這一點,但我在該領域的知識爲零)
代碼:
import numpy
def ripple(w1, w2, damp, n = 1):
for _ in xrange(n):
w2 *= -2
w2[1:-1,1:-1] += w1[0:-2, 1: -1]
w2[1:-1,1:-1] += w1[2: , 1: -1]
w2[1:-1,1:-1] += w1[1:-1, 0: -2]
w2[1:-1,1:-1] += w1[1:-1, 2: ]
w2 *= .5 * (1. - 1./damp)
w1, w2 = w2, w1
def refract(x, y, w, rindex, depth = 10):
sx = x[0,1] - x[0,0]
sy = y[1,0] - y[0,0]
dw_dx = (w[2: ,1:-1] - w[:-2,1:-1])/sx * .5
dw_dy = (w[1:-1,2: ] - w[1:-1,:-2])/sy * .5
xang = numpy.arctan(dw_dx)
xrefract = numpy.arcsin(sin(xang)/rindex)
dx = numpy.tan(xrefract) * dw_dx * depth
yang = numpy.arctan(dw_dy)
yrefract = numpy.arcsin(sin(yang)/rindex)
dy = numpy.tan(yrefract) * dw_dy * depth
dx *= numpy.sign(dw_dx)
dy *= numpy.sign(dw_dy)
xmin = x[0,0]
xmax = x[0,-1]
x[1:-1,1:-1] += dx
x[:,:] = numpy.where(x < xmin, xmin, x)
x[:,:] = numpy.where(x > xmax, xmax, x)
ymin = y[0,0]
ymax = y[-1,0]
y[1:-1,1:-1] += dy
y[:,:] = numpy.where(y < ymin, ymin, y)
y[:,:] = numpy.where(y > ymax, ymax, y)
x和y應該從numpy.meshgrid呼叫格:這裏是一個示例用法:
x,y = meshgrid(x,y)
w = 10 * exp(- (x*x + y*y))
w1 = w.copy()
x1,y1 = meshgrid(r_[0:len(x):1.0], r_[0:len(y):1.0])
ripple(w, w1, 16) # w1 will be modified
refract(x1, y1, w1, rindex=2, depth=10) # x1 and y1 will be modified
numpy.around(x1, out=x1) # but you will get better results with interpolate
numpy.around(y1, out=y1) #
這是你想要的它像工作? http://flash-effects.com/tutorial-create-a-water-ripple-mouse-follow/ – misha
正是 - 如果這是可以實現的,當然我可以繼續在調整 – leon
可能也想嘗試gamedev.stackexchange。 com,在那裏可能會有更好的運氣。 – Davy8