X、Y +回転に2つのポイントがあり、これら2つのポイントをスムーズに接続するベジエスプライン(2次ベジエのコレクション)を計算する必要があります。(写真を参照)ポイントは、ゆっくりとしか回転できないゲーム内のユニットを表します。したがって、ポイントAからBに到達するには、長い道のりをたどる必要があります。添付の写真はかなり誇張された曲がりくねった道を示していますが、あなたはその考えを理解しています。
このようなベジェスプラインを計算するためにどのような式を使用できますか?
私があなたの質問を誤解しているのを見ただけです。始点と終点、および2つの方向(接線)があるため、代わりに単一の立方エルミートスプラインを使用できませんか?追加の制約はありますか?
開始接線と終了接線を計算するには、開始方向と終了方向を使用し、開始点と終了点の間の距離でスケーリングします(さらに、パスの曲線度に応じて0.5などの他の定数係数)。
p0 = startpoint;
p1 = endpoint;
float scale = distance(p0, p1);
m0 = Vec2(cos(startangle), sin(startangle)) * scale;
m1 = Vec2(cos(endangle), sin(endangle)) * scale;
私はこのシステムを使用して、作業中のゲームのカメラパスを補間します。これはうまく機能します。
ご存知かもしれませんが、2つの制御点を想定したとしても、無限の解決策があります。
私はあなたの質問に答えるベジェ曲線を使用した平滑化アルゴリズムを見つけました(最初の方程式Bx(t)
を参照By(t)
してください):
B x(t)=(1-t)3 P 1x + 3(1-t)2 t P 2x + 3(1-t)t 2 P 3x + t 3 P 4x
B y(t)=(1-t)3 P 1y + 3(1-t)2 t P 2y + 3(1-t)t 2 P 3y + t 3 P 4y
P1とP4はエンドポイントであり、P2とP3はコントロールポイントであり、任意の角度に沿って自由に選択できます。コントロールポイントがポイントから角度θに沿った距離にある場合、ポイントの座標は次のようになります。r
(x, y)
x'= x --rsin(θ)
y'= y-rcos(θ)
(あなたが使用した座標系によると、私は正しい兆候を持っていると思います)。唯一の自由パラメーターはr
、です。これは、必要に応じて選択できます。あなたはおそらく使いたいでしょう
r =αdist(P 1、P 4)
α<1。
どこで入手したかは覚えていませんが、これを使用しています。
Vector2 CalculateBezierPoint(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
float u = 1 - t;
float tt = t*t;
float uu = u*u;
float uuu = uu * u;
float ttt = tt * t;
Vector2 p = uuu * p0; //first term
p += 3 * uu * t * p1; //second term
p += 3 * u * tt * p2; //third term
p += ttt * p3; //fourth term
return p;
}
ここで、t
は開始点と終了点の間のパスに沿った比率です。