テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル


log

2011.06.14 Lscript:選択アイテムのセンター位置にNULLを作成

リグを作成する場合はNULLアイテムを多用することになると思うのですが、毎回
NULLアイテムをリネームして位置を設定するのは面倒です。IKの場合だと
1ボタンでIKを設定するスクリプトがいくつかあるので、それを使えばいいですが、
他のコンストレイントを使う場合も自動で作成したいですよね。ということで、選択
アイテムのセンター位置にNULLを作成するというスクリプトを用意してみました。

// 選択オブジェクト群のシーン開始時のルート位置に
// NULLオブジェクトを作成するスクリプト。
@warnings
@script generic
@name AddNullAtSelectObjectCenter
generic
{
// シーンの開始フレーム番号を取得
var StartFrame = Scene().previewstart;
// シーンのFPSを取得
var Fps = Scene().fps;
// cf.以下のforループ内で使用するgetWorldPosition()は
// 正確にはキーフレーム情報ではなく現在のビュー上で
// 設定したワールド座標値を取得するので、一旦選択フレームを
// 切り替えてビュー上で設定した変更値をリセットさせる。
GoToFrame( Scene().currenttime * Fps );
// 選択アイテム群を取得
SelectArray = Scene().getSelect();
// 選択アイテムが存在しない場合
if( SelectArray == nil ) {
AddNull( "Null" );
return;
}
// 選択アイテム群のルート位置にNULLオブジェクトを作成
for( i=1; i<=size(SelectArray); i++ ) {
// NULLオブジェクトを新しく作成
AddNull( SelectArray[i].name + "_Null" );
// シーンの開始フレーム時のワールド座標値を取得
var Pos = SelectArray[i].getWorldPosition( StartFrame / Fps );
// NULLオブジェクトの座標値を変更
// cf.Position()は選択アイテムに対して行う関数だがAddNull()直後は
// 新しく作成したNULLのみが選択されるので、ここではそれを利用。
Position( Pos.x, Pos.y, Pos.z );
// NULLオブジェクトの回転値も変更する場合
// var Rotate = SelectArray[i].getWorldRotation( StartFrame / Fps );
// Rotation( Rotate.x, Rotate.y, Rotate.z );
// Position(),Rotation(),Scaling()で設定した座標値を
// 指定時刻のキーフレームとして作成
CreateKey(0);
}
}

実は似たようなスクリプトが他にもあるんですけどね。
そちらは同一名のNULLが存在した場合は位置を更新できなかったりするので
こちらの方法をお勧めしたいなと思います。
また、NULLアイテムの名前を変えたい場合はAddNull()部分を変えるなりして
各自カスタマイズしてみて下さい。

2011.06.01 Lscript:スケルゴン変換と中心点回転記録

今回は、選択メッシュのスケルゴンをボーンに変換して中心点回転記録を行う
スクリプトをのせてみようかと思います。この処理はLWでアニメーションを作成する
ならば、おそらく必須、、のはずです。いつもならば、コンパイルしてパネルコント
ロールでオプションをつけるところですが、1ボタンでサクッと変換したいと思うはず
なので、コンパイルせずにいっそソースごと載せてみます。

内部でDS_RecordPivotRotというプラグインを使用していますが、LW9以前の
ユーザであればその部分を書き換えて下さい。後は必要ない部分を削除したりして
各自で調節すると幸せになれるかもしれません笑。

@warnings
@script generic
@name ConvertSkelgonAndRecPivRot
generic {
// 選択アイテム群の先頭アイテムを選択
var SelectItem = Scene().firstSelect();
// 選択アイテムがボーンの場合は親のメッシュを検索
while( SelectItem.isBone() ) {
SelectItem = SelectItem.parent;
}
// 選択アイテムがメッシュでない場合は終了
if( SelectItem.isMesh() == 0 ) return;
// ボーン削除時の警告ダイアログを表示しないように設定
AutoConfirm(1);
// ClearAllBones()は最後に選択したメッシュの
// ボーン群を削除するので、一旦最初に選択した
// アイテムのみを選択状態に設定
SelectItem(SelectItem.id);
// 選択アイテムが既にボーンを保持している場合は削除
if( SelectItem.bone() ) ClearAllBones();
// 再び警告ダイアログを表示するように設定
AutoConfirm(0);
// 選択アイテムのスケルゴンをボーンに変換
SkelegonsToBones();
// 選択アイテムの先頭ボーンを取得
SelectBone = SelectItem.bone();
// ボーンごとに中心点回転記録を設定
while( SelectBone ){
// ボーンを選択
SelectItem(SelectBone.id);
// 中心点回転記録を行う
CommandInput("Generic_DS_RecordPivotRot");
// バージョンがLW9以前の場合
// RecordPivotRotation();
// 中心点回転記録を行っても現在のキーフレーム値
// は保持されているので0リセット
Reset();
CreateKey(Scene().currenttime);
// ウェイトマップのみでスキニングするように設定
BoneWeightMapOnly();
BoneNormalization();
BoneStrengthMultiply();
// 次のボーンを取得
SelectBone = SelectBone.next();
}
// 選択アイテムを元に戻す
SelectItem(SelectItem.id);
// 選択アイテムをロック
ItemLock(1);
}

スクリプト内のコメントが多すぎないか、、と思われそうですが。まあ、自分は忘れっぽい
性格なのでいつもこのくらいコメントを書いてコードを水増ししています苦笑;
スクリプトをメニューに追加できないぞ?という方はコメント部分を消すなり、文字コードを
EUCに変換するなりして下さい。あしからず。

2011.05.26 Lscript:モーションリターゲットスクリプト

ファイル 348-1.jpg

