2012年10月

2012年10月31日

modo601が来た! その66 modo601SP3

今回は前回残しちゃったアンカーアイテムのhardnessパラメータから調べてみたい。

fig01

hardnessはアンカーによる締結の強度を決めるパラメータで、100%にするとアンカーによって繋がったソフトボディの頂点とリジッドボディとの間の距離が固定され、それより小さい場合はバネのように伸縮するようになるらしい。

さっそく下のようなシーンを作って試してみた。

fig01

このシーンはカーブをロープ化して、カーブの始点(上端)を「アンカー開始」オプションをONにして空中に固定して、カーブの下端とアクティブリジッドボディ化した球体をアンカーで繋いだ。

球体の質量を1、アンカーのhardnessを1%にしてみたけどびくともしなかった。

fig02

そこで思い切って球体の質量を1000まで上げたらこのくらいの挙動になった。

fig03

確かにバネとしての働きは確認できたけど、アニメーション内でこのバネを効果的に使うためにはhardnessを0.001%とかかなり小さな値で使うか、上の例のようにリジッドボディの質量を大きくとる必要がありそうだ。

ついでにバネ的なものならダンパーが付きものと思ってチャンネルリストを探してみたけどそれらしいパラメータは無かった。ダンパーはリジッドボディの方のリニア減衰とかでしろって事だろうね。

下のGIFアニメは質量1000のままアンカーのhardnessを0.1%にしてロープの方のアイテムをキーフレームアニメーションさせてみたものだ。

fig04

ここから再びソフトボディーインフルエンスに戻って、「高度な設定」ロールアウトを調べて見たい。

fig05

「フォースサンプリング」はソフトボディーがフォースアイテムによって外部から力を受ける時の力の受け方を決めるパラメータで、single、single WithShadowing、perVertex、perVertex WithShadowingの4つの選択肢の中から選択出来るようになっている。

single」はソフトボディにフォースアイテムが及ぼす力をアイテムのセンター一箇所で評価して、その力をソフトボディの全頂点に均等に加える方式。

例えば下のGIFアニメはリニアフォースに球体のフォールオフをバインドし、ソフトボディに影響させてみたものだ。球体のフォールオフは球体の中心から球体の表面までの範囲でバインドしたフォースの影響を減衰させるもので、バインドしたいフォースを選んでrecoilメニューから「フォールオフ→フォールオフの追加→RadialFalloff」と選べばバインドされたフォールオフアイテムが追加される。

このフォールオフによってリニアフォースが影響を及ぼす範囲は球体の中に限定されている。そしてこのフォールオフをソフトボディ表面で動かしてみると、ソフトボディの中心にかかった時に急にソフトボディが反応しているのがわかる。そしてその反応はソフトボディ全体で均一に力がかかっている反応だ。

fig06

これに対してこのパラメータのデフォルト値である「perVertex」は、フォースの影響を各頂点ごとに評価するものだ。下のGIFアニメはperVertexに切り替えてみたもので、ソフトボディはフォールオフの範囲内にある頂点のみがフォースの影響を受けて動いているのがわかる。

fig07

残りの「single WithShadowing」 と 「perVertex WithShadowing」はフォースの評価にシャドーの影響を含めるものだ。でもこのシャドーは以前にも試してみたんだけどどうもうまいことセッティングできない。

それでもなんとか作動した例で検証してみたんだけど、「single」と「perVertex」では下のGIFアニメのようにシャドーの影響を受けないので、ソフトボディとリニアフォースの間に置いたシャドー100%のパッシブリジッドボディによってフォースが遮断されること無くソフトボディが押された。

fig09

それに対して「single WithShadowing」 にした場合、予想通り遮蔽物がソフトボディの中心点の前にある時はフォースが遮断され、中心の前からいなくなるとソフトボディ全体がフォースの影響を受けた。

fig08

でも設定を「perVertex WithShadowing」に変えてもこの挙動は同じで、どうも頂点ごとのシャドーの影響評価は出来ない感じだ。

fig08

