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


log

2011.06.15 LW:大域光シェーダ改良

ファイル 358-1.jpgファイル 358-2.jpg

以前LWのノードの勉強用に作った大域光シェーダを久しぶりに改良してみました。

改良点はambientノードをambientⅡノードに変更したりmixerノードを極力少数の
Gradientノードに置き換えるなどして高速化させたり、後はSSS機能を追加させたり、
ノードでフォグを表現していた部分をLW標準のフォグを使用するようにしてみました。

ちなみに前のノードを使用した画像は現在この日誌のヘッダ画像としてそのまま
使用しているのですぐに比較できますね笑。今回雲計算をしなかったのですが、
せっかくなので前回のシェーダのレンダリング時間もとってみると以下のようになりました。

・今回のシェーダ :1分30秒
・前回のシェーダ :4分30秒
・前回のシェーダ(ShadowシェーダOFF) :3分10秒
・前回のシェーダ(ShadowシェーダOFF,AOをAOⅡに変更) :2分00秒

このような結果となりました。前回のシェーダは何故かDP-KitプラグインのShadow
ノードを利用していたのですが;これはAOシェーダと同じくらい重いみたいですね。
そしてAOシェーダは重いですがAOⅡシェーダに変更すれば処理は軽くなります。
他にもAO系のシェーダプラグインはいくつかありますが、自分は互換性を考慮
したいタイプなので極力標準のノードを使うようにしています。…変ですね苦笑。

他のオブジェクトを参照するシェーダはGI計算時間がものすごく延びることは前から
薄々気づいてましたが、今回の結果ではっきりと分かったので良かったでした。
それでもノードが増えるだけで30秒の違いがでています。前回のシェーダの
ノード数は今回の約2倍程度あるので2倍で30秒程度ならとも思えますが、、
極力ノード以外の方法で実装できるならそれに越したことは無い感じです。

せっかくなのでノードの画像もアップしてみます(クリックで拡大)。これ位のノード数で
あれば、「ノードの上部分がSSS処理で下部分がambient処理だな」といった
感じで、一目で大体の処理が分かる感じですね。以前のノードだと久しぶりに見ると、
「な、、なんじゃこりゃ」状態です。訳が分かりません笑。

XSIのようにノードをコンパウンド化したり、コメントを付加できたらいいのになあ。

追記:
Node Image Filterで彩度差が大きい部分にブラーをかけるフィルタを作ってみた
ので画像を差し替えてみました。微妙な効果なので分かりにくい感じですが、画像
左下や右下の明るい部分の輪郭周りがオレンジ色に滲んでいる部分等がそうです。
本当はもう少し彩度が高くなってほしいんですけどね。ブラーで色がくすむので
効果が薄れてしまいました。。後で修正が必要そうです。

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.12 LW:リグとHVとGIの話

ファイル 356-1.jpg

ちょっとLWレイアウトでリグを組んでみました。とりあえず至ってシンプルな実装に
してみましたが、小難しい実装は苦手なので自分にはこれくらいがちょうどいい感じです。

説明を加えますと。足部分はIK+極ベクトル、腕部分は上腕と前腕を向きコンスト
レイントNULLで制御、胴体部分は1つのコントローラでまとめて回転制御、目部分
は向きコンストレイントNULLで制御といった感じになっています。最初は腕部分も
足と同様にIK+極ベクトルにしていたのですが、極ベクトルで腕の捻りを制御するのが
難しい上に極ベクトルのコントローラがビュー上であっちこっちに飛び回って自分には
扱いきれない感じだったので止めにしました;

それと紹介はしていませんが、Lscriptで自作のアイテムピッカーを作成しているので
人体のリグはピッカーパネルを通してサクッと選択できるようになりました。他の3Dソフト
でもそうですが、ビュー上で選択しようとすると他のアイテムを間違えて選択したりする
ことが結構多いんですよね。それに指をまとめて選択したい場合はカスタムオブジェクト
作らないといけないし。
本当にアイテムピッカー様々です、、自分で作っておいて何ですが笑。

さて、打って変わってHyperVoxelsとGIの関係について気がついたことがあったので
ちょっとメモしようかと思います。以前紹介した、頑張ればそこそこ表現できる子Hyper
Voxelsさんですが、HyperVoxelsとGIを併用するとボリュームからのGIレイが
異常に弱いんですよね。

ここからは推測の話になりますが。HVのパーティクルはImage FilterにRGBA以外
描き出せなかったりグローパラメータが存在しないことを考えると、どうやらLW標準
レンダリング以外の別のバッファに一旦描画した後LWのレンダリングバッファに合成
していて、最終的にRGBAパラメータのみが渡されているのではないかなと思いました。

