2012年04月

2012年04月27日

スキンモディファイヤについて調べて見た その16 3dsmax 2012 SP2

今回はスキンモディファイヤをスクリプト側から調べてみたい。

まずはモディファイヤの一般的なところから。

オブジェクトにモディファイヤを追加するにはaddModifier() または modPanel.addModToSelection()メソッドが使える。

addModifier <node> <modifier> [before:index] -- mapped

指定ノードのモディファイヤスタックにモディファイヤを追加するにはこのメソッドを使う。<node>がコレクションの場合は全てのノードにインスタンスが追加される。beforeパラメータはノードのモディファイヤ スタックの最上位から見てインデックス付けされたモディファイヤの直前の位置にモディファイヤを挿入したい時に指定する。

例えばシーン内に円柱(Cylinder001)があって、そこにスキンモディファイヤを追加したい場合は、

addModifier $Cylinder001 (skin())

とすればいい。skin()はスキンモディファイヤのコンストラクタだ。先に変数に代入してから追加することも出来る。

mfskin = skin()
addModifier $Cylinder001 mfskin

複数のオブジェクトに対してインスタンスで挿入した場合は全て同じモディファイヤとして適用されることになる。その場合はインスタンスだと言うことがわかるように名前が斜体に切り替わる。

また、このメソッドを使った場合、サブオブジェクトレベルの選択が解除されてしまうので、選択を保ちたい場合は次のmodPanel.addModToSelectionでモディファイヤを追加する。

modPanel.addModToSelection <modifier>

[修正]パネルで現在開いている選択範囲にモディファイヤを適用する。このメソッドは[修正]パネルが開かれていないと何もしない。だからaddModifierに比べると、作動させるための準備が必要になる。

モディファイヤスタックに追加されているモディファイヤにアクセスするにはいろんな方法があって、一番簡単なのはプロパティとしてアクセスする方法だ。

プロパティ名はモディファイヤの名前がそのまま使われるので、例えば下のような構成の場合、

fig01

$Cylinder001.スキン
Skin:スキン

とすればアクセスできる。ただ、日本語の名前は互換性の問題も出てくるので、英語名のエイリアスがあって(逆かな?)、通常は「skin」がプロパティ名として使われる。

$Cylinder001.skin
Skin:スキン

もちろんモディファイヤの名前を変更すればプロパティ名もそれにあわせて変化する。

fig02

また、名称にスペースが入っているものはそのままだと文法上スペースで名前が分断されて別のトークンになっちゃうけど、スペースをアンダーバーで置き換えることで代用することができるよ。マニュアルに書いてある例を書くと「UVW Map」モディファイヤは間にスペースが入っているけど「UVW_Map」とすればOKだ。大文字小文字の区別は無いから「uvw_map」でもOKだ。

ただ、この方法だと同名のものがスタックにあったり、オブジェクトのプロパティとして存在していたりすると、最初に見つかったものしかアクセス出来ない。そこでmodifiers配列プロパティを使ってアクセスする方法も用意されている。

例えばスタックが以下のようになっている時、

fig03

このオブジェクトのmodifiersプロパティを見てみると、

$Cylinder001.modifiers
#modifiers(ターボスムーズ:ターボスムーズ, EditMeshMod:メッシュを編集, スキン:スキン)

という配列が得られる。もちろん配列の要素に個別にアクセスできて、

