之前的博文中我们实现了RPG人物的复古效果.
现在我们再完点high的,我们准备实现这么一种效果:
人物从中心点开始形成一个空洞,洞的边缘产生一种吸入变形效果.
有了上一篇的铺垫,我们可以很快搞定它.
首先看一下Apple对其CIHoleDistortion滤镜的说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Localized
Display Name
Hole
Distortion
inputImage
A
CIImage object whose display name is Image.
inputCenter
A
CIVector object whose attribute type is CIAttributeTypePosition and whose
display name is Center.
Default
value: [150150]
inputRadius
An
NSNumber object whose attribute type is CIAttributeTypeDistance and whose
display name is Radius.
Default
value:150.00
|
以上是滤镜对应的3个参数,很简单:
第一个是输入图片,第二个是黑洞的中心点,最后一个是黑洞的半径.
官方网站还给出了应该显示的效果:
好了,下面我们把它放到游戏中去:
1
2
3
4
5
6
7
8
9
10
11
|
CIImage
*ciImage = [CIImage imageWithCGImage:_image.CGImage];
//用过滤器生成新的CIImage
CIFilter
*filter = [CIFilter filterWithName:@"CIHoleDistortion"];
CIVector
*vector = [CIVector vectorWithX:sz.width*_image.scale/2
Y:sz.height*_image.scale/2];
[filter
setValue:ciImage forKey:@"inputImage"];
[filter
setValue:vector forKey:@"inputCenter"];
[filter
setValue:@(10.0)
forKey:@"inputRadius"];
CIImage
*outputImage = [filter outputImage];
|
以上我们选择RPG人物的中心点为黑洞的中心,且黑洞的半径为10.
编译运行游戏,效果如下:
放大一点看一下效果:
可以看到上图中的狗狗的肚子里出现了背景草地上一朵小花.
一般来说要想实现该效果,需要自己写OpenGL ES的端点和片段着色器,但是我们通过Cocoa提供的滤镜,避免了较底层的方法,而且实现起来非常简单.
相关介绍:黑洞
黑洞是现代广义相对论中,宇宙空间内存在的一种密度极大体积极小的天体。黑洞的引力很大,使得视界内的逃逸速度大于光速。
1916年,德国天文学家卡尔·史瓦西(Karl Schwarzschild,1873~1916年)通过计算得到了爱因斯坦引力场方程的一个真空解,这个解表明,如果将大量物质集中于空间一点,其周围会产生奇异的现象,即在质点周围存在一个界面——“视界”一旦进入这个界面,即使光也无法逃脱.这种“不可思议的天体”被美国物理学家约翰·阿奇巴德·惠勒(John Archibald Wheeler)命名为“黑洞”。
“黑洞是时空曲率大到光都无法从其视界逃脱的天体”。
黑洞是由质量足够大的恒星在核聚变反应的燃料耗尽而死亡后,发生引力坍缩产生的。黑洞的质量极其巨大,而体积却十分微小,它产生的引力场极为强劲,以至于任何物质和辐射在进入到黑洞的一个事件视界(临界点)内,便再无法逃脱,甚至目前已知的传播速度最快的光(电磁波)也逃逸不出。
黑洞无法直接观测,但可以借由间接方式得知其存在与质量,并且观测到它对其他事物的影响。借由物体被吸入之前的因高热而放出和y射线的“边缘讯息”,可以获取黑洞存在的讯息。推测出黑洞的存在也可借由间接观测恒星或星际云气团绕行轨迹取得位置以及质量。
科学家最新研究理论显示,当黑洞死亡时可能会变成一个“白洞”,它不像黑洞吞噬邻近所有物质,而是喷射之前黑洞捕获的所有物质。
科学家猜测穿过黑洞可能会到达另一个空间,甚至是时空。
【Cocos2D联合CoreGraphics实现RPG人物中空黑洞吸入效果】相关文章:
★ Ruby连接使用windows下sql server数据库代码实例