以前ベジェ曲線を計算するクラスを作成しました
ここで全体の距離がほしかったので処理を追加しました
以前の処理をクラスに追加すれば取得できます
計算自体もこれで正しいのかわかりませんが、曲線を分割して
分割した距離を合計しています
LOOP_VALUE の値が小さいほど正確な値が取得できますが
計算量が増えてしまうため注意が必要です
/// <summary> /// 距離を取得 /// </summary> public float Length => GetLength(_positions); public static float GetLength(Vector3[] pos) { const float LOOP_VALUE = 0.05f; var total = 0f; var prev = Eval(pos, 0f); var c = Vector3.zero; var diff = Vector3.zero; for (var t = LOOP_VALUE; t < 1f; t += LOOP_VALUE) { c = Eval(pos, t); diff = prev - c; total += (float)Math.Sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z); prev = c; } c = Eval(pos, 1f); diff = prev - c; total += (float)Math.Sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z); return total; }