$Cylinder001.modifiers[3]
Skin:スキン
$Cylinder001.modifiers[#skin]
Skin:スキン
$Cylinder001.modifiers["skin"]
Skin:スキン
$Cylinder001.modifiers["スキン"]
Skin:スキン

スタックの通し番号(上から順に1、2、3、・・・)や名前リテラル、文字列などの添字で要素を指定できる。

こうしてモディファイヤオブジェクトが得られたら、後はそのオブジェクトのメソッドやプロパティを操作すればスクリプト側からいろんな事が出来るわけだ。

例えば現在選択されているオブジェクトのある頂点にかかっているボーンウェイトを調べようと思ったら、

(
 local mfskin =$.skin
 local vnum = 40
 local count=skinOps.GetVertexWeightCount mfskin vnum
 for i = 1 to count do (
  local bid = skinOps.GetVertexWeightBoneID mfskin vnum i
  local bname = skinOps.GetBoneName mfskin bid 1
  format "% : %\n" bname (skinOps.GetVertexWeight mfskin vnum i)
 )
)

などとすればいい。

skinOps.GetVertexWeightCount <Skin> <vertex_integer>

GetVertexWeightCountは<vertex_integer>で指定された頂点番号に影響を与えているボーンの数を返す。

skinOps.GetVertexWeightBoneID <Skin> <vertex_integer> <vertex_bone_integer>

GetVertexWeightBoneIDは<vertex_integer>で指定された頂点番号に影響を与えているボーンの通し番号<vertex_bone_integer>からボーンIDを取得する。

skinOps.GetBoneName <Skin> <bone_integer> <nameflag_index>

GetBoneNameはボーンID<bone_integer>から<nameflag_index>が1の時はボーン名を返し、0の時はボーンの変換を持つノードを返す。

skinOps.GetVertexWeight <Skin> <vertex_integer> <vertex_bone_integer>

GetVertexWeightは<vertex_integer>で指定された頂点にかかる<vertex_bone_integer>番目のボーンのウェイト値を返す。

実行すると以下のようになる。

Bone001 : 0.047667
Bone002 : 0.059653
OK

ウェイトテーブルを見ると39番のウェイト値がこのようになっている。

fig04

ここで「おや?」と思った方もいると思うけど、上記のスクリプトで指定している頂点番号は40番でスキンウェイトテーブルで表示しているのは39番。実はこのスキンモディファイヤの頂点IDは0から始まっているのに対して、スクリプトからアクセスする時の頂点IDは1から始まっているので1つずれるみたいだ。

ウェイト値を取得できるならセットも出来て、

skinOps.SetVertexWeights <Skin> <vertex_integer> ( <vertex_bone_integer> | <vertex_bone_array> ) ( <weight_float> | <weight_array> )  

SetVertexWeightsを使えばボーンID<vertex_bone_integer>とウェイト値<weight_float>を指定して頂点番号<vertex_integer>のウェイト値を変えることも出来るし、 <vertex_bone_array><weight_array>の2つの配列で一挙に変更することもできる。

例えばこのように頂点番号40に対してボーンID1〜4のウェイト値を0.1、0.2、0.3、0.4に設定してみると、

(
 local mfskin =$.skin
 local vnum = 40
 skinOps.SetVertexWeights mfskin vnum #(1,2,3,4) #(0.1,0.2,0.3,0.4)
)

このように値がセットできる。

fig05


それではまた次回。ゴールデンウィーク中は不定期投稿になるからね。

maxまとめページ



take_z_ultima at 12:44|この記事のURLComments(4)TrackBack(0)3ds Max | CG

2012年04月26日

modo601が来た! その15

夏に向けて久しぶりに土作りをしたら身体がダルい・・・orz

今回は「トポ」タブの「トポロジ ペン」ツールについて調べてみた。

fig02

トポタブの目的はメッシュ構造の単純化で、そのためのツール群が配置され、

fig04 

ビューポートもそれにあわせて設定されている。背景の表示はフラットシェードになっていて、新設の「トポロジモード」がONになっている。

fig01

この「トポロジモード」がONになっていると、前景のポリゴンが透けて背景が見える。下の画像は前景に帯状のポリゴンを描いて背景に顔のオブジェクトを配置し、このモードをON/OFFして見比べたもの。ONにすると前景のポリゴンが透き通って背景が見える。

fig03

マニュアルには以下のように書いてある。

Generally this process creates intersecting geometry that is difficult to see. Enabling the 'Topology Mode' option will force the drawing of vertices and edges to always draw in front of whatever background elements may be visible in the scene. Vertices will be enlarged for easier visibility, and edges will draw in green when in front of the background geometry and will draw purple where it intersects the background geometry and would otherwise have been hidden.

一般的にこの(メッシュの単純化)プロセスは見にくい交差するジオメトリを作成してしまう。「トポロジモード」オプションを有効にすると、頂点とエッジの描画が強制され、たとえ背景のエレメントが表示されていても常に手前に描かれるようになる。頂点は、見やすいように拡大され、背景ジオメトリの前面にエッジがあるときは、緑色で描画され、背景ジオメトリと交差して隠れたであろう場所は紫色で描画される。

これで背景になぞりたい形状を置いて前景でメッシュを描いても、2つのオブジェクト間の関係が把握しやすいわけだね。

また、ツールによっては自動的に背景コンストレイントが設定されて、背景オブジェクトの表面に沿って作業が出来るようになっている。

fig05

今回調べたトポロジーペンもその1つで、このツールは多彩なモードを切り替えながら1つのツールの中でメッシュの単純化再構築をこなせるように考えられている。

トポロジーペンツールの目的は高密度メッシュの上にその形状をすくい取れるような低密度のポリゴンメッシュを生成する事にあって、生成した低密度メッシュはディスプレースメントマッピングなどのテクスチャーマッピングで補うことで、見た目は高密度メッシュに似せる事ができる。メッシュの密度を低くすればアニメーションなどで扱いやすくなるわけだね。

トポロジーペンツールを使うには準備として、背景に写し取りたいメッシュオブジェクトを配置して、ペンツールやトポロジースケッチツールなどでメッシュの基点となるポリゴンを作成しておく。このタネのエッジや頂点を引っ張り出したりしながら面を作っていくのがトポロジーペンツールの役割だ。

例えば背景に頭部のオブジェクトを配置し、前景に新しくメッシュレイヤーを作成してペンツールを起動し、種別を「ポリゴン」にして

fig06

このようにクリックして行けば、背景にそった位置にポイントが生成され、それがつながってポリゴンが生成される。

fig07

ここでトポロジペンツールを起動して、モードを「移動」にしてドラッグすると、

fig08

頂点、エッジ、ポリゴンを背景に沿って移動できる。

fig09

この時マウスのボタンやキーボードショートカットを組み合わせると動作が切り替えられる。

  • 左ボタン = 移動
  • 右ボタン = エッジループ移動
  • 中ボタン = 分割
  • Shift+左ボタン = 複製
  • Shift+右ボタン = ループ複製
  • Shift+中ボタン = ループ追加
  • Ctrl+左ボタン = エッジスライド
  • Ctrl+中ボタン = 除去

右ボタンドラッグの「エッジループ移動」は連なったエッジを一括して移動するモード。

fig10

中ボタンドラッグの「分割」は頂点をドラッグしてポリゴンを分割するモード。

fig11

Shift+左ボタンの「複製」は頂点やエッジを接続状態を保ったまま複製する。その結果、そこから新たなポリゴンが生成される。また、スマートスナップ機能で近くのエッジやポイントにドラッグすると、エレメントがスナップして融合する。

fig12

Shift+右ボタンの「ループ複製」はループエッジを一括して複製するもので、Shift+中ボタンの「ループ追加」はエッジをクリックしてそこにループエッジを追加するもの。

fig13

CTRL+左ボタンドラッグの「エッジスライド」は最初にドラッグした方向と周囲のエッジの方向から移動方向が拘束される移動。

fig14

CTRL+中ボタンクリックの「除去」はクリックしたエレメントをメッシュの接続状態を保ちながら取り除く。

fig15

続きはまた次回。

カテゴリー別ページ



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

2012年04月25日

スキンモディファイヤについて調べて見た その15 3dsmax 2012 SP2

ギズモを使ったスキンモディファイヤの補正は適用に使うボーンの角度に方向が無いために自由度が大きい関節では余計な影響が出てしまうという欠点がある。

下のGIFアニメはZ軸回りに90度回転させて、次にY軸回りに90度回転させてみたもの。アングルデフォーマをドライブする角度はX軸回りでもY軸回りでも同じ角度としてしか認識されない。Y軸回りに90度回転させたところでモーフアングルデフォーマでモーフターゲットを設定しているので、Y軸回りに90度回転させた時は綺麗に曲がるんだけど、X軸回りに90度回転させても同じモーフターゲットが適用されるので、変な形状になってしまっている。

fig01

そこでX軸回転とY軸回転を分離してみた。

fig02まずは作成パネルのヘルパーパネルでポイントを選んで2つポイントを作成した。わかりやすいようにボックスと座標軸を入れて、名前もRotate_Y、Rotate_Zにして、2つのポイントのサイズも重ならないように変えた。

作った2つのポイントをBone001にペアレントしてBone002と同じ位置に配置する。

fig03

2つのポイントを選択してから位置合わせツールをクリックして

fig04

名前による選択ボタンを押して

fig05

リストからBone002を選択してOKを押した。

fig06

位置合わせのダイアログが出るので基点と方向をあわせるかたちでOKを押す。

fig08

これでBone002と位置と方向が一致した。

fig09

次にスケマティックビューボタンを押してスケマティックビューを表示して、

fig25

リンクボタンを押して2つのポイントをBone001にリンクする。

fig10

次に選択を解除してからメニューバーから「アニメーション」→「ワイヤーパラメータ」→「パラメータワイヤリングダイアログ」を選択してパラメータワイヤリングダイアログを表示する。そしてBone002のRotationのY回転チャンネルをRotate_YのRotationのY回転チャンネルに接続する。そのためにパネルの左右のリストを展開して、接続するチャンネルを見つけ出して選択する。そして接続方向の矢印ボタンを押してBone002からRotate_Y方向にコントロールする事を指定して、「接続」ボタンを押す。

fig12

同様に選択を解除してからメニューバーから「アニメーション」→「ワイヤーパラメータ」→「パラメータワイヤリングダイアログ」を選択してパラメータワイヤリングダイアログを表示する。そしてBone002のRotationのZ回転チャンネルをRotate_ZのRotationのZ回転チャンネルに接続する。

fig13

これでBone002のY回転とZ回転が分離されて2つのポイントの回転になった。

fig14

次にスキンモディファイヤに戻ってボーンとして2つのポイント(Rotate_Y、Rotate_Z)を加える。

fig15

これらのポイントがメッシュに影響を与えちゃまずいのでウェイトテーブルで影響を外す。ウェイトテーブルのオプションメニューから「グローバルを表示」を選択してリストの上にグローバルエリアを表示し、Rotate_YとRotate_Zの下でSHIFT+右クリックでウェイトを削除する。

fig16

これでRotate_YとRotate_Zはどのポイントにもウェイトが存在しない状態になった。気をつけなくちゃならないのはこの操作でポイントが影響しているメッシュポイントのMフラグがONになる事で、これでそれらのメッシュポイントはエンベロープの影響を受けないウェイト値が焼き付けられた状態になってしまう事だ。それを避けたければ除外リストにチェックを入れる方式でポイントの影響を消してもいいね。

fig17

次に「エンベロープを編集」をONにし、「頂点」をONにして、モーフアングルデフォーマーで補正する頂点を選択する。

fig18

そして、ボーンリストからRotate_Yを選択して、ギズモリストに「モーフアングルデフォーマー」を追加する。

これでボーンを回転させると、ボーンがY軸回転の時だけ、モーフアングルデフォーマの現在のアングルの表示が変わるようになる。

ボーンをY軸回転させて、補正が必要な位置まで動かし、モディファイヤスタックに「メッシュを編集」を加える。

fig19

そして頂点サブオブジェクトレベルに切り替えて頂点を移動し、メッシュ形状を整える。

fig20

モディファイヤスタックで「スキン」モディファイヤをクリックして切り替えて、

fig21先に追加したモーフアングルデフォーマーがギズモリストで選択されている事を確認して、「変形パラメータ」ロールアウトの「スタックから追加」ボタンをクリックして現在の形状をモーフターゲットとして記録する。ついでに変形パラメータロールアウトの上の編集ボックスに「Morph_Rot_Y」と入力して、このデフォーマに名前をつけておく。

モディファイヤスタックに追加した「メッシュを編集」モディファイヤはこのままではメッシュに悪影響を及ぼすので、削除する。

これでボーンのY軸回転にしか反応しないモーフアングルデフォーマが出来た。下のGIFアニメはその様子。Z軸回転した時にモーフアングルデフォーマの影響で歪んでいたメッシュが歪まなくなった。

fig22

同様の工程で今度はRotate_Zにモーフアングルデフォーマーを設定する。

まずボーン回転をニュートラルな状態に戻し、ボーンリストからRotate_Zを選択して、ギズモロールアウトでモーフアングルデフォーマを追加する。そしてこのデフォーマーに「Morph_Rot_Z」という名前をつけておく。

ボーンを今度はZ軸で回転させて補正位置にもって行き、モディファイヤスタックにメッシュ編集モディファイヤを加えて、ポイントサブオブジェクトレベルでメッシュの頂点を移動して形状を整える。

モディファイヤスタックから「スキン」を選択して切り替え、ギズモリストで「Morph_Rot_Z」が選択されている事を確認して、「スタックから追加」を押して、現在の形状をモーフターゲットとして取り込む。

最後にモディファイヤスタックから「メッシュ編集」モディファイヤを削除する。これで2方向の回転に独立したモーフアングルデフォーマがかけられるようになった。下がその結果。

fig23

これは2つの変形ポイント間で回転してみたもの。

fig24

今回はボーンの回転を直接ポイントの回転にリンクしたけど、その辺をもう少し工夫ふればさらに精度の高い補正が可能かも知れないね。

それではまた次回。

maxまとめページ



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

2012年04月24日

modo601が来た! その14

今回はアクター、ポーズについて調べてみた。

この機能はアイテムやチャンネルを一括して扱うためのグループという仕組みをキャラクターアニメーションの方面から使ったもので、インターフェースとしてはアニメーションタブの下側に出る「アクター」「アクション」「ポーズ」のインターフェースとグループリスト、グループアイテムのプロパティのグループタグなどから構成されている。

fig01

これらを使うとアイテムやチャンネルを集めて名前をつけてグループ化でき、各チャンネルの値やそのアニメーションデータもまとめて名前をつけて保存、読み出しが出来るようになる。

ここで最初に書いておくけど、自分が調べた限りでは、この機能を使って作ったアニメーションクリップ(アクションと呼ぶ)をレイヤー合成するような機能は残念ながら実装されていないようだ。

出来るのはアクターと呼ばれるアイテムとチャンネルのグループ登録と一括キー打ち、アクションと呼ばれるアクターのアニメーションデータの登録と切り替え、ポーズと呼ばれるアクターのチャンネル値セットの保存と読み込みかな。登録されたものは全てグループリストにアイテムとして表示されるので複製や削除が簡単に出来るよ。

例えば下のように立方体、球体、円錐体の3つのアイテムがあって、それぞれのローカルの中心点が底面にあり、

fig02

このようなペアレントの関係にある時に

fig03

これらをアクター登録するには、アニメーションタブに切り替えて、全てのアイテムを選択(一番ルートのアイテムをダブルクリックすればいい)し、アクターの右側にある「新規」のボタンをクリックする。

fig04

すると、下のような「グループの作成」ダイアログが出る。ここで名称を入力して、種類として「アクター」を、モードとして「選択アイテムから」を選んで「OK」ボタンを押す。

fig05

これでアクターが登録され、グループリストに入力した名称のアクターアイテムが表示され、アクターのプルダウンメニューの中にも出てくるようになって、アクターの切り替えが出来るようになる。

アクター作成の時のモードは、

  • 選択アイテムから
  • 選択チャンネルから
  • アイテム編集から
  • チャンネル編集から

の5つから選択出来て、何も入っていないグループだけの作成か、アイテムのグループか、チャンネルのグループかを選べて、さらにグループに入れるものを選択したものから選ぶのか、それとも「編集」されたものから選ぶのかを切り替えられる。

この「編集」という言葉はポーズの保存の時にも出てくるんだけど、いったい何の事だろうと思って調べたら、どうやらセットアップモードによる基準状態とかそこからアニメーションするなりして変遷しているシーン上での状態、またはツールなどで直前に変更された状態などを区別するための仕組みのようで、チャンネルについては「setup」「edit」「scene」の3つの状態がとれるらしい。そして上記の「編集」とはこの「edit」になっている部分の事のようだ。

fig07

「edit」はチャンネルが変更されるとこの状態になるんだけど、セットアップモードと通常モードを切り替えたり、タイムスライダーを動かしてフレームを切り替えたりするとリセットされて、「setup」か「scene」に切り替わる。「setup」はバインドされた時点の状態で、「scene」はそこから手が加わった状態かな。バインドされていないアイテムなら、セットアップモードに切り替えるたびに「setup」状態に戻るし、「edit」状態からタイムスライダを動かすと「scene」に移行する。バインドされているものはセットアップモードと通常モードで「scene」と「setup」が切り替わる。

「edit」の状態はこの、フレームの変更やモードの変更などによってキャンセルされるまでの間に変更した部分ってことだ。

さて、グループリストを展開してみると、グループには最初からアクションやポーズ、アイテム、チャンネルなどのサブカテゴリが存在している。そしてこのリスト内で追加や削除や複製などを行う事ができる。

fig06

アクターは「キー」ボタンで一括してキーフレームを打つことが出来る。

fig08

その場合、キーが打たれるのはアクターに含まれるアイテムのチャンネル、またはチャンネル自身にあらかじめキーが打たれていてキーフレームアニメーションできる状態になっている必要がある。

先にアクター登録したアイテムには1つもキーが無い状態なので、このままでは「キー」のボタンは有効にならない。ここで円錐をアイテム選択して、その回転チャンネルにキーを打ってみる。

fig09

回転チャンネルに一括してキーを打つならこんなボタンもあるし、

fig11

直接プロパティパネルの各チャンネルの○をクリックしてキーを打ってもいい。○が赤くなったらキーが打たれているわけだ。

fig10

これでこのアクターに対して、これらのチャンネルには一括してキーが打てる。例えば自動キーをオフにして、チャンネルを変更しても自動的にキーが打たれない状態にしておいて、

fig12

ここで1回キーを押す(タイムスライダー:0フレーム)。

次にタイムスライダーを動かしてフレームを変更し、アイテムチェーンの一番親のBOXをダブルクリックしてアイテムチェーン全部を選択し、回転すると、このように全てのアイテムが回転する。

fig13
 

この状態で「キー」のボタンを押すと、円錐の回転にのみキーが打たれる。他のチャンネルはキーが無くてアニメーションできる状態になっていないので、キーが打たれないから、タイムスライダを最初に円錐にキーを打った位置に戻すと、円錐だけ復元して、他のアイテムは回転したままの状態になる。

fig14

再びフレームを0に戻して、アイテムを全て選択したままリセットの「回転」を選んで全ての回転をリセットして元の状態に戻し、今度は全てのアイテムの回転チャンネルにキーを打って同様の事をしてみると、フレーム間で全てのアイテムの回転チャンネルにキーが打たれてアニメーションするようになる。

fig15

このようにアクター登録し、チャンネルにキーを打っておくと、それらのチャンネルは「キー」ボタンで一括してキーが打てる。

次はポーズを見て行きたい。ポーズはアクターに登録されているアイテムのチャンネルやチャンネルの値のセットを保存したり呼び出したりする仕組みだ。

fig16

ポーズを登録するにはまずアイテムを登録して、そのアクターをアクターメニューから選択しておく必要があるよ。ポーズを登録したいアクターが指定されているのを確認したら、アクターにポージングさせ、「保存」ボタンを押す。すると以下のダイアログボックスが出る。

fig17

ここで、ポーズの名称を入力して、下の3つのオプションを設定してOKを押せば、ポーズが登録される。オプションは以下の通り。

  • ソースアイテム
    • アクターアイテム
       アクターに登録されているアイテム全てがポーズ登録の対象になる
    • 選択アクターアイテム
       アクターに登録されているアイテムのうちの選択されているアイテムのみがポーズ登録の対象になる
  • ソースチャンネル
    • 編集
       直前に編集してチャンネルが「edit」の状態になっているもののみを登録する
    • アニメーション
       キーフレームアニメーションになっているチャンネルの現在値を登録する
    • 全て
       アニメーションチャンネルも変更チャンネルも両方とも登録する
  • トランスフォームのみ
     移動、回転、スケールのチャンネルのみを登録対象とする


 たとえば先にアクター登録したものを以下のように回転させてみた。

fig18

この状態でタイムスライダとか動かしちゃうとedit状態がリセットされちゃうからイランことしないですぐさまポーズの「保存」ボタンを押して、以下のようにソースアイテム「アクターアイテム」、ソースチャンネル「編集」にしてポーズを登録する。もし、回転チャンネルにすべてキーが打たれていて、アニメーション可能になっているならソースチャンネルは「アニメーション」または「全て」でもOKだ。

fig19

これでポーズが1つ登録された。リセットの「回転」で全アイテムの回転を戻してから、ポーズのプルダウンで今登録したポーズを選択し、「設定」ボタンを押すと、

fig21 

現在のフレームにポーズが再現された。 

fig20

ただし自動キーがOFFの場合はキーが打たれないのでタイムスライダを動かすとポーズが元に戻ってしまう。この姿勢を保ちたいなら「適用」ボタンを押して、現在フレームに、ポーズで変更されたアイテムに対してキーを作成すればいい。また、ポーズを設定したけど破棄したい場合は、設定直後なら「破棄」ボタンでクリアできる。

fig29

以上のように、ポーズを登録する時は「保存」、呼び出すときは「設定」を、そのチャンネルにキーを打ちたければ「適用」を設定したポーズを破棄したいなら「破棄」を使えばいいわけだ。

最後にもうちょっとだけ書いておくと、ソースチャンネルの「編集」と「アニメーション」の違いは以下の通りだ。

例えば下の画像は円錐のX方向のサイズとZ軸回転を変更してある。回転の方はフレーム0にキーが打たれていて、現在のフレームにはキーは打たれていない。

fig22

チャンネルを見るとこのようにスケールXだけがeditになっている。

fig23

この状態でアニメーションと編集の2つの方法でポーズを保存してみた。

fig24

fig25

そして変更をすべて元に戻して

fig26

これにアニメーションをソースとして保存したpose2を設定してみたのがこれだ。回転はしているけどスケールは変わっていないのがわかる。これはポーズとしてキーフレームが無いチャンネルは保存しなかったためだ。

fig27

再び元に戻してから今度はpose3を設定してみた。これがその結果。登録した時にチャンネルで「edit」になっていたのはスケールだけだったので、こちらはスケールだけが再現されているのがわかる。

fig28

「全て」を選べばこの両方の値がポーズとして登録されるわけだね。

今回の例ではアクター全体のポーズだけやったけど、部分的に登録する事もオプションから明らかだね。

それではまた次回。

カテゴリー別ページ



take_z_ultima at 13:49|この記事のURLComments(0)TrackBack(0)modo | CG

2012年04月23日

スキンモディファイヤについて調べて見た その14 3dsmax 2012 SP2

今年もまたmaxの新バージョンの季節がやって来たな。さっそく自分の所にもmax2013が届いたよ。

さて、前回はギズモの中からジョイントアングルデフォーマを調べてみた。 バルジアングルデフォーマについてはジョイントアングルデフォーマーと大差無いからいいかな。2つの違いについては調べたね。

今回は残りのモーフアングルデフォーマについて調べてみたい。ジョイントアングルデフォーマとバルジアングルデフォーマがラティスを使ってメッシュを変形していたのに対して、モーフアングルデフォーマはモーフマップを使って変形させる。

例えば下のようにボーンを曲げた時に折れ曲がったところが痩せるので、これを補正するためにモーフアングルデフォーマを使うには、

fig01

まず、ボーンにデフォーマーの影響の必要無いニュートラルな状態の姿勢と、補正の必要な折れ曲がった状態の2つの状態のキーフレームアニメーションをつけておく。こうすればタイムスライダを動かすだけでボーンを回転させてスキンモディファイヤの影響を確認できる。

fig04

fig03他のギズモと同じように「エンベロープを編集」をONにし、頂点が選択出来るように「頂点」にチェックを入れて、回転によってデフォーマを制御するボーンを選択し、

デフォーマーで補正したい頂点を選択する。

fig02

次にタイムスライダを移動させてボーンをニュートラルな状態にしてから「ギズモ」ロールアウトのプルダウンから「モーフアングルデフォーマ」を選択して、「+(ギズモを追加)」ボタンを押す。これでギズモリストにモーフアングルデフォーマが1つ追加される。

fig05

そしてこのモーフアングルデフォーマが選択されている時は「変形パラメータ」ロールアウトが表示される。

fig06このロールアウトの一番上のテキストボックスはこのデフォーマーの名前を修正するための編集ボックスで、ここに名前を入力すると、ギズモのリストに表示されている名前が修正できる。

その下の「親と子」がモーフ量をコントロールするための角度を計算するためのボーンで、モーフアングルデフォーマを追加するときに選んだのは「子」の方のオブジェクトだ。そしてその下の「現在のアングル」がこれら2つのオブジェクトの成す角度だ。この事からデフォーマーを登録する時に選択できるオブジェクトはペアレントされた子の方でなければならない。

その下がモーフターゲットのリストで、角度をキーにして登録することで、角度によってモーフターゲットが切り替わるようになる。

すぐ下のテキストボックスはこのリスト項目の名前を書き換えるためのものだ。

ロールアウトが出たらタイムスライダーを移動してボーンを修正したい姿勢に切り替える。

fig08

次にモーフターゲットを追加していくんだけど、モーフターゲットを取得するには現在のモディファイヤスタックの状態から取得する方法と他のノードから取得する方法の2つの方法があって、「スタックから追加」と「ノードから追加」の2つのボタンで行える。

まず「ノードから追加」の方法から。

ノードから追加は同じ構造のメッシュで変形後の理想の形状になっているオブジェクトを作って、それをモーフターゲットとして登録するものだ。だからそのためのターゲットをまず作らなくちゃならない。そこでメニューバーから「ツール」→「スナップショット」を選択し、

fig07スナップショットダイアログのクローン方式で「メッシュ」を選択して「OK」を押し、現在の変形状態のメッシュを生成する。

このままだと生成したメッシュがオリジナルと重なっているので、「名前による選択(ショートカットキーH)」などで生成したメッシュを選択し、あいているスペースに移動する。

fig09

次にターゲットの方のメッシュ形状を修正して理想の形状にする。ただしここで修正が有効なのは、モーフアングルデフォーマを登録する時に選択した頂点のみで、それ以外の頂点の変形は登録の時に全て無視される。

fig10

 出来たらオリジナルのオブジェクトに切り替えて、

fig11ギズモリストでターゲットを登録したいモーフアングルデフォーマが選択されている事を確認し、ボーンの角度がターゲットを登録する角度になっている事を確認して、「ノードから追加」をクリックし、次に修正したターゲットのオブジェクトをクリックする。これでリストに現在のボーンの角度でモーフターゲットが登録され、ボーンがその角度になった時に該当するモーフターゲットが適用されるようになる。

これがその結果。綺麗に曲がるようになった。

fig12

ターゲットは登録が済んだら必要ないので削除しても構わない。

次は「スタックから追加」の方法。これは現在のオブジェクトの状態をモーフターゲットとして使う方法だ。

fig13まずターゲットとするために現在のオブジェクトの形状を修正しなくちゃならない。そのためにモディファイヤリストから「メッシュを編集」を選択してモディファイスタックに追加する。
これでスキンモディファイヤで変形されたオブジェクトをメッシュとして修正できるので、頂点サブオブジェクトレベルに切り替えて頂点を移動して形状を整える。

もしペイント変形とかを使いたいなら「メッシュ変形」のかわりに「ポリゴンを編集」を追加すればいい。

fig14

とにかく形状を理想のものに修正できたらモディファイヤスタックからスキンモディファイヤを選択して切り替える。この時「最終結果を表示」ボタンがONになっている事を確認する。

fig15

そして「変形パラメータ」ロールアウトから「スタックから追加」ボタンを押す。これでこのボーンの角度に対してのターゲットが現在の形状で登録される。ただし、その登録された形状に対してさらに「メッシュを編集」モディファイヤが作用するので、ビューポート上のメッシュの形状はおかしな事になる。

fig16

もう「メッシュを編集」は必要無いのでモディファイヤスタックで「メッシュを編集」を右クリックして「削除」を選んで削除する。

fig17

これでモーフターゲットとして正しくメッシュに適用されるようになった。

以上、2通りの方法でモーフターゲットを登録する事ができる。これでスキンモディファイヤによる変形だけではうまく行かない変形をある程度補正する事ができるようになった。でも前回書いたようにボーンの回転方向によってはこれがおかしな作用をする事もある。そこで回転角度を軸ごとに分離してモーフターゲットを2重にする方法なんてのもやってみたんだけどその話はまた次回。

maxまとめページ



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