以下使用numpy可能会让您入门。它应该足够快,尽管即使在python中也可以更快(尽管在这里可以看到http://www.scipy.org/PerformancePython的用法 )。
顺便说一下,所描述的方法有几个缺点:
- 您无法控制脉动的速度-为此,您必须修改脉动函数中使用的方程式(如果您弄清楚了它与波动方程式的关系,则http://en.wikipedia.org/wiki/Wave_equation你完成了)
- “池”的“深度”是固定的(可能太浅了)。我添加了一个depth参数来放大效果
- 本文读取整数像素偏移量-使用插值可得到更好的结果(我想您可以使用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) #
0
我已经用Google搜索了它,但是还没有现成的脚本-与Flash上的相同效果相反。我已经检查了“水效应解释”中的算法,还测试了Perlin Noise的实现,该实现可以很好地模拟平坦表面上的波结束。我正在寻找基于鼠标悬停/悬停操作在多个Flash Effects中发现的相同实现。这是针对交互式地板库的,因此我很乐意脱离Flash,特别是避免对代码进行如此简单的反向工程-是的,我知道它可以只使用一些现成的Flash代码,但是我只会将其作为最后的手段。
有没有人看到过适用于Pygame的这种效果的合适实现(是否使用OpenGL)?
编辑: 谁能提供使用OpenCV / OpenGL和Pygame的这种效果的合适实现?
罪魁祸首是(代码)接口,该接口传递将通过Python从外部解释器(虽然是跟踪器,但不是TUIO)发送的值的列表。我已经连续尝试了好几天,但是Pygame不能像纯粹的C / C ++代码(如OpenGL中的着色器那样)生成任何东西,而我对C / C ++的了解是空的。因此,目标是至少使它们来自Python代码。
一个很好的例子,不同于Flash效果,但仍然很好,那就是使用Java applet的Water Simulation 。
(赏金显示答案没有足够的细节,因为这与“ OP由于缺乏基本技能而无法创建他想要的代码,OP无法创建他想要的代码,并且该答案可能对几个人有用”有关)。