自作のモーションリターゲットスクリプトでワールド-ローカル座標系の変換がうまく
いかなってここ数日四苦八苦してましたが。。とりあえず固定回転記録を使って
初期回転値を0にしてからリターゲットすれば、ボーンの構造が違っていてもうまく
リターゲットできる様子なので、ワールド-ローカル座標系変換はとりあえず一旦
保留にしようと思います。何だかあと少しでできそう、、な気がするのですが。
出来るといった確証は無いですからね。

ここまででキャラクター間のモーションリターゲットの画像を用意していなかったので
一枚用意してみました。標準体型からちびキャラへのリターゲットの場合に足が
少し地面にめり込んだりといった不都合がでたので少し修正が必要ですが、
ひとつひとつキーをコピー&ペーストするといった手間がなくなったのが何より嬉しい!

ただ、今のところポーズの左右反転コピーは未だにコピー&ペーストといったチマチマ
した手法をとっているので…苦笑。後はこの辺だけでも自動化したいところです。

2011.05.24 LScript:MultiGameMove

LW10のゲームデバイスが自身の環境で利用できなかったので、代わりに
キーボードを使ってアイテムを動かすLScriptを作ってみました。

UP/DOWN/LEFT/RIGHTキーで選択アイテムを移動させます。ただ単に移動させる
だけなので、指定アイテムを地面として高さを変えたりとかはやってません。C++では
以前やったことですが、LScriptでそれをやるととてもしんどそうなので保留です苦笑;

何気なしに作ってみましたが、サクサクっとカメラを動かしたい場合に使えるかな。

http://green.ribbon.to/~takehouse/archive/MultiGameMove.zip

追記:
Stickyモディファイアを利用して、指定アイテムの高さを取得するサンプルシーンを
追加で入れておきました。それとVPRだとキー入力が続いている間は以前の
位置・フレーム時の画面を描画し、キー入力が終わったらその時点での新しい
位置・フレーム時の画面を描画、という感じになりますね。ちょっと残念…。

2011.05.18 Lscript:モーションリターゲットスクリプト作成中

色々とスクリプトが出来てきたので、今回は練習で作ったスクリプトたちを
いくつかご紹介してみようと思います。

・MultiSetValue
 座標値、UV値、頂点カラー値、ウェイト値、法線値の数値設定。
・MultiScale
 スケール・法線方向スケール・Inflate・Increase機能をまとめたスクリプト。
・MultiSmooth
 スムース・Flatten機能をまとめたスクリプト。
・MultiMirror
 ウェイトマップ名の左右反転を考慮したミラー。
・MultiMerge
 ウェルド・マージ・不正ポリゴン修復機能をまとめたスクリプト。

こんなところです。ちなみに全てのスクリプト名に"Multi"という名前がついているのは
スクリプトの頭文字が同じだとファイル名でソートしたときに並んで自分のスクリプトが
表示されることを考えてです。スクリプトフォルダでソートできたらいいんですが、
それができないですからね。。
それとサイトでは2つしか公開してませんが、下の3つは完全に自分用の組み方
なので公開は特に考えてません苦笑。

それと現在はモーションリターゲットのスクリプトを作るためにレイアウトのスクリプトを
勉強中です。リターゲットに必要なアイテムのプロパティは大方取得できたので、
後は座標系のローカル-ワールド変換くらいです。とりあえず、リターゲット機能が
一番実装したかった機能なので割とすんなり組めそうでほっとひと安心です。
こんなにすんなりできるのであれば、もっと早めにやっておくんでしたね;

2011.05.11 Lscript:MultiSetValue

ファイル 344-1.jpg

最近Lscriptを触り始めていたのですが、ようやくLscriptでそれっぽいものを
ひとつ作ってみました。その名もMultiSetValueです!

LW標準のSetValueの機能追加版です。実は似たような他のプラグインがいくつも
あるのですが、それらの機能がまとまったらいいのになあと以前から考えていたので
今回は自分が思う理想のSetValueスクリプトを手がけてみることにしました。

とりあえず、まだ実装していない機能がいくつかあるのですが、使ってみたいという方が
いらっしゃるかもしれないので配布してみようと思います。
詳しい説明はZipアーカイブの中に入れておきましたのでそちらを参照してください。

http://green.ribbon.to/~takehouse/archive/MultiSetValue.zip

というか使いたいLWユーザさん、いるかなあ苦笑。

2010.02.09 Lscript:作りたいスクリプトメモ

とりあえず、Lscriptを使ってモーションリターゲットのスクリプトを
組めないかなと思ったので、オイラー角について色々調べてみました。

色々調べたり、試したりしているうちにアルゴリズムらしきものが
みえてきたので少しメモしておきます。

①リターゲット元とリターゲット先の任意のボーンに対し、
 そのボーンからルートのボーンまでのH,P,Bを取得し、
 それらを元に任意のボーンの、ワールド座標系からみた
 各回転軸の基底ベクトルを取得
②リターゲット先の各回転軸の基底ベクトルとリターゲット元の
 各回転軸の基底ベクトルの差を取得し、リターゲット先の
 H,P,B回転方向に差分を分解
③リターゲット先の回転キーには"リターゲット元の回転角度+差分"を代入

これでいい…のかな。
最近になってようやく3D数学を基礎から勉強してるのですが、
ようやく行列の入門に入ったばかりで、オイラー角もクォータニオンも
ほとんどまだ詳しくないので、実際には何ともいえない状況です。。
それと個人的にはLWでDivideやConnectをする際、アイランドが異なる
UVは自動的にヒールされてしまうというよく分からない現象が起こるので、
ヒールせずにポリゴン分割するスクリプトも出来れば作ってみたい。

といってもまだLscriptについてほとんど何も分からない現状なので、
まずはLscriptの基礎から覚えていこうかなと思います。

  • prev
  • next