XSIのプラグインでダイアログを使用する3

今回はダイアログに数値入力、カラー選択、
ファイル、フォルダ選択を追加してみたいと思います。


まずは数値入力です。
前の2件の記事を見ていただければ分かると思いますが、
CustomProperty::AddParameter()とPPGLayout::AddItem()を使用します。

    cpset.AddParameter( L"test_number_int", CValue::siInt4, siPersistable, L"", L"", 50, param );
    item = layout.AddItem(
        L"test_number_int",
        L"Number Int",
        siControlNumber
    );

これを実行すると以下のようになります。
plugin16
デフォルトでは0~100までの数値をスライダーで調整できます。
直接入力ならばパラメータの型の最大値まで扱うことが出来ます。(siInt2なら-32768~32767まで)
AddParameterの第2引数にsiFloat、siDoubleなどを指定すれば小数点まで調整することが出来ます。

スライダーで0~100の範囲外の数値を扱うには、
AddParameterのオーバーロードされた引数の多い方を使用します。

    cpset.AddParameter( L"test_number_int", CValue::siInt4, siPersistable, L"", L"", 0, -500, 500, -300, 300, param );
    item = layout.AddItem(
        L"test_number_int",
        L"Number Int",
        siControlNumber
    );

この例では、スライダーで-300~300の間、直接入力で-500~500の数値を扱うことが出来ます。
9,10番目の引数がスライダーの調整範囲、7,8番目の引数が直接入力の範囲制限になります。
ちなみに6番目の引数がデフォルト値です。


次にカラー選択です。
カラー選択を追加するにはRGBならパラメータを3つ、RGBAならパラメータを4つ、
あらかじめ追加しておかなくてはなりません。
コードは以下のようになります。

    // siControlRGBにはパラメータが3つ必要
    cpset.AddParameter( L"test_rgb_r", CValue::siDouble, siPersistable, L"", L"", 0.0, param );
    cpset.AddParameter( L"test_rgb_g", CValue::siDouble, siPersistable, L"", L"", 0.0, param );
    cpset.AddParameter( L"test_rgb_b", CValue::siDouble, siPersistable, L"", L"", 0.0, param );
    item = layout.AddItem(
        L"test_rgb_r",
        L"RGB",
        siControlRGB
    );

    // siControlRGBAにはパラメータが4つ必要
    cpset.AddParameter( L"test_rgba_r", CValue::siDouble, siPersistable, L"", L"", 0.0, param );
    cpset.AddParameter( L"test_rgba_g", CValue::siDouble, siPersistable, L"", L"", 0.0, param );
    cpset.AddParameter( L"test_rgba_b", CValue::siDouble, siPersistable, L"", L"", 0.0, param );
    cpset.AddParameter( L"test_rgba_a", CValue::siDouble, siPersistable, L"", L"", 0.0, param );
    item = layout.AddItem(
        L"test_rgba_r",
        L"RGBA",
        siControlRGBA
    );

これを実行すると以下のようになります。
plugin17


次にファイル選択です。
ファイルの選択のコードは以下のようになります。

    // ファイルの選択
    cpset.AddParameter( L"test_path", CValue::siString, siPersistable, L"", L"", L"", param );
    item = layout.AddItem(
        L"test_path",
        L"File Path",
        siControlFilePath
    );

これを実行すると以下のようになります。
plugin18
plugin19
ファイル選択はデフォルトのままだと、上書きの確認入ります。
読み込みアクセスにしたい場合は、この後に以下のようなコードを追加します。

    item.PutAttribute( siUIOpenFile, true );
    item.PutAttribute( siUIFileMustExist, true );

siUIOpenFileをtrueに設定する事で上書き確認を解除します。
siUIFileMustExistをtrueにすると、ファイルが存在しない場合にはエラーになります。
siUIFileMustExistは特に設定する必要はありませんが、読み込み専用にするなら必要でしょう。
ついでに拡張子でフィルターをかけるコードです。

    CString filter;
    filter += L"Source files (*.cpp *.c *.h)|*.cpp:*.c:*.h|";
    filter += L"Text files (*.txt)|*.txt|";
    filter += L"All Files (*.*)|*.*||";
    item.PutAttribute( siUIFileFilter, filter );

