↑上や←左のタブでコンテンツを選べます
[前のスレッド] [次のスレッド] [新規投稿] [記事一覧に]

[一つ前] [一つ次] [前の未読] [次の未読]
L3Mファイルからの移動距離算出
[パスワード:     ]
#6924   2007/06/10(日) 10:05   投稿者: ALPHA CORE (ホームページ)

Lシリーズをいつも利用させていただいているALPHA COREです。

現在、個人的にL3Mファイルのモーション作成補助ツールを製作しておりまして、以下のURLを参考にしながらL3Mのファイル構造の解析は全てできるようになりました。

http://doga.jp/tkbbs/tkbbs.cgi?bbs=doga&action=show&number=4673#n4673

解析したL3Mのデータを使って実際にモーションを構築する上で、どうしてもわからない部分が出て来てしまったので、質問させて下さい。

移動位置データの算出手順(予想)

.戰献У粟廛如璽燭らベジェ曲線で物体の移動軌跡を作る。
▲ーフレームの位置要素から、各キーフレームで物体がその曲線上のどの位置を通過するかを決定する。
3謄ーフレームに設定された位置要素から、キーフレーム間の各フレームの物体の通過位置を算出する。

ここでの部分で速さや加速度のデータから、キーフレーム間の各フレームの移動距離を算出する方法が分からずに躓いています。

位置要素の構造が以下のようになっている事から、
各キーフレーム間のフレーム番号と速度値等から各キーフレーム間のフレームの移動距離を算出するものと予想していますが、もし不都合でなければ、内部で使用している移動距離を算出する式を教えていただくことは出来ませんでしょうか^^;
よろしくお願いいたします。

<フレーム> <距離> -3 <値1> <値2> 値1から値2へ速度変化?
<フレーム> <距離> -2 <値> 速度指定?
<フレーム> <距離> -1 速度指定なし
<フレーム> <距離> 0 <速度> 速度指定あり
<フレーム> <距離> 1 <速度1> <速度2> 速度1から速度2へ変化

オプション値-3と1、-2と0の違いがいま一つわかりません^^;

[この記事に返信]
この記事は2回修正されています。
        
[一つ前] [一つ次] [前の未読] [次の未読]
Re: L3Mファイルからの移動距離算出
[パスワード:     ]
#6926   2007/06/10(日) 14:09   投稿者: たかつ(ドーガ)   参照記事: 6924

> .戰献У粟廛如璽燭らベジェ曲線で物体の移動軌跡を作る。
 この段階で、ベジェ曲線を64線からなる折れ線に変換しています。

方法は
「ベジェ曲線」を「二つのベジェ曲線」に分割する方法
http://musashi.or.tv/fontguide_doc3.htm
を、6回適用し、1つの曲線片を64のベジェ曲線に分割したあと、
制御点を無視して通過点だけを通る折れ線にする

もしくは、
ベジェの計算式 (点p1,p2,p3,p4 と割合t から座標pを求める式)
p =  (1-t)×(1-t)×(1-t) p1
  + 3× t ×(1-t)×(1-t) p2
  + 3× t ×  t ×(1-t) p3
  +   t ×  t ×  t p4

で、pを0.015625(1/64)刻みで0から1まで変えて出てきた座標

で求まります。(どちらも結果は同じです)

