pygame水波纹效果
image-processing
python
5
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无法创建他想要的代码,并且该答案可能对几个人有用”有关)。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

以下使用numpy可能会让您入门。它应该足够快,尽管即使在python中也可以更快(尽管在这里可以看到http://www.scipy.org/PerformancePython的用法 )。

顺便说一下,所描述的方法有几个缺点:

  1. 您无法控制脉动的速度-为此,您必须修改脉动函数中使用的方程式(如果您弄清楚了它与波动方程式的关系,则http://en.wikipedia.org/wiki/Wave_equation你完成了)
  2. “池”的“深度”是固定的(可能太浅了)。我添加了一个depth参数来放大效果
  3. 本文读取整数像素偏移量-使用插值可得到更好的结果(我想您可以使用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) # 
收藏
评论

在完成作业(又名研究)并尝试将问题上张贴的Java代码参考直接转换为Python之后,在尝试让Python / Numpy根据其位置更新大量像素颜色时遇到了非常非常可悲的经历。涟漪效应的起伏(对不起,我的母语不是英语),因此每次进行效果计算时都会解析几个(x,y)位置,并将其涂抹到屏幕上显示的表面上(随后出现surfarray),得出的结论-由其他评论者支持-Pygame根本无法强大地实际遍历整个像素阵列并将计算结果以最小24 fps的速率应用于屏幕上的每个像素(体验低于平均水平)。

引用了Last Light Productions和前Project Geometrian项目的开发人员Ian Mallet:

PyGame不太适合像素推送。除了GPU之外,什么都没有。

然后,搜索结果就是对Alkahest的搜索-最终将不会被真正找到-基于相同的波纹图像想法,但是这次我使用透明性来透视 Pygame的几层表面, Pygame在Gamedev上进行圆形裁剪/遮罩的问题。在选择的答案居然证实我已经担心Pygame的绝不会是这份工作不够男子气概的事实。

一天后,我回到了以前的开发思路,并遇到了Ogre3D 。事实证明,(1)Ogre3D和示例是开源的,(2)示例之一是与运动对象进行交互的3-D水模型,这与我尝试在2-D中实现的目标完全相同,但是以更专业的方式。

由于我对C / C ++的了解为零,因此我决定询问有关如何自定义Ogre3D water演示以了解从哪里开始寻找的内容,其中一个答案将我指向了提供SDK的Touchscape软件(请参阅教程)。 回答 )。

Ogre3D几乎把它包起来了。水波纹效果,OpenGL(可基于硬件选择使用),通过Python-Ogre的游戏引擎和Python包装器-所以我对自己的问题的回答是,

谁能使用OpenCV / OpenGL和Pygame提供合适的这种效果实现?

基本上是

是。检查SDK随附的Ogre3D的水演示-并将其通过Python-Ogre插入Python。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号