＜スプラインデータついて＞
３次元空間に設定された曲線の上をキャラ(や弾)が移動したりする際に使用されます。
スプラインデータは次の２種類のファイルによって定義されています。
①スプライン曲線座標情報ファイル   ・・・ datファイル
②スプライン定義ファイル           ・・・ splファイル

＜スプライン曲線座標情報ファイル(*.dat)について＞
スプライン曲線のもととなる頂点座標情報を保持します。
以下のようなフォーマットのスプライン曲線の座標情報ファイルです。
(※gnuplotの出力ファイルがそのまま使用出来るで！)

samplebase.dat ---------------------------------
[BASEPOINT]
#       X         Y         Z
-1.724577  0.000000  0.000000
-0.964337 -0.088378 -0.344892
-0.501305 -0.055518 -0.298879
-0.179336 -0.031628 -0.240141
 0.123544 -0.016126 -0.165195
 0.362343  0.000000  0.000000
 0.545634  0.038709  0.176104
 0.704048  0.173192  0.372772
 0.864812  0.444651  0.516556
 1.055714  0.626849  0.569336
 1.246407  0.655359  0.547772
 1.365876  0.590994  0.453279
 1.388259  0.465998  0.332581
 1.362117  0.328636  0.211183
 1.242692  0.226675  0.087900
 1.064405  0.202917  0.000000
 0.920421  0.202917  0.000000

[ACCURACY]
0.2
-------------------------------------------------


＜スプライン曲線座標情報ファイルの各項目の説明＞

[BASEPOINT]
スプライン曲線上の制御点座標情報です。
X Y Z で設定。指定できるポイント数は最大1000個までです。

[ACCURACY]
スプライン曲線座標点の精度。
BASEPOINTで指定した制御点～制御点の間にどのくらいの補完点を追加するかという割合を指定します。
補完点は、前後の制御点により、なめらかな曲線を描くような位置に挿入されます。（いわゆるスプライン曲線）

1.0  を指定すると制御点～制御点の間に補完点は挿入されず、BASEPOINT指定通りのままとなる。
0.5  を指定すると各制御点～制御点について、2分割される点に補完点が計算されて挿入される。(つまり制御点～制御点に、補完点は1個づつ挿入される)
0.25 を指定すると各制御点～制御点について、4分割される点に補完点が計算されて挿入される。(補完点は3個挿入される)
0.1  を指定すると各制御点～制御点について、10分割される点に補完点が計算されて挿入される。(補完点は9個挿入される)
0.01 を指定すると各制御点～制御点について、100分割される点に補完点が計算されて挿入される。(補完点は99個挿入される)
といった具合。



＜スプライン定義ファイル(*.spl)ついて＞

スプライン定義ファイルとは、拡張子がsplで以下のようなフォーマットのファイルの事です。
プログラムで読み込まれ、キャラの動きに使用されます。以下サンプル。

sample.spl -------------------------------------
SPLINE=samplebase.dat
MAG_X=4000000.0
MAG_Y=1125000.0
MAG_Z=4000000.0
CLASS=FixedFrameSpline
SPENT_FRAME=300
ANGLE_VELOCITY=12000
TURN_WAY=TURN_CLOSE_TO
TURN_OPTIMIZE=true
------------------------------------------------


＜スプライン定義ファイルの各項目の説明＞

・"SPLINE"
スプライン曲線の座標情報のファイルを指定します。


・"MAG_X", "MAG_Y", "MAG_Z"
前述の "SPLINE" が指定した座標情報に対して倍率を掛けることができます。
MAG_X, MAG_Y, MAG_Z は X軸方向、Y軸方向、Z軸方向、の倍率の設定値です。
サンプル例では元の座標情報(samplebase.dat)を X軸方向に4000000.0倍、Y軸方向に1125000.0倍、
Z軸方向に4000000.0倍に拡大したものをスプライン曲線のポイントとするという意味となります。
SPLINE が指定した座標情報に対して拡大縮小が不要な場合は、

MAG_X=1.0
MAG_Y=1.0
MAG_Z=1.0

と記述すれば、１倍のため拡大縮小はおこなわれません。
拡大縮小の倍率はは負の数もサポートします。
Y軸反転したい場合は

MAG_X=1.0
MAG_Y=-1.0
MAG_Z=1.0

とすればOKです。


