2012-04-26 107 views
8

我正在做一个动态壁纸,其中包含一些水涟漪效果触摸屏幕,但我有点卡住了。动态壁纸水涟漪效应

创建多个图像并循环遍历它们以创建涟漪动画会更好吗?还是在将它放在画布上之前扭曲位图会更好?

This是一个非常漂亮的涟漪效应通过OpenGL完成的视频。

我还没有使用OpenGL的经验,并想知道是否仍有可能在动态壁纸上创建2D水效果?

+0

其中一个内置的在Android上的动态壁纸是水荡漾,所以它肯定是可能的。 – Wyzard 2012-04-26 01:24:46

回答

16

我想实现在Android的一个现实的连锁反应太多,所以会分享我的经验:

作为一个参考实现,我把尼尔·沃利斯的Java算法中的谢尔盖的Chikuyonok的JavaScript端口。这里有一个游乐场,您可以尝试使用原始的JS代码:http://jsfiddle.net/esteewhy/5Ht3b/6/

首先,我已经将JS代码移植到了Java中,只是意识到我的华为U8100硬件无法挤压超过1 fps。 (网上有几个类似的尝试,唯一的结论是:他们的速度很慢)。

顺便说一句,这个SO的答案是非常有用的基本了解如何在Android中编写交互式图形:https://stackoverflow.com/a/4946893/35438。我从那里借用了fps计数器。

然后我决定尝试使用Android NDK来重新实现纯C中的原始算法(我的第一次遇到它在10年以上!)。尽管NDK的文档有些混乱(特别是对于需求和先决条件),但它的功能都像一个魅力,所以我能够达到30帧/秒 - 它可能不会太令人印象深刻,但仍然是对Java代码的彻底改进。

最后,我把我所有的工作放在网上:https://github.com/esteewhy/whater,所以随时随地玩。它包含:

  1. 上面提到的交互式弹跳球代码(仅供参考)。
  2. 水涟漪Java端口(像地狱一样慢!)
  3. 水涟漪C实现(需要NDK编译和JDK创建.h文件)。

(该项目是不是“干净”,即:所有的二进制文件都在那里,所以可以尝试运行“原样”即使没有NDK)

enter image description here

+0

你能告诉我如何在你的代码中改变背景到我的图片吗? 当我尝试时,我有NullPointerException 谢谢 – metalink 2016-02-19 13:59:21

4

我不是这方面的专家,但我相信在OpenGL中做水效应的典型方法是使用片段着色器。使用静态图像作为纹理,着色器可以改变用于采样该图像的纹理坐标,以任意方式对其进行扭曲。

根据距离的正弦函数计算像素的方向和距离圆心的距离,并根据距离的正弦函数调整朝向​​或远离圆心的纹理坐标,并且您应该获得很好的涟漪效应。

根据您关联的YouTube视频的描述来判断,这听起来像是通过使用三角形网格并仅在顶点调整纹理坐标来完成的。这也应该起作用,但除非使用相当精细的网格,否则看起来不太好。使用片段着色器进行每像素处理是理想选择,但我不知道这是否会导致手机GPU上的性能问题。

+0

你知道如何在OpenGL中做这样的事情吗? – Gatekeeper 2012-04-26 01:51:46

+0

不手风琴,对不起。如果你是OpenGL的新手,我建议你通常会学习片段着色器和纹理采样,一旦你理解了这些,*然后*担心使用它们来产生涟漪。 – Wyzard 2012-04-26 02:08:08

6

你可以找到在这里触摸涟漪效果的例子:

https://github.com/MasDennis/RajawaliExamples

它利用拉贾瓦利OpenGL ES的框架/库。您可以从市场上下载rajawali示例应用程序,看看它的外观。浏览“src”文件夹,您将看到TouchRippleEffect活动和渲染器。希望有所帮助。

+0

我已经从playstore下载了Rajawali示例。在这27是触摸涟漪效应,但是当我运行的源代码的部分评论...我有源代码下面的线... org.rajawali3d:rajawali:[email protected] 任何人都可以帮助解决这个问题 – 2016-07-27 06:39:34