高レベルの理解から、これを行うには 2 つの方法があります。
悪い方法 (ただし、流体にテクスチャがある場合はより適切に機能します): 事前にスプライト シートを作成してから、SKSpriteNode オブジェクトの追加の子をオーバーレイします。アニメーション スプライトのフレームは、ボールとサーフェスの間の距離が一定量未満の場合、ボールからサーフェスまでの距離の関数になります。目的の距離範囲 (範囲) は、スプライトのフレーム番号 (frameIndex) にマップする必要があります。f(範囲) = フレームインデックス。ここでは線形補間が役立ちます。補間については後で詳しく説明します。
正しい方法: 流体を曲線オブジェクトにしてから、初期状態、中間状態、および最終状態の間で線形補間を使用して曲線上のポイントをアニメートします。これには、それぞれ同じ数のポイントを持つ 3 つのカーブが必要です。初期の流体状態を F1 とします。モデル F1 は静的流体としてポイントします。ボールが半分水没したときの流体状態を F2 とする。モデル F2 は、ボールが最大幅で水没したように見えることを示しています。ボールが 75% 沈んだときの流体状態を F3 とします。ボールが完全に沈んでも、流体は変化していないように見えることに注意してください。これが、ボールが 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;
次に、プロジェクトが 2D であっても、3D ベクトルでベクトルの外積を使用して、ボールが流体の外側にあることを検出します。
Ball Vector (Vb)
^
|
(V) O---> Closest Fluid Surface Vector (Vs)
V = Vb x Vs
次に、Vz と呼ばれる V の Z 成分を見てください。(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
これは、補間を使用して任意の 2 つの形状をブレンドできるためです。パラメータ「t」は、2 つの形状をブレンドするパーセンテージとして機能します。
ポイントの数が同じである限り、実際には任意の 2 つのシェイプ間でシームレスなブレンドを作成できます。これは、ハリウッド映画で男性がオオカミに変身する方法、または男性が液体の水たまりに変身する方法です。これらの効果の唯一の原則は補間です。補間は非常に強力なツールです。次のように定義されています。
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 記事を参照してください。
さらなる研究のために。動的な形状をアニメーション化することを検討している場合は、ベジエ曲線を理解することを検討してください。Pomax には、このトピックに関するすばらしい記事があります。多くのフレームワークには曲線がありますが、それらがどのように機能するかを一般的に理解することで、それらを広範囲に操作したり、フレームワークに欠けている独自の機能を展開したりできます。彼女はPomaxの記事です:
曲線の入門書
あなたの進歩に幸運を祈ります:)