フォールオフを使ってみたシーンとBOXを遮蔽物にしてみたシーンはアップしておいたよ。

それではまた次回。

カテゴリー別ページ



take_z_ultima at 11:30|この記事のURLComments(0)TrackBack(0)modo | CG

2012年10月30日

2013の新機能を探る その44 3dsmax 2013 SP2

今回も前回に引き続きMassFXのコンストレイントを調べてみたい。前回はMassFXのツールバーにあるコンストレイントのフライアウトボタンについて、どんな動作のコンストレイントかをざっと見てみた。

fig02

今回はより詳細に調べてみたい。

まずはコンストレイントの基本的な設定方法から。下のシーンは円柱をダイナミックリジッドボディに、BOXをキネマティックリジッドボディに設定してあり、

fig01

BOXにはキーフレームアニメーションが付けてある。このままシミュレーションしても、円柱とBOXには何のつながりも無いので、このような結果になる。

fig02

このシーンではこのBOXの動きにあわせて円柱の回転軸を移動させて、円柱を地面の上で転がせてみたい。自由な回転軸はTwist Constraintで与えられるのでBOXと円柱の間で設定してみる。

まず動きの親になるBOXを選択し、次に子となる円柱を追加選択する。

fig03

次にMassFXのツールバーのコンストレイントフライアウトボタンを押してフライアウトを開き、「Create Twist Constraint」を選ぶ。

fig04

するとこのように緑の円盤が出て来て、マウスの動きにあわせて大きさが変わる。これがコンストレイントの拘束を表わすアイコンで、大きさは動作に無関係なので適当な大きさのところでマウスの左ボタンを押して確定する。

fig05

するとこのようにBOXと円柱の間にコンストレイントが設定される。

fig06

作成されたコンストレイントオブジェクトの「General」ロールアウトを見ると、ParentにBOX、Childに円柱が設定されているのがわかる。

fig10

今のところ回転軸はBOXの基点から円柱の基点への方向に沿っていて回転軸の基点はBOXの基点と一致している。

fig07

この状態でシミュレーションをしても、回転軸の向きがおかしいので円柱はうまく回転しない。

fig08

ここで回転軸の位置と方向を調整する。コンストレイントのGeneralロールアウトのChild側の「Move to Child's Pivot(子の基点に移動)」ボタンを押して、コンストレイントの基点を子の基点にあわせる。

fig09

これでコンストレイントの位置と方向が円柱と一致する。ただ、twistの回転軸が上を向いちゃっているので修正する必要がある。

fig11

こんな事なら位置合わせツール使った方がよかったかなw

とりあえず角度スナップとかONにして

fig13

90度回転して回転軸を円柱の軸にあわせた。

fig12

そしてシミュレーションしてみたのがこれ。円柱の転がり方がイマイチな感じだ。

fig19

これは円柱が地面からちょっと浮いちゃってるせいのようで、地面と接触させるためには円柱を地面に接触するまで落としてやる必要がある。そこでコンストレイントの垂直方向の拘束を外して垂直方向には自由に上下できるようにしてみた。

fig17

移動方向の拘束は「Translation Limits」ロールアウトにあり、Z軸をFreeに設定した。  

fig16

今度は円柱が地面に沿って転がっているのがわかる。

fig14

これで地面に沿って上下しながら追従する回転軸がBOXに引っ張られ、それによって地面との摩擦で転がる車輪が出来た。同じ作業を残りの3つの円柱にも行ってやったのが下のGIFアニメだ。コンストレイントのアイコンがちょっと大きかったので「General」ロールアウトの「Icon Size」を変更して調整し、さらに車輪の側面に見えるようにX軸方向にちょっと移動させた。

fig15

さらにMassFXの「World Parameter」パネルの「Scene Settings」ロールアウトの「Use Ground Collisions」をOFFにしてかわりにでこぼこの地面を配置すれば、こんな感じで車輪が地面の凹凸に上下方向の運動で追従するのがわかる。

fig18