・"CLASS"
スプライン移動の実行クラスを指定します。
キャラがどのようにスプライン曲線上を移動するかに影響します。
指定可能なクラスは現在 FixedFrameSpline 又は FixedVelocitySpline の２種類のみです。
次のような特徴があります。

FixedFrameSpline    ・・・ スプラインの開始点～終了点の移動を、時間(フレーム)固定で移動させる。
                           各キャラが保持している移動速度は無視されます。
                           スプライン曲線の点の個数と費やすフレーム数から計算された移動速度が逐一キャラの速度値に上書き設定されます
                           このため、スプライン曲線の点の密度が濃いところはスピードが遅く、点の密度が薄いところはスピードが速い移動となります。

FixedVelocitySpline ・・・ スプラインの開始点～終了点の移動を、速度固定で移動させる。
                           各キャラが保持している移動速度がずっと使用されます。
                           スプライン曲線の点の密度がスピードに影響しません。
                           補完点間の距離に応じて、費やす移動時間が予め計算されます。
                           スプラインの開始点～終了点の移動に何フレームかかるかはキャラのスピード次第です。


・"SPENT_FRAME"
移動完了に費やすフレーム数を設定します。
これは CLASS=FixedFrameSpline とした場合のみ設定可能な項目です。
スプラインの開始点～終了点の移動を、何フレームで移動させたいのかを設定します。
FixedVelocitySpline を設定していた場合、この項目は無視されます。


・"ANGLE_VELOCITY"
毎フレーム方向転換可能な最大角(1000 で 1度）を設定します。
キャラがスプライン曲線の点から点へ移動する際、１フレーム当たりの方向転換可能な回転角度を設定します。
この角度を大きくし過ぎると(180000等) スプライン曲線の点から点へ折れ線グラグのように移動します。
角度を小さくしすぎると(1000等) 方向転換に時間がかかり、うまくスプライン曲線に乗らないような移動になるかもしれません。
スプライン曲線のカーブ度合いにより最適な回転角度を設定しなければいけません。


・"TURN_WAY"
キャラ移動の旋回方法を指定します。次の４つから選べます。

TURN_CLOSE_TO         ・・・次の補完点座標へ方向転換する際、回転角度が少ない方を選んで旋回する
TURN_ANTICLOSE_TO     ・・・次の補完点座標へ方向転換する際、回転角度が多い方を選んで旋回する
TURN_CLOCKWISE        ・・・次の補完点座標へ方向転換する際、常に時計回りで旋回する
TURN_COUNTERCLOCKWISE ・・・次の補完点座標へ方向転換する際、常に反時計回りで旋回する

ほぼ、TURN_WAY=TURN_CLOSE_TO の１択です。
まぁ、他の旋回方法は面白い動きが期待できます。


・"TURN_OPTIMIZE"
キャラ移動の旋回方法の最適化を行うかどうか true/false で設定します。
２軸回転で向きの制御を行っているため、TURN_CLOSE_TOを設定しても目的の方向に向くためには、
常に複数のアプローチが存在します。

false：を設定した場合、目的の方向は、各軸の回転角の角度差による計算結果で求められます。
       したがって、キャラの向き(姿勢)は、なめらかに連続します。

true ：を設定した場合、目的の方向を、もう一つの回転方法によるアプローチを計算し、
       ２軸の回転角の合計がより少ない方を選んで旋回します。
       姿勢は連続ぜず、飛ぶ場合があります。

[捕捉]
基本的に TURN_OPTIMIZE=true の方が、より綺麗な旋回を行います。
但し、進行方向に伴ってキャラの向き(姿勢)を制御している場合、TURN_OPTIMIZE=true では、
シンバルロック付近で急にクルッと１８０度の姿勢回転が発生するおそれがあります。
逆にキャラの向き(姿勢)が進行方向と独立している場合は、TURN_OPTIMIZE=true が良いです。
進行方向に伴ってキャラの向き(姿勢)を制御したい場合 TURN_OPTIMIZE=false の方が
姿勢が連続しているためベターと思います。



＜その他＞
これらのスプライン曲線座標は、絶対座標として移動に使用するキャラも居るし、
始点をキャラの現時点の座標とおき、相対座標として移動するキャラも居る、
それらの設定は各キャラのプログラムに組み込まれており、ココでの指定はできません。



2010/12/15 by Gecchi
2011/08/09 [SPLINE] [MAGNIFICATION] 追加による改定
2011/08/22 ２ファイルに分割