CStringにこのように追加して、siUIFileFilterを設定します。
この辺はWindowsAPIの仕様と同じ様なので、詳しいことはそちらの資料を探してみてください。


最後にフォルダ選択です。
フォルダの選択のコードは以下のようになります。

    // フォルダの選択
    cpset.AddParameter( L"test_folder", CValue::siString, siPersistable, L"", L"", L"", param );
    item = layout.AddItem(
        L"test_folder",
        L"Folder",
        siControlFolder
    );

これを実行すると以下のようになります。
plugin20


ダイアログのアイテムに関しては今回でひとまず終わりします。
まだ他にもファンクションカーブやらグリッドやらありますが、
とりあえず自分で使う予定が無いのと結構面倒っぽいので省きます。
使用することになったら改めてしらべて記事を書こうと思います。

modtoolで竜の頭30 - アニメーション7

間をおいて改めて作業を始めてみてびっくりしました、、

出来ません、、

 

前に漠然と思った形で進めようと思ったのですが、

漠然と思っていただけあって具体的に思い出せませんでした、

しばらく格闘しておりましたが、少しあきらめました。

あきらめた、というのは説明と作業の整合性、とでも言いましょうか、

それに気を取られると、作業が進められなくなります。

どうもまだモーションは板についてはいないようです。

 

前に作ったものをミキサーの使い方をかねて入れ込んでしまおうかとも

思ったのですが、骨の数が違うのでエラーになってしまいました。

無計画の行き当たりばったりです。

 

ちなみにSoftimageXSIのファンクションカーブは、通常モデリングと同じ

「t」によりポイントを選択できます。

「v」で移動なので、マウスの左ボタンで上下自由に移動、

中ボタンで上下(値)のみ、右ボタンで左右(時間)のみの編集が出来ます。

 

前回少し書きました、ファンクションカーブをきれいにする、ですが、

きれいにしたいポイントを選択し、「Shift」+「a」で自動できれいにしてくれます。

全てをきれいにすれば言い訳ではないので、頼りすぎも問題ですが、

 

一応データをあげておきます。

dragon11

始めの方で書いたとおり、説明との整合性が取れていないと思います。

要するに言っていることとやっていることが違うかと思います。

しかし、言っていることにうそは無いと思います。

やっていることにもうそは無いかと思います。

 

今の時点で今回のデータから進むべき方向は、

動きの始まりと終わりに手を入れてもっとよくする、だと思います。

 

なんだかグタグタな記事ですが、今回はこの辺で。

modtoolで竜の頭29 - アニメーション6

前回の更新以来、少し間を開けて改めて作り途中のモーションを見ました。

やはり以前とは違う印象がどうしても出てきてしまいますね。

 

今後の作業はモーションの前半部分を重点的に修正を加えて行きたいと思います。

話は関係ないかもしれませんが、この一連の記事を書くに当たり、前回作ったモーションも見ながら

新たにモーションを付けております。

modtoolを二つ立ち上げております。見比べる時などに便利です。

 

さて、今回見てまず一番最初に気になったところは始めの溜めのポーズがオーバーすぎました。

まずはそこから直してゆきます。

 

意識に置くべきところは、獲物を視線で捉えつつも力を溜めている状態を作る、ということです。

視線でものを捉える時は左右の目が平行に近い方が好ましいと思います。

実際に噛み付く時は視線よりもインパクト重視で、視線をはずしてしまった方が良いと思います。

70フレームのポーズを少し変更しました。ついでに130フレームで首が下に行過ぎているのを直しました。

dragon10

今回はそれだけです。

 

これから噛み付きの動きを早めてゆく、という作業になります。

このモーションにおいては一番楽しいところです。

 

では、今回はこの辺で。

XSIのプラグインでダイアログを使用する2

今回はダイアログにラジオボタン、コンボボックス、アイコンリストと
チェックボックスを追加してみたいと思います。

ダイアログにラジオボタン、コンボボックス、アイコンリストを追加するには
PPGLayout::AddEnumControlを使用します。