以上のようにコンストレイントは親→子の順にリジッドボディを選択してからコンストレイントの作成ボタンを押せば簡単に設定できる。コンストレイントオブジェクトは最初は親側の位置に子側の方向を向いた状態で作成されるけど、基本的に下のようにコンストレイントの本体があって、そこから2本の腕が伸びでコンストレイントされているリジッドオブジェクトの基点に繋がっている形になっている。

fig22

fig20そしてこのコンストレイントオブジェクトのローカル座標に対してX、Y、Z方向に完全に拘束したり、ある範囲の移動を許したり、完全に自由にしたりと言った事が「TranslationLimits」のロールアウトによって設定出来るようになっている。

fig21同様にコンストレイントオブジェクトのローカル軸回りの回転についても完全に拘束したり、ある範囲の回転を許したり、完全に自由にしたりが「Swing & Twist Limits」ロールアウトの設定で出来るようになっている。

Lockedが完全拘束で、Limitedがある範囲の自由度を持たせた拘束で、Freeが完全に自由になる設定だ。

これらの設定によってアイコンの絵が変化する。

例えばTwistがFreeになっている場合はアイコンがこのようになり、

fig23

Limitの場合は回転範囲の扇形になる。

fig24

移動をLimitにするとこのような移動範囲の軸も表示される。

fig25

いろいろな設定が組み合わさると円弧も立体的になってくる。

fig26

次回は各パラメータの詳細を調べてみたい。それではまた次回。

今回使ったサンプルシーンはアップしておいたよ。

maxまとめページ



take_z_ultima at 11:30|この記事のURLComments(0)TrackBack(0)3ds Max | CG

2012年10月29日

modo601が来た! その65 modo601SP3

今回も前回に引き続きソフトボディとリジッドボディを接続するアンカーアイテムについて調べてみたい。

アンカーのプロパティには下の画像のように3つの項目がある。

fig01

「有効」はONにすることでアンカーが接続するソフトボディとリジッドボディのコンストレイントを有効にするスイッチ。これに説明はいらないね。

「subCollisions」はマニュアルに以下のように書かれている。

SubCollisions (下位衝突):このオプションを 有効 にすると、コンストレイントされる側 (チェーンの構成要素。見た目が 数珠つなぎ になっているという意味ではなく、階層が入れ子になっている子アイテム同士) の衝突検出が行われるようになります。無効 (デフォルト) にすると、計算量は大きく減少しますが、子アイテム同士がぶつかったときに、互いに突き抜けてしまうようになります。子アイテム同士が衝突する可能性のあ る場合は、これを 有効 にしておいてください。

何度読んでもよくわからないので、たぶんこういう事じゃないかなと予想をつけて実験してみることにした。

そこでまず思いついたのが下の画像のようなシーンで、1本のロープ化したカーブとパッシブリジッドボディ化した球体とアクディブリジッドボディ化した2つのBOXを3つのアンカーで結びつけたものだ。BOXはロープに「コンストレイントされている側」なので「子アイテムどうしの衝突」は2つのBOXの衝突と見なせるのかな?と思ったわけだ。

fig02

アイテムとしてはRopeに対して3つのAnchorが子アイテムになっているけど、BOXや球体は子アイテムじゃない。マニュアルの「見た目が 数珠つなぎ になっているという意味ではなく、階層が入れ子になっている子アイテム同士」を考えると、まったく逆の状態かも・・・。

fig03

で、実際やってみたらsubCollisionsの設定に係わり無く、2つのBOXは衝突検出されてしまった。

fig04

そこで今度はBOXを増やしてピンコンストレイントで繋いで、BOXの下の階層のBOX(アクティブリジッドボディ化したもの)を作ってみた。

fig05

だがやっぱりsubCollisionsの設定によって衝突の状態が変わる事は無かった。

fig06

よくわからないのでさらに原文をあたって見た。

SubCollisions: The 'SubCollisions' option, when enabled, allows constrained objects (especially those within a chain, not a literal chain but subsequent groupings) to collide with one another. When disabled (the default state), fewer calculation are required, however, constrained items may inter-penetrate each other. If this occurs users will want to enable SubCollisions.