> 3謄ーフレームに設定された位置要素から、キーフレーム間の各フレームの物体の通過位置を算出する。
この段階では、(2)で求めた距離から、折れ線上の位置を求めます
(折れ線のそれぞれの線分の長さを累積して算出

一番複雑なのが

> ▲ーフレームの位置要素から、各キーフレームで物体がその曲線上のどの位置を通過するかを決定する。

です。

これも(時刻t, 距離d)の二次元上でのベジェ関数になっています。
ただし、時刻の方は一定間隔になるように制御点を配置。

例えば、時刻10に距離1000、時刻40に距離4000だとしたら、
ベジェ制御点1(10,1000)
ベジェ制御点2(20,<始点速度から求まる距離座標値>)
ベジェ制御点3(30,<終点速度から求まる距離座標値>)
ベジェ制御点4(40,4000)
という4点を通るベジェ曲線で算出します。
これを上記ベジェの計算式に入れて算出します。(時刻20の座標は、t=0.33333 を代入)

で、制御点2・3の距離座標の求め方ですが、L3Mファイル中の記述では
<速度> は一定速度で移動する時に「1.0」になります。

> <フレーム> <距離> -1 速度指定なし
> <フレーム> <距離> 0 <速度> 速度指定あり
> <フレーム> <距離> 1 <速度1> <速度2> 速度1から速度2へ変化
-1 の時は、始点側・終点側両方とも速度「1.0」
0 の時は、始点側・終点側両方とも同じ<速度>になります。
 また、<速度>が -1 の時は、「速度指定無し」となります。
1 の時は、<その時刻に来た時の速度> <その時刻から先に進む時の速度>です。

・始点・終点両方の速度が指定されていない場合
この場合、一定速度になるようにします。距離3000を時間30で移動しますので、
10フレームで1000移動しますから、
(10,1000)(20,2000)(30,3000)(40,4000)
の4点。

・始点・終点、両方の速度が指定されている場合
ベジェ制御点1と始点速度から、ベジェ制御点2が求まります。
例えば、上述の例で、始点速度が1.5の場合は、10フレームで1500移動しますから、
ベジェ制御点2の距離は1000+1500=2500となります。

同様に、ベジェ制御点4と終点速度から、ベジェ制御点3が求まります。
終点速度0.3の場合は、10フレームで300移動しますから、
ベジェ制御点3の距離は4000-300=3700になります。
まとめると、ベジェ制御点は
(10,1000)(20,2500)(30,3700)(40,4000)
になります。

・始点の速度だけが指定されている場合
ベジェ制御点2は、両方指定されている場合と同様に求めます。
ベジェ制御点3は、ベジェ制御点2から全体の平均の速さで移動した先になります。
例えば、始点速度値1.5で終点速度指定が無い場合、
制御点1(10,1000)→制御点2(20,2500)→制御点3(30,3500)→制御点4(40,4000)になります。(3500=2500+1000)

・終点の速度だけが指定されている場合
計算は始点だけの場合と同様で、終点から始点へ逆方向に求めていきます。
例えば、終点速度値が0.3で始点速度指定が無い場合、
制御点4(40,4000)→制御点3(30,3700)→制御点2(20,2700)→制御点1(10,1000)になります。(2700=3700-1000)


> <フレーム> <距離> -3 <値1> <値2> 値1から値2へ速度変化?
> <フレーム> <距離> -2 <値> 速度指定?
このモードは、DOGA-L3 2007版からの新機能です。
記述の<速度値>は、さらに前の制御点や、後ろの制御点との平均速度との平均が基準になります。
(速度調整グラフで、速度側の制御点を調節した場合、こちらのモードになります)

(10,1000)、(40,4000)の次に、(70,10000)があった場合、
(10,1000)→(40,4000): 平均の速さ100
(40,4000)→(70,10000): 平均の速さ200
ですので、このモードでの終点速度値「1.0」は、速さ150に対応します。

旧規格の記述では、
> 40 4000 1 0.8 0.8
という表記があった場合、
時刻10→時刻40については、終点速さ80で処理し
時刻40→時刻70については、始点速さ160で処理しますから、
時刻40で速さが急に変わってしまいます。

新方式の記述で
> 40 4000 -3 0.8 0.8
とある場合、時刻10→時刻40の終点も、時刻40→時刻70の始点も、速さ120で処理します。

つまり、このモードでは、速度指定値が同じなら、制御点の前後で速度が変わらないようになります。


[この記事に返信]
                
[一つ前] [一つ次] [前の未読] [次の未読]
Re: L3Mファイルからの移動距離算出
[パスワード:     ]
#6927   2007/06/10(日) 22:21   投稿者: ALPHA CORE (ホームページ)   参照記事: 6926

>  この段階で、ベジェ曲線を64線からなる折れ線に変換しています。

今まで律儀に計算式から算出していましたが、
確かに中間点で直線近似するほうが単純な計算で済みそうですね。
とても参考になります。

> > ▲ーフレームの位置要素から、各キーフレームで物体がその曲線上のどの位置を通過するかを決定する。
> これも(時刻t, 距離d)の二次元上でのベジェ関数になっています。

位置算出もベジェだったんですか。
言われてみると、あの速度調整インターフェースも納得です。

ありがとうございます。
早速試して見ようと思います。

[この記事に返信]
このページのURLは http://doga.jp/tkbbs/tkbbs.cgi?bbs=doga&number=6924&showtree=1 です
[前のスレッド] [次のスレッド] [新規投稿] [記事一覧に]