通常のGIならルミナンス等のパラメータをGIレイの強さに設定するのですが、色情報
しかもたないのでGIレイが弱くなる、とこういうことなのだと思います。なので
これを解決するためにはGIの強さを200%位にするとちょうどいい感じになりました。
ただ、今までGIの強さを100%で作成したシーンは明るくなりすぎるのでルミナンス
を下げないといけません。…この辺の行き当たりばったり感がなんともLWらしいね笑。

2011.06.12 LW:標準でモーションリターゲット出来たというオチ

以前、LScriptでワールド座標系でモーションリターゲットをやろうとして、結局
ワールド-ローカル変換が上手くいかずに終わっていましたが。。DStormの
Output World Coordsというプラグインを使えばワールド座標系でモーション
リターゲットできることが分かりました!!このプラグイン、IKをベイクするだけの
プラグインかと思って放置していましたが…何だ、唯の神プラグインでしたか笑。
というかIK焼付けはBakeIKtoKeyが既にあるだろ、馬鹿タレ自分。

それと、このプラグインは自身のオブジェクトにIKベイクする場合はバッチ処理を
行えるようになっているみたいですが、リターゲットのように異なるオブジェクトでは
1つずつスクリプト起動して行う必要があるみたいですね。。同一名称の
オブジェクトを対象にバッチ処理できるようにすれば完璧なのにな。

2011.06.10 LW:モコモコした雲

ファイル 354-1.jpg

HyperVoxelsで爆発のエフェクトを作ったついでに、入道雲のようなモコモコした
雲にも挑戦してみました。爆発で散々HyperVoxelsを弄り倒したばかりだったので
結構すんなりと出来上がりました。

まだ少し嘘っぽい感じもしますが、これまでの自分が作ってきたヘタクソな雲に
比べると随分とマシになったので良しとしましょう笑。

2011.06.10 LW:HyperVoxelsな爆発

ファイル 353-1.jpg

今回はHyperVoxelsを使って爆発を表現してみました。前にもHyperVoxelsは
ちらほら使ってはいたものの、自作のプログラムには利用しずらかったため、ただの
お試し程度にしか利用していませんでしたが。Lscriptを勉強しているうちに、Lscript
からパーティクルの情報にアクセスできることが分かったので、ひょっとしたらLWで
パーティクルを作成してそっくりそのまま自作プログラムに移せるかな、ということを
期待していたりします。

ちなみに、画像の右はサーフェイス、左はボリュームによるレンダリングです。
HyperVoxelsはボリュームレンダリングが売りなのですが、個人的にはボリュームより
サーフェイスの方が使いやすい印象です。ボリュームだと半透明や屈折率の
オプションが無かったり、プロシージャルのタイプも少なくおまけに重ねがけが
できないんですよね。。おまけにGIを使用すると何故か半端じゃないくらい重くなる
というおまけがつきます苦笑;

結論:HyperVoxelsだけでもリアルなエフェクト表現ができなくもない…ですが、
かなりしんどいです笑。

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.31 LW:石膏シェーダ

ファイル 351-1.jpg

とうとう念願のフィギュア化に成功しました!……すみません、嘘です苦笑;

ちょいと石膏やらフィギュアっぽいシェーダに挑戦したかったので試してみましたが、
割とそれっぽくなった、かな。けど上手い人と比べるとまだまだ不自然だったりです。
こればっかりは観察眼を養うなり、模倣するなりして少しずつ磨いていくしかないか。

2011.05.31 LW:久しぶりなモーション


剣を持たせてポーズをつけてみました。ただ部分的に帯の部分とか貫通してるところが
あるので、後からボーン追加して少し修正を加える予定です。

よくよく見ると、スーファミの画面だと武器を右手左手持ち替えたりしてますが、
この部分をどうしたらいいものか現在考え中です。。2Dから3Dへの変換だと
色んな所でのっぴきならないような部分がでてきて、その当たりをどう緩和させるか
じっくり検証しないといけないから、これが意外と大変である。

2011.05.29 お気に入り:MeshMixer株、急上昇?

MeshMixerはメッシュ合成ソフトっていう認識だったのですが、いつのまにやら
Sculptrisで用いられているアダプティブサブディビジョンでのスカルプトができる
ようになってるみたいですね。ということで、さっそくインストールして使ってみましたが
…うーん、なんだか重いです。。Sculptrisよりも機能が豊富でいいソフトになりそう
だと期待していたのですが、重いというのはスカルプト系ソフトにとって一番ネックな
部分ですからね。

逆に言えば、Sculptrisは何かしらの高速化処理をしているということなのかな。
とりあえず、Sculptrisが最近は停滞しているのでMeshMixerにも少なからず
期待したいなと思います。

というよりボクセルのプログラムが組めるようになったので、スカルプトソフトには
自分もいつか挑戦したいですね。まあ、予定は未定ですが苦笑;