カッコの注釈を外してみると「constrained objects to collide with one another.」なので、コンストレイントされているものどうしの衝突検知らしい事はわかる。そして within a chainで、not a literal chainであって、subsequent groupingsなので、これはもしかしてチェーンで繋がっていても、対象となるのはチェーンの隣どうしの話なのかな?と考えてみた。となればアンカーはソフトボディとリジッドボディの間でしかつなげないから、この設定はアンカーで繋がれたソフトボディとリジッドボディの間の衝突を検知するかどうかのスイッチと考えればいいのかなと思ったわけだ。

そこでまず、アクティブリジッドボディの球体と四隅をピンマップで留めたソフトボディの平面を用意して、両者が衝突するのを確認した。

fig07

次にソフトボディの1ポイントと球体の間にアンカーを設定して、subCollisionsをONにした。

fig08

そしてシミュレーションしてみたのがこれ。2つのアイテムは衝突しているのがわかる。

fig09

次にsubCollisionsをOFFにしてみた。すると、両者は衝突しないですり抜けた。

fig10

ところが、もう一度subCollisionsをONにしても今度は衝突しない。キャッシュが効いているのかと思っていろいろキャッシュがクリアされるような事を試しているうちに衝突が復活した。

結局のところ一番簡単に設定を確かめられたのは、一度アンカーを削除して、再設定するか、一度保存して閉じてからまた開く方法だった。

上の手順のうち、アンカーを設定した後でシミュレーションを行う前にsubCollisionsをONにしなかったときは、やはり両者は衝突しないですり抜けて、アンカー作成後にシミュレーションを行う前にsubCollisionをONにしたら両者は衝突するようになった。

と言うわけで、どうやらsubCollisionはこういうものらしいと言う結論だ。subCollisionをON/OFFにした2つのシーンをアップしておいたよ。

それではまた次回。

カテゴリー別ページ



take_z_ultima at 12:05|この記事のURLComments(0)TrackBack(0)modo | CG

2012年10月26日

2013の新機能を探る その43 3dsmax 2013 SP2

今回は2013の新機能じゃないけどMassFXのコンストレイントを調べてみたい。

fig01

コンストレイントは2つのリジッドボディをつなぐ関節みたいなもので、拘束条件を変えることで完全に2つのリジッドボディを一体化してしまうものから蝶番のように1軸を中心に回転するものやカーテンのレールのように直線上をスライドするものなど様々なバリエーションの繋ぎ方が実現できるようになっている。

MassFXのツールバーにあるコンストレイントのフライアウトボタンは全て同じコンストレイントで、初期値で拘束条件を変えたものだ。

fig02

リジッドコンストレイントは2つのリジッドボディを完全に拘束して一体化するコンストレイント。

fig04

fig03

スライドコンストレイントは1軸に沿った移動だけ拘束しないコンストレイントだ。

fig05

fig10

ヒンジコンストレイントは1軸まわりの回転だけ角度制限付きで拘束しないコンストレイントだ。

fig06

fig11 

ツイストコンストレイントは1軸まわりの回転だけ拘束しないコンストレイントだ。

fig07

fig12

ユニバーサルコンストレイントは角度制限付きで2軸回転だけ拘束しないコンストレイントだ。

fig08

fig13

ボールとソケットコンストレイントはボールジョイントとして働き、ユニバーサルコンストレイントに捩じり方向の自由度を加えたコンストレイントだ。下のGIFアニメで球体の横に突き出た棒の挙動を上のGIFアニメと比較して欲しい。

fig09

fig14

コンストレイントの設定は親→子の順にリジッドボディを選択してからツールバーの各コンストレイントのボタンを押すことで設定できる。

詳しい話はまた来週。上で出てきたコンストレイントのサンプルシーンはアップして置いたよ。

maxまとめページ



take_z_ultima at 11:30|この記事のURLComments(0)TrackBack(0)3ds Max | CG

2012年10月25日

アンカーが割り当てられている頂点を編集する modo601 SP2

