我想使用图像动画框架,但由于对象是SKSpriteNodes与物理体,这将使计时与动画的对象的碰撞相当困难。另一种方法是使用CAAnimation,但我不知道如何可以结合SKSpriteNodes与物理体。如何使用任何上述方法或不同的方法创建此分离效果?
更新
下图显示了厚物质表面的变化,因为圆形物体进入厚物质直到其浸没。
> BAY WAY(但是当流体具有纹理时工作得更好):提前创建sprite工作表,然后覆盖SKSpriteNode对象的附加子项。动画精灵中的帧将是从球到表面的距离的函数,当它们之间的距离小于某个量时。所需的距离范围(范围)必须映射到精灵帧数(frameIndex)。 f(range)= frameIndex。线性插值将有助于在这里。更多关于插值的内容。
>正确的方式:使流体成为曲线对象,然后使用初始,中间和最终状态之间的线性插值为曲线上的点设置动画。这将需要三个曲线,每个曲线具有相同的点数。让初始流体状态为F1。模型F1点为静态流体。当球在中途浸没时,使流体状态为F2。模型F2指向看起来像球淹没在其最大宽度。当球浸入75%时,使流体状态为F3。注意,当球完全浸没时,流体看起来没有改变。这就是为什么当球是75%淹没时,它具有抓住球的最大表面张力。至于SpriteKit,你可以使用这些对象:
CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path,NULL,0); CGPathAddQuadCurveToPoint(path,50,100,0); CGPathAddLineToPoint(path,-100); CGPathCloseSubpath(path); SKShapeNode *shape = [[SKShapeNode alloc]init]; shape.path = path;
然后通过使用具有3D向量的向量叉积来检测球是否在流体外部,即使您的项目是2D。
Ball Vector (Vb) ^ | (V) O---> Closest Fluid Surface Vector (Vs) V = Vb x Vs
然后看看V的Z分量称为Vz。
如果(Vz <0),球在流体外部:
创建变量t:
t = distOfBall/radiusOfBall
然后对于流体形状中的每个有序点执行以下操作:
newFluidPointX = F1pointX*(t-1) + F2pointX*t newFluidPointY = F1pointY*(t-1) + F2pointY*t
如果Vz> 0),球在流体内部:
t = -(((distOfBall/radiusOfBall) + 0.5)^2) *4 + 1 newFluidPointX = F2pointX*(t-1) + F3pointX*t newFluidPointY = F2pointY*(t-1) + F3pointY*t
这是因为任何两个形状可以使用插值混合在一起。
参数“t”用作两个形状之间的混合百分比。
你可以创建任何两个形状之间的无缝混合,只要点的数量是相同的。这是一个人在好莱坞电影中变形成狼的方式,或者一个人如何变成一个液体水坑。演奏这些效果的唯一原则是插值。插值是一个非常强大的工具。它定义为:
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 Article
进一步研究。如果你正在考虑动画任何动态形状,我会考虑理解贝塞尔曲线。 Pomax有一篇关于这个话题的精彩文章。虽然许多框架中都有曲线,但是大致了解它们的工作原理将允许您广泛地操作它们或者在框架缺乏的情况下滚动自己的特性。她是Pomax的文章:
祝你好运进步:)