swift – 如何创建一个圆形对象进入和分离一个厚物质的效果
基于下面的图像(我使用不同的颜色的圆和平面,所以他们可以看到,但最终颜色会是一样的),使用Swift和Spritekit,我试图创建一个圆形对象的效果进入厚物质(不一定是粘性的)并与厚物质分离。基本上,当圆形物体分离时,当它形成圆形时,它将从平坦表面拉开。
我想使用图像动画框架,但由于对象是SKSpriteNodes与物理体,这将使计时与动画的对象的碰撞相当困难。另一种方法是使用CAAnimation,但我不知道如何可以结合SKSpriteNodes与物理体。如何使用任何上述方法或不同的方法创建此分离效果? 更新 下图显示了厚物质表面的变化,因为圆形物体进入厚物质直到其浸没。
从高层次的理解,有两种方法来做到这一点。
> BAY WAY(但是当流体具有纹理时工作得更好):提前创建sprite工作表,然后覆盖SKSpriteNode对象的附加子项。动画精灵中的帧将是从球到表面的距离的函数,当它们之间的距离小于某个量时。所需的距离范围(范围)必须映射到精灵帧数(frameIndex)。 f(range)= frameIndex。线性插值将有助于在这里。更多关于插值的内容。 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。 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 这是因为任何两个形状可以使用插值混合在一起。 你可以创建任何两个形状之间的无缝混合,只要点的数量是相同的。这是一个人在好莱坞电影中变形成狼的方式,或者一个人如何变成一个液体水坑。演奏这些效果的唯一原则是插值。插值是一个非常强大的工具。它定义为: 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. 有关插值的更多信息, 进一步研究。如果你正在考虑动画任何动态形状,我会考虑理解贝塞尔曲线。 Pomax有一篇关于这个话题的精彩文章。虽然许多框架中都有曲线,但是大致了解它们的工作原理将允许您广泛地操作它们或者在框架缺乏的情况下滚动自己的特性。她是Pomax的文章: A Primer on Curves 祝你好运进步:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Oracle - 安装 Oracle Database 11g Release 2
- Linux静默安装Oracle11g部分问题的解决方法
- 算法题解:实现正则表达式 '.' 和 '*' 的匹
- cocos2dx-24种基本特效
- 几个简单的算法
- ruby-on-rails – Rails,在非活动记录模型上使用time_selec
- nand flash 驱动分析之Uboot下
- ruby-on-rails – 测试rails helper渲染部分
- 使用SQLite offline storage API来存储应用的设置
- ruby-on-rails-3 – 当启动rails3.1应用程序缺少postgres宝