2009-06-02 34 views
2

特に、既知の3D点のセットを通過する曲線/スプラインを表現する方法、および細分/補間によって曲線/スプライン上の他の点を見つける方法が必要です。3Dスプライン関数を持つJavaライブラリがありますか?

たとえば、ポイントP0からPNのセットがある場合、P0とP1を通過するスプライン上にあるP0とP1の間に100ポイントを見つける必要があります。

Java3DのKBRotPosScaleSplinePathInterpolatorはこのような計算を実行しますが、そのAPIのシーングラフモデルに関連付けられており、必要な値を返す方法はわかりません。

答えて

1

私が知っている内蔵ライブラリはありません。 Source

+0

物事は変化しています。 – Martin

4

あなたはCatmull Rom splineのようなものをお探しですか?現実は、数学はちょうどall that hard to deal with(いくつかのベクトル - 行列乗算)ではないということです。私がお勧めするのは、実際にコードに必要なスプラインを実装することだけです。

Quoting from that article

スプラインを定義する点は、 "コントロールポイント" として知ら あります。 Catmull-Romスプラインの フィーチャの1つは であり、指定されたカーブはすべてのコントロールポイントに を渡します。 これはすべてのタイプの スプラインに該当しません。

An illustration of the Catmull-Rom spline passing through all control points.

曲線上の点を計算する 左側に示すように、所望 ポイントのどちらかの側の2つの 点は、必要とされます。ポイントは、 の値tによって指定され、 の部分を表し、最も近い2つの制御点の間の距離を表します。

Catmull-Romスプラインは、タイトな回転を必要とするときに、互いに近すぎると制御点に小さなループを引き起こす可能性があることに注意してください。

上記の画像を見ると、p1とp3がp2(基本的に画像の右側を圧縮している)の直下にあると想像してください。 Catmull-Romスプラインはp0から下がり、p1を通り、p2の右に上がり、右から左に通り、左に下がり、左から右に通りますp3。

これは、スプラインの構築の結果です。

私はシンクの下にあるように、かなり剛性のある柔軟なパイプで作業するようなものです。近くにある点に長くつなぐために、ループを追加する必要があります。

3

カーブの後ろにある数学に苦労している人には、thisが特に便利です。考え方は単純です:

tループは0.0から1.0までです。

グレーの各点の組について、(tを使用して)それらの間のウェイの小数点を計算します。これらの点は、の緑色ので示されています。

緑のの各点の組について、(tを使用して)それらの間のウェイの端数を計算します。この点は、の黒色に示されています。

異なる値のtの場合、黒い点は曲線に沿った異なる線になります。

第2のイメージは、余分なポイントと追加レベルの補間を使用して繰り返される同じプロセスを示しています。

これは私が見つけた他のオプションよりもはるかに理解しやすく、実装し、3次元に拡張することがわかりました。

approximating a curve using linear interpolation http://bimixual.org/AnimationLibrary/Bezier_2_big.gif approximating a curve using linear interpolation http://bimixual.org/AnimationLibrary/Bezier_3_big.gif

+0

はい、これはベジェスプラインと呼ばれます。このスプラインの問題は、P0からP1、P2を通過してP3に達するカーブが必要な場合に発生します。ご覧のとおり、P1とP2はベジェスプラインのコントロールポイントですが、カーブには決して触れません。 Catmull-Romスプラインはこれと似ていますが、これまでコントロールポイントを通過することはありません。 –

+0

リンクが壊れていて、今日の時点で画像もなくなっています。 – Chris

0

私はまだ試していないが、おそらく3D表面は、ランダム点入力のうち、メッシュ生成するために、すぐにそれをしようとします:toxiclib Spline3dツール

http://code.google.com/p/toxiclibs

2

として私は線形補間について十分に理解していますが、スプライン数学の複雑さを把握することは困難でした。そのため、難しい数学を隠すための抽象化を提供するライブラリを探していました。次の機能は、私のニーズに十分であることが判明しました。これはhttp://www.mvps.org/directx/articles/catmull/の式に基づいていますが、うまくいけばそれがどのように動作するのかを理解する必要はありません。 Catmull-Romスプライン補間は、どちらかの端に余分な点を使用します。したがって、10点を通過するスプラインが必要な場合は、12が必要です。

この関数は、Catmull-Romスプライン補間を1次元で実演します。 (2次元または3次元の場合は、YまたはZ値を使用して単純に繰り返します。)この関数は、p1とp2の間のスプライン上の点を与えます。ここで、tは2つの間の距離の割合です。

public class SplineTest { 

    // Catmull-Rom spline interpolation function 
    public static double q(double t, double p0, double p1, double p2, double p3) { 

     return 0.5 * ((2 * p1) + (-p0 + p2) * t 
       + (2 * p0 - 5 * p1 + 4 * p2 - p3) * (t * t) + (-p0 + 3 * p1 - 3 
       * p2 + p3) 
       * (t * t * t)); 
    } 

    public static void main(String[] args) { 
     double t = 0.0; 
     while (t <= 1.0) { 
      System.out.println(q(t, 5, 10, 20, 10)); 
      t += 0.1; 
     } 
    } 
} 

このプログラムの出力は:

10.0 
10.887500000000001 
12.0 
13.2625 
14.6 
15.9375 
17.2 
18.3125 
19.2 
19.7875 
20.000000000000004 
関連する問題