« ユーザースクリプトのフレームワーク | トップページ | C4DスクリプトのSendModelingCommand()でスプライン »

スクリプトでアニメーショントラック

いまだ、試みてないアニメーショントラックの実験。
挫折に終わるか、得るものが有るのか?

さて、オブジェクトを適当に追加し、最初のフレームと最後のフレームにキーフレームを作りました。ポジションと回転です。

Timeline

/*
オブジェクトのアニメーショントラックの実験
08.06.08
*/


var trc = op->GetFirstTrack();//オブジェクトのBaseTrackの取得
var sequ = trc->GetFirstSequence();//トラックのBaseSequenceを取得
var ky = sequ->GetFirstKey();//シーケンスのBaseKeyを取得

println("BaseTrack : " , trc->GetName());
println("BaseSequence : " , sequ->GetName());
println("BaseKey : " , ky->GetName());

結果は…

BaseTrack : 位置 . X
BaseSequence : 位置 . X
BaseKey : 位置 . X

この状態だとBaseTrakは、位置 . X/位置 . Y…という具合だね。多分BaseSequenceはタイムライン上の帯で、BaseKeyがキーフレームだろう。SDK9.6には書いていない。ただ気になるのが、BaseTrack/BaseSequence/BaseKeyの3つとも「C.O.F.F.E.E.によって新しく割り当てる方法がまったく無い。」と載っている。うぅぅ、BaseList2D->InsertTrack()が有るって事は新しいトラックを取り付けられるわけだし…。new(BaseSequence)で空のシーケンスを作ってBaseList2D->InsertTrack()でオブジェクトに付ければ良いいんじゃないのか?出来そうな気がするが…。でも空のシーケンスが、どの項目(ポジションなのか回転なのか)のシーケンスなのかを対応づけはどうするんだ?名前で対応づけするのか?実験すれば良いか…。

/*
シーケンスをオブジェクトにインサート
08.06.08
*/


var sequ = new(BaseSequence);//シーケンスの作成。
op->InsertSequence(sequ);//シーケンスをインサート。

これで実行。…ん?エラーが出た。var sequ = new(Base...で「Member not found」?
タイプミスではないなぁ。メンバ関数が無いって…。new()でクラスはどんなものでも作れるんじゃないの?…「C.O.F.F.E.E.によって新しく割り当てる方法がまったく無い。」てこの事かぁ?

あぁ、そうかぁBaseTrack/BaseSequence/BaseKeyにコンストラクタが無いみたいね。他のBaseDocument/BaseObject…その他クラスには有るけど、BaseTrack等には無いですね。…うぅん…クラスの知識がまだまだ甘かったようだ。えっ、じゃあBaseList2DクラスのInsertTrack()メンバ関数って何をインサートするんだ?…挫折しそうだぁ。
じゃぁ「新規でシーケンス作って、キーフレーム操作して、新しい動きを付ける」なんて事は出来ず、既にオブジェクトに付いてるトラックなり、シーケンスなり、キーフレームなりを変更することしか出来ないのかぁ…。キーフレームも追加したりすることが出来ないって事はキーフレームを移動させるだけしか出来ないって事かぁ?ん?BaseSequenseにはInsertKey()メンバ関数が有るって事は…。
えっ、BaseKey->Clone()で複製して新しいBaseKey作ってBaseKey->SetTime()で時間ずらしてBaseSequence->InsertKey()でインサートするの?ちょっと納得出来ないけどやってみよう。

所で、BaseTrack->GetFirstSequence()が有るけど、トラックに複数のシーケンスを割り振り出来るのかぁ?

/*
BaseKeyの実験 と 他の確認事
08.06.08
*/


var trc = op->GetFirstTrack();
println(trc->GetNext()->GetName());//試しに次のトラックの名前を表示

var sequ = trc->GetFirstSequence();
println(sequ->GetNext());//試しに次のシーケンス

var ky0 = sequ->GetFirstKey();//1個目の取得
var ky1 = ky0->GetClone();//キーフレームの複製
var tm0 = ky0->GetTime();//キーフレームの時間
println(tm0->GetSecond());//ky0の時間
var tm1 = ky1->GetTime();//複製したキーフレームの時間
tm0->SetSecond(0.5);//0.5秒に変更
ky0->SetTime(tm0);//ky0に0.5秒を適用
tm1->SetSecond(2.0);//2.0秒に変更
ky1->SetTime(tm1);//ky1を2.0秒へ
sequ->InsertKey(ky1);//ky1シーケンスにインサート

コンソールの結果は…

位置 . Y
nil
0.000000

タイムラインの結果は…

Timeline01

思った通りの結果だね。少しは見えてきた。コンソールの結果も納得だぁ。
あぁそうか、複数のシーケンスって多分こういう事だね。

Timeline02

こんな風に思ったぁ。我ながら恥ずかしいねぇ…。

Timeline03

恥ずかしいけど記事はこのまま。
試しに切れてるシーケンスのテスト。

/*
複数のシーケンスの実験
08.06.08
*/


var sequ = op->GetFirstTrack()->GetFirstSequence()->GetNext();
println(sequ);//これがnil出なければ複数のシーケンスに納得

それでは実行。コンソールには…

[Object-22647944]

nilじゃ無かったので、納得だね。
ただしトラック等は、新規で追加は出来ない事には変わりが無いね。

|

« ユーザースクリプトのフレームワーク | トップページ | C4DスクリプトのSendModelingCommand()でスプライン »

コメント

この記事へのコメントは終了しました。