ソースコードはこんな感じです。

    //--------------------------------------------------------------
    // ラジオボタン
    //--------------------------------------------------------------
    CValueArray value_radio;
    value_radio.Add( L"radio button 01" ), value_radio.Add( 1L );
    value_radio.Add( L"radio button 02" ), value_radio.Add( 2L );
    value_radio.Add( L"radio button 03" ), value_radio.Add( 3L );

    cpset.AddParameter( L"test_radio", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddEnumControl(
        L"test_radio",
        value_radio,
        L"Radio Button",
        siControlRadio
    );

    //--------------------------------------------------------------
    // コンボボックス
    //--------------------------------------------------------------
    CValueArray value_combo;
    value_combo.Add( L"combo box 01" ), value_combo.Add( 1L );
    value_combo.Add( L"combo box 02" ), value_combo.Add( 2L );
    value_combo.Add( L"combo box 03" ), value_combo.Add( 3L );

    cpset.AddParameter( L"test_combo", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddEnumControl(
        L"test_combo",
        value_combo,
        L"Combo Box",
        siControlCombo
    );

    //--------------------------------------------------------------
    // アイコンリスト
    //--------------------------------------------------------------
    CValueArray value_icon;
    value_icon.Add( path + L"r.bmp" ), value_icon.Add( 1L );
    value_icon.Add( path + L"g.bmp" ), value_icon.Add( 2L );
    value_icon.Add( path + L"b.bmp" ), value_icon.Add( 3L );

    cpset.AddParameter( L"test_icon", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddEnumControl(
        L"test_icon",
        value_icon,
        L"Icon List",
        siControlIconList
    );

これらを使用するにはまずCValueArrayを使用して表示する物と選択されたときの値のセットを作成します。
上記コードの5行目あたりでCValueArray::Add()を2回してますが、
1番目が表示される文字列で、2番目が選択されたときにCustomProperty::GetParameterValue()で取得できる値です。
この2つが基本セットで、これを複数追加することで選択肢を作成します。
CustomProperty::AddParameter()の第6引数はデフォルト値ですが、
これを2番目にCValueArrayに追加した値とあわせておくことで、デフォルトでチェックしておくアイテムを選択できます。
この場合は”radio button 01″がデフォルトでチェックされているはずです。
CustomProperty::AddParameter()の第6引数に”3L”を渡せば、
“radio button 03″がチェックされているはずです。

アイコンリストの場合はCValueArrayの1番目にビットマップのファイル名を渡します。
この場合はpathで示されるディレクトリにr,g,bという3つのbmpファイルがある事を想定しています。

これを実行すると以下のようになります。
plugin13

ちなみに2番目にCValueArrayに追加する値には、数値型でなく文字列も使用できます。
その場合のコードは次のようになります。

    CValueArray value_radio;
    value_radio.Add( L"radio button 01" ), value_radio.Add( L"value string 01" );
    value_radio.Add( L"radio button 02" ), value_radio.Add( L"value string 02" );
    value_radio.Add( L"radio button 03" ), value_radio.Add( L"value string 03" );

    cpset.AddParameter( L"test_radio", CValue::siString, siPersistable, L"", L"", L"value string 02", param );
    item = layout.AddEnumControl(
        L"test_radio",
        value_radio,
        L"Combo Box",
        siControlCombo
    );

また、PPGLayout::AddEnumControlを使わずにPPGLayout::AddItemを使用しても同じ結果が得られます。
コードはこうなります。

    //--------------------------------------------------------------
    // ラジオボタン
    //--------------------------------------------------------------
    CValueArray value_radio;
    value_radio.Add( L"radio button 01" ), value_radio.Add( 1L );
    value_radio.Add( L"radio button 02" ), value_radio.Add( 2L );
    value_radio.Add( L"radio button 03" ), value_radio.Add( 3L );

    cpset.AddParameter( L"test_radio", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddItem(
        L"test_radio",
        L"Radio Button",
        siControlRadio
    );
    item.PutAttribute(
        siUIItems,
        value_radio
    );

    //--------------------------------------------------------------
    // コンボボックス
    //--------------------------------------------------------------
    CValueArray value_combo;
    value_combo.Add( L"combo box 01" ), value_combo.Add( L"value string 01" );
    value_combo.Add( L"combo box 02" ), value_combo.Add( L"value string 02" );
    value_combo.Add( L"combo box 03" ), value_combo.Add( L"value string 03" );

    cpset.AddParameter( L"test_combo", CValue::siString, siPersistable, L"", L"", L"value string 02", param );
    item = layout.AddItem(
        L"test_combo",
        L"Combo Box",
        siControlCombo
    );
    item.PutAttribute(
        siUIItems,
        value_combo
    );

    //--------------------------------------------------------------
    // アイコンリスト
    //--------------------------------------------------------------
    CValueArray value_icon;
    value_icon.Add( path + L"r.bmp" ), value_icon.Add( 1L );
    value_icon.Add( path + L"g.bmp" ), value_icon.Add( 2L );
    value_icon.Add( path + L"b.bmp" ), value_icon.Add( 3L );

    cpset.AddParameter( L"test_icon", CValue::siInt4, siPersistable, L"", L"", 1L, param );
    item = layout.AddItem(
        L"test_icon",
        L"Icon List",
        siControlIconList
    );
    item.PutAttribute(
        siUIItems,
        value_icon
    );

続きを読む »

女性キャラクターの作成27 - sss

456

なんだかんだ言いながらもしつこく続けております。

sss(サブサーファイススキャッタリング)についてです。

work bookさん、元ネタです。

このページで記載されているsssについての考察をしてみました。

それがこちらのページです。

modoの開発元であるLuxologyのフォーラムです。

 

どなたかがsssの設定についてプリセットを配布されております。

それを元に適用してみました。

三層に分かれたレイヤー構造を適用しております。

それぞれのレイヤーにこれと思われるイメージを適用しレンダリングしてみました。

レンダリング時間は約52分です。

最近はXeonのクアッドコア、プラス、ハイパースレッドで最高16スレッドまで出るらしいですが、

自分の環境はクアッドコアですので、純粋の4スレッドです。

 

modo401が出るまで手をつけないようにしていたのですが、

面白そうなので手を加えてみました。

どうなのでしょうか?自分は大した違いを見出せません。

 

改めて過去のデータを見ると、直したい部分が目に付いてしまいます。

恥ずかしいのでmodo401が出たら作り直したいと思います。

modtoolで竜の頭28 - アニメーション5

さて、順調に更新が遅れています、、

相変わらずペースが掴めなくなっています。

多分書き忘れていると思うので、改めて書きますがSoftimageXSIでのX線表示についてです。

大抵の3Dツールである機能ですが、要するに骨を透過させて表示する、ということです。

何の説明も無く使ってしまったかと思います。ざっと以前の記事を見ましたが多分書いてないので書きます。

XSIの不満点を言うとディスプレイに関するオプションが散らばっていることがあげられるかと思います。

カメラのプロパティ、ディスプレイオプション、ビシビリティオプションと3つもあります。

自分は感覚で覚える性質なのでこういう場合困ります。特に人に説明する時です。

どれかというのは分かってはいるけれど、どれか。と、なってしまいます。

説得力が無くなる場面です。

まぁ、そんなことはさておき、今回のX線表示は「DisplayTypeメニュー」にあります。

「DisplayOption」「XRayMode」にチェックを入れれば出来ます。

骨がメッシュを透過して見られます。

さて、本題のモーションについてですが細かくなってきて説明がややこしくなってきました。

どう説明するべきか正直分かりません。

要は動作、反動作の組み合わせ、繰り返しなのです。

それと、ゲームのモーションでは大抵オーバーに表現することになります。

理由はカメラアングルが決められておらず、引きで見ることが多いためです。

オーバーに物事を表現する、ということは端的に言うと抽象化です。

抽象化を分解して言うと、人間の脳みそで解釈し、解釈出来うる表現、となるかと思います。

余計訳が分からなくなったような気もしますが、それも言語という人間の抽象化の産物かと思います。

では、実際に自分がこの後そう作業を進めてゆくかを書いてゆきます。

動きを大きく分割するとその動作以前、とその動作後に分かれると思います。

今回の動きの場合全体で能動的な動きなので、動きの魅力としてはその能動的な部分に大きく関わります。

なので、その能動的な部分から作ってゆくのが得策かと思われます。

というよりも個人的にそっちを作ってゆきたい、という感じがします。

具体的にいうと噛み付くまでの動きです。

自分は体系的に動きを学んだわけではないので、確たることは言えないのですが、

今回のモデルの首の動きのような、順に繋がっているものを表現する時はキーフレームをずらす、ということをしばしば行います。

始めに作るそれぞれのポージングはその時点での最も美しいと思われるポーズでキーフレームを作ります。

ただ、それを順当に動かすと大抵はつまらない動きになります。

その対応策として、そういった作業が発生する。と考えております。

ただ、全部を均等にずらすとそれもまた良い結果が生まれません。

あくまでも良い動きを作るのであって、良いポーズを作るのではない。ということを強く意識していなければならないのかと思います。

記事を書きながらモーションを作っています。

どうも書いていることをやっていることが合いません。うそを書いているつもりはありませんが、それ以前にやるべきことで躓いています。

キーフレームをずらす前にファンクションカーブの整合性を優先させて作っています。

これもまた厄介なものです。

ファンクションカーブが極端に動く場合は注意しなければならないのですが、きれいにしすぎるのも注意が必要です。

ここでも上記と同じことが言えますが、最終的に作るものは美しいファンクションカーブではなく、美しい動きであることを思い出さなければなりません。

でも、ある程度美しいファンクションカーブは美しい動きであることにも注意が必要です。

なんだか、能書きが多くなってきているように思います。

自分が絶えず直面している問題でもあるからだとも思います。

中途半端ですが、とりあえずデータをおきます。

中途半端でとどめています。でも、おそらく以前youtubeに投稿したものよりもよくなる気配があります。

dragon09

では、今回はこの辺で。

XSIのプラグインでダイアログを使用する1

今回はC++プラグインでダイアログを作成する方法です。
一気にやってしまおうと思いましたが、解説の量が半端じゃなくなりそうなので、
まずは基本的なところを紹介したいと思います。

前回作成したNewCommand.cppのNewCommand_Execute関数の中にコードを追加していきます。
まずは空のダイアログを作成してみます。

ダイアログを作成するにはCustomPropertyクラスを使用します。

XSIPLUGINCALLBACK CStatus NewCommand_Execute( CRef& in_ctxt )
{
    Context ctxt( in_ctxt );
    CValueArray args = ctxt.GetAttribute( L"Arguments" );

    Application( ).LogMessage( L"NewCommand_Execute called" );
    // 
    // TODO: Put your command implementation here.

    Application app;
    Project project = app.GetActiveProject();
    Scene   scene   = project.GetActiveScene();
    Model   root    = scene.GetRoot();

    CustomProperty cpset;
    root.AddProperty( L"CustomProperty", false, L"Test", cpset );

    CValue retval;

    // 起動
    CValueArray inspect_args( 5 );
    inspect_args[ 0 ] = cpset;
    inspect_args[ 2 ] = L"NewCommand";
    inspect_args[ 3 ] =( LONG )siModal;
    inspect_args[ 4 ] = false;
    app.ExecuteCommand( L"InspectObj", inspect_args, retval );

    // 削除
    CValueArray delete_args( 1 );
    delete_args[ 0 ] = cpset;
    app.ExecuteCommand( L"DeleteObj", delete_args, retval );

    // 
    // Return a value by setting this attribute:
    ctxt.PutAttribute( L"ReturnValue", true );

    // Return CStatus::Fail if you want to raise a script error
    return CStatus::OK;
}

手順は、
1.シーンのルートにSceneItem::AddPropertyでCustomPropertyを登録する。(ModelはSceneItemの派生クラス)
2.XSIの内部コマンドInspectObjに渡す引数をCValueArrayを使用して設定する。
3.Application::ExecuteCommandを呼び出してInspectObjを実行する。
4.ここでダイアログが表示されて、OKまたはCancelのボタンを押すまで待機になる。
5.XSIの内部コマンドDeleteObjに渡す引数をCValueArrayを使用して設定する。
6.Application::ExecuteCommandを呼び出してDeleteObjを実行する。
以上です。
5,6の手順をとばしてもダイアログは表示されますが、
これをやらないとダイアログが削除されたことにならず、
ダイアログを立ち上げるたびにTest1,Test2と表示がカウントアップされていってしまいます。

これをコンパイルして実行すると以下のようなダイアログが表示されるはずです。
plugin11
続きを読む »

modtoolで竜の頭27 - アニメーション4

最近生活リズムが変わり、更新が本当に不定期ですね、、

すでに文章であらかた説明しているので書くよりも実際のデータを上げたほうが早いように思います。

とりあえず、軽く説明します。

2と4のポーズですが、まずは適当にキーフレームを移動させつけてゆきます。

後で変更できるので今のところ神経質になることはありません。

image220l

その前にやっておくと便利なことです。

3DCGツールで良くある、オートキーを使います。

これは、トランスレートツールで行った編集にそのままキーが打たれる、という機能です。

要注意の機能です。

オンにしたままうっかり忘れてポージングするとキーが打たれます。

ただ、今の段階では大まかなキーを打ってゆくだけなのでこの機能を使った方が楽に作業を進められます。

細かい調整の時にオフにすることを忘れなければいいのです。

ちなみにキーフレームとは手書きのアニメーション業界からそのまま受け継がれている言葉です。

鍵となる動きを表現しているフレーム、ということだそうです。

キーフレームの間の「中割り」と呼ばれる部分はコンピュータが作ってくれるので、CGが楽なのです。

さて、また話が脇にそれましたが、実際の作業についてです。

2のポーズを70フレーム目につけることにします。これは動きに移る前の溜めの部分です。

ポイントとしては、動きのポーズの反対側に位置する。ということでしょうか。

なんだか書いていて訳が分かりませんが、要はその動きをするにあたり、力を溜めるので、

反対の動き、に近い動作です。

image221l

こんな感じでしょうか?グッと溜めています。

今回作った動きを改めて見て思ったのですが、少し説明するのが難しい動きです。

パンチのストレート等は前回説明した1から5までの動きにあたるのですが、今回の動きは

若干カーブがかかる、フックに近い動きです。3、4、5間での動きの流れが微妙です。

とりあえず180フレーム目にこんな感じの動きを付けておきます。

image222l

ポイントは自分で作った頭を振る動きに流されている、ということです。

頭の重さを表現するため、首を頭に向かって徐々に曲げます。

そうすることにより、能動的なポーズではなく、受動的なポーズになります。

dragon08

では、今回はこの辺で。

modtoolで竜の頭26 - アニメーション3

更新が滞ってしまいました。

 

前回中ほどのフレームにキーをつけましたが本来ならば最後のフレームに最初と同じキー

を打ってから付けた方が良いのですが、機能の説明のためそのようにしました。

 

3Dツールで良くある、ポーズを保持してフレームを移動する、というやつです。

最初のフレームと同じキーを打つために、フレームスライダーをシーンの始まりにドラッグします。

image216l

分かりにくいですが、画像の左下です。

その状態で、骨を全て選択し、「c」で回転ツールにします。

image217l

スライダをマウスの中ボタンでドラッグし、最終フレームまで持ってゆきます。

image218l

フレームスライダーが緑色になったかと思います。

これは一時的なものを意味しているようです。

その状態で「k」を押してキーを付けます。

image219l

ポインタをAnimationEditor上に持って行き「a」を押せば画面フィットできます。

開始フレームから最終フレームまでキーが出来ました。

 

次にやってゆくことを説明します。

以前の説明と同じようなことではあるのですが、動作と反動作について再び説明します。

一つの動きを行う時に必ずその動きに移行する動作と動いたことよる反動が入ります。

なので、モーションを作る時に意識するポイントは、

  1. 開始フレーム
  2. 動きへの移行フレーム
  3. メインの動きフレーム
  4. 反動フレーム
  5. 終了フレーム

の5点となります。

ゲームでは大抵一つのファイルに一つのモーションです。

なので殆どがこれにあたります。

 

連続技などの一連の動きでも途中で止まることを考え全ての技で終了までの動きを付けます。

なので一連の技の流れを作ってモーションを切断しそこから元に戻る動きを作ります。

手間がかかります。

 

ちなみに何も入力が無い状態で再生される動きを、待機、もしくは、構え、といいます。

あくまでも自分の知りうる限りではありますが、その名称で通用します。

 

次は2番目の移行フレームと4番目の反動フレームを作ってゆきます。

リアルタイムでやっているので慎重になっています。

 

では、今回はこの辺で。

modtoolで竜の頭25 - アニメーション2

アニメーションを付けてゆきます。

ゲームのモーションは大抵前後のフレームが同じポーズで出来ています。

前後とはそのシーンの一番初めと一番終わりです。

 

前の動きと後ろの動きは大抵ユーザーが決めるもので、作り手が決められないためです。

何かの入力により、それに対応したモーションが再生される、という仕組みです。

どのような動きがきてもきれいに繋がるように前後のフレームを同じにしておきます。

 

ブレンド機能を使えば余程おかしい動きでない限りはそれなりに繋がります。

逆にその方が動きが出て良い場合などもあります。

なので、昔はそれほど厳密に注意しないである程度、という作り方をしておりました。

ただ、自分以外の人との作業の共有、外部とのやりとり、などを考えるとそろえておいた方が問題はありません。

むしろそろえない方が問題になります。

 

個人的には良い動きになる方が重要だとは思うのですが、

現場ではそうでないことのほうが多いです。

大きな理由としては、足のすべり、という事が挙げられます。

 

以前にも書きましたが、人間は人間の普段の何気ない部分を強烈に覚えています。

それは意識している部分ではないので、強烈という言葉がしっくり来ないかもしれませんが、

全くの素人でも微妙な動きに疑問を抱きます。当たり前のことです。

ゲームではその際たるものが足のすべり、です。

 

ブレンドでは、足の位置がずれていると足が滑って次の動作に移行します。

それを解消するために最初と最後を固定します。

 

ただ、やりすぎると動きが硬くなると思うのですが、いかがなものでしょうか?

 

 

さて、能書きが長くなりましたが本題に入ります。

image212l

関係ありませんが、今日はエイプリルフールなのですね、画像を上げるときのディレクトリで気が付きました。

 

全ての骨を選択します。スケマティックでもビューポートでもかまいません。

ビューポートの場合はそれ以外のノードを選択しないよう注意してください。

最近仕事でMayaを使っているので、ついつい追加選択に「Ctrl」+「Shift」を押してしまいます。

「Shift」だけで大丈夫です。こちらも注意してください。

 

「c」で回転ツールを起動します。

画面下のタイムスライダが1にいることを確認します。なっていなければタイムスライダ上で

マウスをドラッグして1に設定してください。

「k」を押し、キーを設定します。SoftimageXSIでは選択されているトランスレートツールのみにキーが打たれます。

この場合回転ツールなので、回転にキーが打たれます。

ちなみにMayaでは全てのチャンネルにキーが打たれます。

「s」キーがキーフレームの設定になっているので、MayaとSoftimageXSIを頻繁に行き来する方は

どちらかのキーを変えたほうが良いかと思います。自分はMayaの「s」を解除しました。

 

この作業で、シーンの始めを固定しました。

次に噛み付いた直後のポーズを作ります。

噛み付くまでを長くするか、噛み付いた後を長くするかで印象は変わります。

後を伸ばすことで動きに重みを付けることが出来ます。

 

折角CGなのでその辺は後で調整と修正できますので、大体真ん中あたりにキーを打ちます。

130くらいでしょうか。大体で大丈夫です。

SoftimageXSIではMayaのように一つ回転させて、次も続けて回転させる、というような場合、

回転したいものをクリックしても選択できません。

MayaからSoftimageXSIに移行するときに違和感を感じる大きなところかと思います。

SoftimageXSIではスティッキーという機能を使います。

特に使う、という機能でもないのですが、Mayaのスナップと同じ使い方です。

「v」を押している間だけスナップが出来る、「v」を一度押すとスナップがオンになる、

と同じです。あれ、一度押したらオンにはならないのでしょうか?

今試してみましたがなりませんでした。自分の記憶違いでしょうか?

 

何はともあれ、押している間は一時的にそのツールがアクティブになり、

ポンと一度押せば完全にアクティブになります。

なれないうちは戸惑いますが、使ってゆくと便利なことに気が付きます。

何を主体のツールにし、何をスティッキーにするか、作業効率を考えながら

無駄に時間の節約を考えます。そうやっていると大抵時間が費やされます。遊んでいるのでしょうか。

とにかく便利です。

 

この場合回転ツールを主体とし、スペースキーを押しっぱなしにして一時的に選択ツールを使い

次の骨を選択します。それを繰り返してポーズを付けます。

image213l

色々な角度から見てポーズを決めてゆきます。

首は根元から徐々に曲がって行くことを意識します。

一つの骨の一つの軸を動かした方が良いかと思います。

最後に「k」でキーを付けます。

dragon06

とりあえず、そこまでのファイルです。

 

今日は駄文が多くなりました。

では、今回はこの辺で。

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です