如何创build一个圆形的物体进入和从粗物质分离的效果
基于下面的图像(我使用不同的颜色为圆和平坦的表面,所以他们可以看到,但最后的颜色将是相同的),使用Swift和Spritekit,我想创build一个圆形对象的效果进入一种厚物质(不一定是粘稠的)并与厚物质分离。 基本上,当圆形物体分离时,它会形成一个圆形,从平面上脱离。 我想使用图像animation框架,但是由于对象是具有物理体的SKSpriteNodes,所以这将使对象与animation的碰撞难以计时。 另一种方法是使用CAAnimation,但我不知道如何将它与SKSpriteNodes结合使用。 我如何使用上述任何一种方法或不同的方法创build这种分离效果?
UPDATE
下图显示了圆形物体进入厚物质直至被淹没时厚物质表面的变化。
从高度的理解有两种方法来做到这一点。
-
糟糕的方式(但stream体有纹理时效果更好):提前创build精灵表,然后覆盖SKSpriteNode对象的额外的孩子。 当animation精灵中的框架的距离小于某个值时,框架将成为从球到表面的距离的函数。 所需的距离范围(范围)必须映射到精灵帧编号(frameIndex)。 f(range)= frameIndex。 线性插值将在这里帮助。 稍后再介绍一下插值。
-
正确的方法:使stream体成为曲线对象,然后使用初始状态,中间状态和最终状态之间的线性插值对曲线上的点进行animation处理。 这将需要三条曲线,每条曲线具有相同的点数。 让初始stream体状态为F1。 F1型表示为静态stream体。 当半球被淹没时,让stream体状态为F2。 F2型指向看起来像在最大宽度下浸没的球。 当球被浸泡75%时,让stream体状态为F3。 注意当球被完全浸没时,stream体看起来没有变化。 这就是为什么当球被浸泡75%时,它具有最大的表面张力来抓住球。 就SpriteKit而言,您可以使用这些对象:
CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, 0, 0); CGPathAddQuadCurveToPoint(path, NULL, 50, 100, 100, 0); CGPathAddLineToPoint(path, NULL, 50, -100); CGPathCloseSubpath(path); SKShapeNode *shape = [[SKShapeNode alloc]init]; shape.path = path;
然后使用具有3Dvector的vector叉积来检测球在stream体外部的时间,即使您的项目是二维的。
Ball Vector (Vb) ^ | (V) O---> Closest Fluid Surface Vector (Vs) V = Vb x Vs
然后看看V的Z分量,叫做Vz。 如果(Vz <0),球在stream体之外:创build一个variablest:
t = distOfBall/radiusOfBall
然后,对于stream体形状中的每个有序点执行以下操作:
newFluidPointX = F1pointX*(t-1) + F2pointX*t newFluidPointY = F1pointY*(t-1) + F2pointY*t
如果Vz> 0),球在stream体内部:
t = -(((distOfBall/radiusOfBall) + 0.5)^2) *4 + 1 newFluidPointX = F2pointX*(t-1) + F3pointX*t newFluidPointY = F2pointY*(t-1) + F3pointY*t
这是有效的,因为任何两个形状可以使用插值混合在一起。 参数“t”用作混合两个形状的百分比。
实际上,只要点的数量相同,就可以在任意两个形状之间创build无缝混合。 这就是一个人在好莱坞电影中变身成狼,或者一个男人如何变成一个液体的水坑。 这些效果唯一的原则就是插值。 插值是一个非常强大的工具。 它被定义为:
L = A*(t-1) + B*t where t is in between 0.0 and 1.0 and A and B is what you are morphing from and to.
有关插值的更多信息,请参阅: Wiki文章
为了进一步研究。 如果你正在考虑animation形状,我会考虑理解贝塞尔曲线。 Pomax有关于这个话题的精彩文章。 虽然许多框架都有曲线,但是对它们的工作方式有一个大概的了解,可以让你在扩展框架不足的情况下操纵它们,或者展开自己的function。 她是Pomax的文章:
曲线的入门
祝你好运:)