主に、LightWave3Dに関する事を書き記します。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
前のエクスプレッションの勉強から随分と時間が空いてしまいました。
記事を読み返してどこまで進めたかを把握したところで再開していきます。
今回は「Hip Center」と「Hip Height」を学んでいきます。
これらの関数は両足のゴール(歩幅)の距離に対して腰の位置を自動で制御する便利なExpressionです。
しかし、僕にとってあまり利用しないものになると思います。^^;
どうも足の動きに対して腰が自動で移動すると少し手付けの感覚が狂うんですよ。
どう感覚が狂うのか具体的に言いますと、FKの基本である親から子→親から子へとモーションヒエラルキー(階層モーション)をベースにモーション付けしているので、足のゴールアイテムを動かした時に腰が勝手に動いてしまうと少し違和感があるんです。
(ま~た戯言をw こんな僕の独り言は無視して良いですよっ!w)
悪くない制御方法なので・・・これは好みの問題ですねぇ。
腰の位置を制御する以外にも利用出来るかもしれないので覚えていきましょう。
【Hip Center (Type A)】
「Hip Center」は両足の位置(距離)に対して腰の位置を中心に移動する為のものです。
Type Aでは足のゴールアイテムを動かすだけで常に腰が中心に移動するようになります。
・・・あれ、確かこれと同じ動きをするものがありましたね?
そうです。
「Hip Center (Type A)」は、以前勉強したLScript関数の「center」と同じです。
center([L_CTRL_Ground.Position.X],[R_CTRL_Ground.Position.X])
※:足のゴールアイテムのチャンネル。(黄色の「□」Null。)
この制御方法を使うと腰は常に中心にあります。
腰の動きを付けずに済むので楽チンですが、モーションの自由度が低く機械的な動きになるのでモブキャラで簡単に動きを付けたい時くらいにしか使わないと思います。
【Hip Center (Type B)】
Type BはType Aの制御をしつつ、アイテムで腰の中心をずらすことが出来るようになります。
これで自然な動きが自分の手で付けられるようになりますね。
あと、Type Aと違ってType Bでは「mapRange」を使っています。
これも既に勉強済みですね。
mapRange([CT1.Position.X],1.000,-1.000,[L_CTRL_Ground.Position.X],[R_CTRL_Ground.Position.X])
※:腰の位置を制御するアイテム「CT1」。(水色の「+」Null)
※:左足・右足の位置
※:足のゴールアイテムのチャンネル
【Hip Center (Type C)】
Type CはTypeBの制御にもうひとつ腰の位置を制御するNullが追加されます。
正直言って2つのアイテム移動で腰の位置を制御する意味がどこにあるんだろうかと思いますが、何かしらの理由で使う必要性が出てくるのかもしれませんね。
mapRange([CT1.Position.X],1.000,-1.000,[L_CTRL_Ground.Position.X],[R_CTRL_Ground.Position.X]) +[CT2.Position.X]
※:腰の位置を制御するもうひとつのアイテム「CT2」。(ピンク色の「+」Null)
「Hip Height」は両足の位置(距離)に対して腰の高さを制御します。
「Hip Center」と組み合わせると腰の上下縦横移動が自動的になって効果は抜群だ!!
(「ポケモンかよっ!」と、一人ツッコミ。w)
Type Aでは足のゴールアイテムを動かすだけで常に腰が開いた脚に対してベストな高さに移動するようになります。
mapRange( vmag( L_CTRL_Ground.wpos(Time)- R_CTRL_Ground.wpos(Time)) ,0.201,1.200,1.3019,1.000)
このExpressionはLScript型を使っていて[ ](ブラケット型)でチャンネルを囲っていません。
何でLScript型を使っているのか・・・僕もまだこの2つの型の違いを確実に把握していません。
でも、少しだけ分かる事があります。
腰のアイテムX・Z軸の値は0ですが、Y軸になると元々の腰の高さの値が存在します。
もし、これをブラケット型で入力しようとすれば、腰のY軸のデフォルト値は0になってしまいます。
そこでLScript型を利用してワールド座標系で制御するようにします。
LScript型の値に含まれている「wpos」は
w = ワールド座標で
pos = 位置を制御
っていう記号になります。
さらに上のExpressionの値をよく見るとXYZの軸記号がありません。
面白い事に、この状態のままだとXYZ軸移動で腰の高さが変わるんです。
(凄いな、LScript型。)
でも、X・Z軸は良いのですけどY軸ではあまり腰が動いてほしくないですね。^^;
制御する軸を指定する場合は、
L_CTRL_Ground.wpos(Time).x
と、このように後ろに軸を入力しますが、この数式ではX軸Z軸のふたつの軸で制御出来ません。
そうなると【LightWave3D ver.7 キャラクターアニメーション】の参考書に書かれていたLScript関数の「abs」を使ったX軸Z軸で制御する方法が良いかもしれませんね。
(古い本なので今も売っているのかな?)
このType Aは出来る事が限られているのでモブキャラの時に利用すると思います。
___________________________________________
- 追記:二種類のExpression構文の利点。 -
LScript型:L_CTRL_Ground.pos(Time).x ⇔ ブラケット型:[L_CTRL_Ground.Position.X,Time]
・「LScript型」はグラフ編集のExpressionとモーションモディファイヤのExpressionに使用出来てAfterIKが利用出来る。
・「ブラケット型」はLWに存在する全てのチャンネルにアクセス出来る。
それぞれの利点を活かせばもっと良い制御方法がとれるかもしれませんね。
___________________________________________
【Hip Height (Type B)】
Type BはType Aの制御をしつつ、アイテムで腰の高さを制御出来るようになるので、これで自然な動きが自分の手で付けられます。
mapRange( vmag( L_CTRL_Ground.wpos(Time)- R_CTRL_Ground.wpos(Time)) ,0.201,1.200,1.302,1.000) +[CT1.Position.X]
※:両脚のワールド座標値。
※:デフォルトの足の間の距離。
※:足を全開にした時の距離。
※:腰のデフォルトの位置。
※:足を全開にした時の腰の低い位置。
※:腰の高さを制御するアイテム「CT1」。(水色の「+」Null)
まだ値の意味を書いていなかったですね。
米印の文と色を見比べるとどのような仕組みか理解出来ると思います。
ここで驚いたのが、Expressionの値に「LScript型」と「ブラケット型」が同時に組み込むことが出来るという事実です。
何か、洗剤みたいに「混ぜちゃダメ!!」っていうイメージがあったのでExpressionの制御よりもこれに驚きましたw
「Hip Height」のタイプの中ではこれが一番使い易い感じがします。
【Hip Height (Type C)】
Type CではType Bの制御にプラスして腰の高さの制限値が付きます。
足を全開にした時の距離以上の開脚をすると腰の高さは「1.000(m)」を維持します。
clamp( mapRange( vmag( L_CTRL_Ground.wpos(Time)- R_CTRL_Ground.wpos(Time)) ,0.201,1.000,1.302,1.000), 1.302, 1.000 ) +[CT1.Position.X]
※制限値の記号と数値。
ただ、難点があります。
GIFを見て分かりますが両足の距離が0.201以下になると、腰の高さがステップ状に「1.000(m)」に移動されます。
これさえ無ければ良いのですが・・・。
【Hip Height (Type Full Monty)】
「Hip Height」の完全版です。
Type Cの改良版みたいな感じがしますが・・・う~ん、これもイマイチ使い方がよく分からない。orz
mapRange([CT1.Position.X], 1, 0, (clamp(mapRange(vmag( L_CTRL_Ground.wpos(Time)- R_CTRL_Ground.wpos(Time)) ,0.201,1.200,1.302,1.000), 1.302, 1.000)), 1.302) +[CT2.Position.X]
上の値を入力したところ、両足の距離が0.201以下になると「CT1」の制御が利いて腰の高さを制御出来るようになります。
そして、「CT2」にはそういった制限も無く腰の高さを制御出来る・・・CT1は一体何の意味が。。
ビルダーには「Fade Slider」( 自動的な 'Hip Height' の割合を制御するチャンネル。)って書かれてあるけど、実際に動かしてみてもあまりピンと来ません。
ただ、自分が意味を理解できていないだけかと思いますが、今のところ「Type B」が一番使い易いかなと感じました。
ふぅ、久々に一気に書ききった感じがします。
これでユーティリティ関数の1/3は分かったかな?
次も腰の制御に関するものなので引き続き勉強していこうと思います。
話は変わって、待ちに待ったLW11.5がようやく来ましたね♪
今まで以上に開発に手を入れているのが伺えるので、しばらくはLW11.5でいろいろと遊べそうですw
でも、今はExpressionの勉強に集中してお楽しみは後でとっておきたいと思います。^^
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
COMMENT