前回ソフトボディの頂点をリジッドボディと連結するアンカーアイテムが出てきたので、今回はそのアンカーアイテムに関するスクリプトをちょっと作ってみたよ。

fig01

通常のアンカーアイテムのプロパティには接続されている頂点番号が表示されていないので、アンカーがどの頂点に接続されているかはチャンネルリストでindexチャンネルを確認する必要がある。

fig02

そしてその番号がメッシュのどこの頂点なのかを確認するにはビューポートの設定でインデックス表示をONにしたりとか、選択して頂点の情報を見たりとかしないとならないので面倒だ。

そこで上のフォームのようにアンカーが現在リンクしている頂点番号をプロパティパネルに表示して、その番号を「頂点選択」ボタンを押すことで選択状態にして示し、また現在選択している頂点番号を「頂点セット」ボタンを押すことでセットするようにしてみた(下のGIFアニメはクリックすると大きくなるよ)。

fig03

例えば四隅の頂点が左右の直方体のリジッドボディにアンカーで接続されているこのシーンで、

fig04

アンカーアイテムはanchor、anchor(9)、anchor(10)、anchor(18)の4つあって、

fig05

それぞれが下のように割り当てられているとすると、

fig06

anchor(18)を選んで、頂点選択ボタンを押すと、

fig07

アンカーが割り当てられた頂点が選択状態になる。

fig08

ここで例えば下の画像のように別の頂点を選択し、

fig09

頂点セットボタンを押せば、頂点番号が読み取られて頂点番号が再セットされる。

fig10

再びシミュレーションしてみると、アンカーの位置が変わったのが確認できる。

fig11

たまにリジッドボディとアンカーの相対位置がズレる現象が起きたけど、リジッドボディの方のトランスフォームのゼロ(位置)とリセット(位置)で修正できた。

さて、このツールをフォームに組み込むには以下の手順を踏む必要がある。

まずアンカーアイテムを1つ適当に作っておいて(作り方は前回の記事を見てね)、アンカーアイテムをを選択してアンカーのプロパティが表示されている状態にする。

次にフォームエディタを立ち上げて、アンカーアイテムのプロパティをフォームから探す。そのためにリストのフォームの横の三角形ボタンを押してフォーム側のリストを展開しておいてから「フォーム検索」ボタンを押し、

fig12

アンカーの「hardness」プロパティをクリックする。

fig13

これでフォームエディタのリストは「hardness」にハイライトするから、「(新規コントロール)」ボタンをクリックして、「コマンドの追加」を選択し、

fig14

コマンド入力のダイアログが出たら、以下のように入力する。

item.channel {anchor$index} ?

これでアンカーがどの頂点とリンクしているかを表示するボックスがフォームに追加される。そしてフォームエディタのラベルに「頂点番号」などのラベルを入力する。

fig15

 同様にして、以下の2つのコマンドも作成する。

頂点選択 @op_anchor_vert.py 

頂点セット @op_anchor_vert.py 1 

頂点セットの方のコマンドは後ろに引数「1」が付いているので入力の時落とさないでね。この引数の内容は1じゃなくても構わないけど、コマンドの後ろにスペースを1つあけて何か文字が入って無いとスクリプトが頂点セットの動作をしないからね。

あとはスクリプトop_anchor_vert.pyをscriptsフォルダーなどのパスの通ったフォルダーにコピーすれば完了だ。

ちなみにscriptsフォルダーは、以下のコマンドをコマンド入力に打ち込んで実行すれば、イベントログ(システム→高度な設定→イベントログ)に表示されるよ。

query platformservice path.path ? scripts

どうもフォームエディタが不安定でSP3で変更しようとするとmodoが落ちる。だから今回フォームを書き換える部分まで含めた動作確認が出来たのはSP2まで。フォームを書き換えた後ならSP3でも動作確認が出来ているよ。

もしかしたらVC++2010をインストールしたせいかも知れないな・・・。

それではまた次回。

カテゴリー別ページ(ダウンロードはこちらから)



take_z_ultima at 12:01|この記事のURLComments(0)TrackBack(0)modo | CG
Archives