2016年05月27日

modo901/902/10の新機能を調べてみた その90

さて、前回Unityにモデルを出力しようとしたら警告が出てうまく出力できなかったってところまでやった。これについてインポータースクリプト添付のマニュアルを読むと以下の記述が見つかった。

・Detail UV - Modo assumes that all of your main textures are using the first set of UVs on your mesh. This works similarly in Texture Wrap values. If the UV map of your Albedo texture and Detail Albedo texture differ, Modo assumes that your detail map uses a second UV set. The material importer script then sets the detail maps to use the second UV set.

つまりインポーターが生成するシェーダーは1つのメッシュに「main」と「second」の2つのUVセットが使える仕様にはなってるけど「second」でマッピング出来るのは「Detail」マップだけのようで、同じエフェクトで異なるUVマップという割り当ては出来ないようだ。

そこで詳細な表現が必要な「Head」側のマップのエフェクトを以下のように変更した。そしてイベントログに出てきた忠告通りUVマップの順番が明確になるように名前をちょっと書き換えた。

fig20

これで改めて「出力」ボタンを押すと、今度はちゃんと出力された。

Unity側で確認すると「Project」パネルは下のようになって、マテリアルやテクスチャなどが読み込まれている。

fig21

ここで読み込まれたモデルをシーンにドロップしてみた。

fig22

するとこのように頭部に画像がマッピングされていない・・・。

fig23

「Project」パネルの「Materials」をあけると「BMan0015-Head」が見つかるのでこれを選択すると、

fig24

「Inspector」パネルに頭の方のマテリアルの設定が表示される。これを見ると2枚の画像が「Secondary Maps」として読み込まれているのが確認できる。で、よく見ると「UV Set」が「UV0」になっていて、2枚目のUVマップが割り当てられていない事がわかった。

fig25

そこでこれを「UV1」に変更すると

fig26

このようにやっとちゃんとマッピングされた。

fig27

それではまた来週。

modo901ブログ目次



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

2016年05月26日

3ds Max 2016の新機能を調べてみた その94 3dsmax 2016

引き続き「Maxクリエーショングラフ」の「MCG_lookAt」コントローラのパラメータロールアウトについて調べてみたい。

今回は「Weights」の「Set」ボタン。

fig03

このボタンの定義を見ると名前が「updateSelected_Weights_UI」になっているので、

fig01

このボタンが押された時のハンドラは「on updateSelected_Weights_UI pressed」になる。

fig02

ここではまず「mcgAPOps.GetSelectionIndices Combined_UI」で「ListView」で選択されている項目の番号リストを「indicies」に取り込む。そしてこの番号に対応する「Weights_Tab」の要素の値をスピナーの値で置き換える。

終わったら「FillTargetsListView()」で「Combined_UI」の「ListView」を更新する。

「FillTargetsListView()」が実行されると選択状態が解除されるので、最後に「SelectListviewTargets indicies」で「indicies」に記録されている番号のリストアイテムを再び選択状態に戻す。

これで「ListView」コントロールに表示されているアイテムで選択さrているもののウェイト値がスピナーの値で置き換えられて、対応する「Weights_Tab」の値も修正される事になる。

ところで「Weights_Tab」が修正されると「on Weights_Tab set」ハンドラが呼び出される。

fig03

このハンドラの中でも「FillTargetsListView()」が呼び出されて「ListView」が更新される事になる。これはなんか無用なような・・・。

以上で「ListView」のUI関係はだいたい把握出来たかな。

それではまた次回。

maxまとめページ



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

2016年05月25日

modo901/902/10の新機能を調べてみた その89

前回は「Unityマテリアル」のパラメータについて調べてみた。今回はゲームレイアウトでモデルをUnityに出力してみたい。

まずUnity側で新しいプロジェクトを作って、そこにmodoマテリアルのインポートスクリプトを読み込む。そのためにまずスクリプトをダウンロードする。Unityの「Window」メニューから「Asset Store」を選んでアセットストアに接続する。

fig01

次に検索ワード「modo」でストアを検索する。

fig02

「MODO Material Importer」が見つかったらこれをクリックして開くと、

fig03

このような画面になるので「ダウンロード」ボタンを押してダウンロードする。

fig04

そして「インポート」ボタンを押せば、

fig05

インポートダイアログが出るので「Import」ボタンを押す。

fig06

これで「Project」パネルの「Assets」フォルダに下のようにフォルダーが出来てスクリプトがインポートされる。

fig07

他のプロジェクトでこのスクリプトを使う時は同様のフォルダを「Assets」フォルダにコピーすればいい。

modo10で「レイアウト」レイアウトに切り替えて「メッシュ」タブから「Man aXYZ design01.lxl」をダブルクリックでシーンに読み込んだ。これをUnityに出力してみたい。

fig08

まずマテリアルを修正する。このモデルはイメージマップとして「BMan0015-Body-D」、「BMan0015-Head-D」が「法線」「ディフューズの色」としてメッシュアイテム「Man aXYZ design 01.lxl」に割り当てられている。

fig09

UVマップは1つのメッシュレイヤに

「BMan0015-Body」

fig12

「BMan0015-Head」

fig13

の2つが割り当てられている。

そして画像の方はディフューズカラー用の「−D」バージョンと法線マップ用の「−N」バーションが読み込まれる。せっかくあるんだからこっちを法線マップ用に使うことにする。

fig11

そしてシェーダーツリーをとりあえず修正したのが以下だ(「とりあえず」と書いたのは実はこれだとエラーが出るからなんだけどそれはまた後で)。「BMan0015-Body-N」と「BMan0015-Head-N」を読み込んでエフェクトを「Unity Normal」に、「ディフューズの色」を「Unity Albedo」に、「material」を「Unity Material」にした。

fig14

また、「BMan0015-Body-N」のプロジェクションタイプを「UVマップ」に、UVマップを「BMan0015-Body」に、「BMan0015-Head-N」も同様にUVマップを「BMan0015-Head」にした。

これで「ゲームツール」レイアウトでこのように表示されて効果が確認出来る。

fig15

「ゲームツール」レイアウトで「ゲームプリセット」として「Unity」を指定して、「出力ディレクトリ」としてUnityのプロジェクトの「Assets」フォルダを設定する。

fig16

さらに「テクスチャをコピー」をONにする。Unityを起動してモデルを渡したいプロジェクトを開いておいて「出力」ボタンを押すと、

fig17

これでUnityにモデルが渡されたら良かったんだけど下のように警告ダイアログが出る。とりあえず「いいえ」を押して出力は中止した。

fig18

イベントログを表示してみると以下のようになっている。

fig19

つまり「BMan0015-Head-〜」のUVマップのインデックスが1より大きくなっちゃったのが原因らしい。modoのビューポートでは問題なく表示出来てるのにね。

このように1つのメッシュに対して単純に2つのUVマップを設定して画像マップを貼り付けるのはこの方法じゃダメなようだ。

続きはまた次回。

modo901ブログ目次



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

2016年05月24日

3ds Max 2016の新機能を調べてみた その93 3dsmax 2016

引き続き「Maxクリエーショングラフ」の「MCG_lookAt」コントローラのパラメータロールアウトについて調べてみたい。

前回は単純なサンプルをもとに「Remove Selected」ボタンの動作を調べてみた。今回は「MCG_lookAt」コントローラの方の「Remove Selected」ボタンを調べてみたい。

fig03

「Remove Target」ボタンが押された時に呼び出されるハンドラは以下の通り。

on removeFromList_Targets_UI pressed do with undo label:"Remove Targets" on (
 local indicies = mcgAPOps.GetSelectionIndices Combined_UI
 mcgAPOps.INodeA_RemoveFromList Combined_UI Targets_Tab
 for index in indicies do
 (
  if index < Weights_Tab.Count do deleteItem Weights_Tab (index+1)
 )
)

太字の部分はデフォルト状態の前回のものと同様のコードになっていて、「Combined_UI」の「ListView」コントロールのリストで選択されたアイテムの番号を調べて対応する「Targets_Tab」の要素を削除するようになっている。

「Targets_Tab」が変更されたら自動的に「on Targets_Tab tabChanged」ハンドラが呼び出されて「Combined_UI」の方に「Targets_Tab」の変更を反映しようとする事になる。

on Targets_Tab tabChanged action index count do
(
 Targets_List.clear()
 if (paramsOpen) do (
  this.params.FilltargetsListView()
  if (action == #insert) then (
   local sel = #()
   append sel (index - 1)
   this.params.SelectListviewTargets sel
  )
  else if (action == #append) then (
   local sel = #()
   append sel (Targets_Tab.Count - 1)
   this.params.SelectListviewTargets sel
  )
 )
)

でも「Combined_UI」は「Weights」欄もあって、これに対応する「Weights_Tab」の方も「Combined_UI」で選択されているアイテムに対応して削除する必要がある。そこで「Targets_Tab」の処理を始める前に

local indicies = mcgAPOps.GetSelectionIndices Combined_UI

を実行して「indicies」に「Combined_UI」で選択されているアイテムの番号の配列を取得して、

for index in indicies do
(
 if index < Weights_Tab.Count do deleteItem Weights_Tab (index+1)
)

の部分で一気に「Weights_Tab」の対応する要素を削除している。当然こっちの変化に対しても「on Weights_Tab tabChanged」ハンドラが呼び出されて「Combined_UI」の方に「Weights_Tab」の変更を反映しようとする。

on Weights_Tab tabChanged action index count do
(
 Weights_List.clear()
 if (paramsOpen) do
  this.params.FilltargetsListView()
)

以上を見て行くと、だったら「mcgAPOps.INodeA_RemoveFromList 」なんか呼び出さないで上の「for」文の中で一緒に「Targets_Tab」も削除しちゃえばいいじゃないと思うところだ。実際「mcgAPOps.INodeA_RemoveFromList 」の中でさらに「mcgAPOps.GetSelectionIndices Combined_UI」が呼び出されていたりして処理がダブったりしている。

ただコードをよく眺めてみると、「Tab」の変更ハンドラの中から呼び出されて「ListView」を更新する「FillTargetsListView」ファンクションの中では、現在の「Targets_Tab」と「Weights_Tab」の要素数が等しいかどうかをチェックしていて、2つが等しい時しか「ListView」の更新が行われないようになっている。

fn FillTargetsListView = (
 global theListView = Combined_UI
 local theRange = #()
 local lineNumber = 1
 if (Combined_UI != undefined) do (   Combined_UI.Items.Clear()
  if (this.Targets_Tab.Count == this.Weights_Tab.Count) do
  (
   for o in this.Targets_Tab do
   (
    local li = dotNetObject "System.Windows.Forms.ListViewItem" (mcgAPOps.INodeToStringFunc o)
    li.ToolTipText = (mcgAPOps.INodeToStringFunc o)
    local subli = li.SubItems.add (this.Weights_Tab[lineNumber] as string)
    append theRange li
    lineNumber = lineNumber+1
   )
   Combined_UI.Items.AddRange theRange
  )
 )
)

「on removeFromList_Targets_UI」内の処理で「Targets_Tab」と「Weights_Tab」の要素数が同じになるのは「Targets_Tab」も「Weights_Tab」も「ListView」で選択されている要素が全て削除された時だけになるので、「FillTargetsListView」は「Targets_Tab」や「Weights_Tab」が1つ変更されるたびに呼び出されるけど、実際に「ListView」を更新するのは2つの「Tab」の不要な要素の削除が全て終わった時だけってことになる。もしfor文のループ内で2つの「Tab」の要素を1つずつ削除していくループにしたら2つの要素数はループ1回ごとに等しくなり、「ListView」の更新が頻繁に起きることになる。もちろんもう少し効率のいいコードには出来ると思うけどね。

続きはまた次回。

maxまとめページ



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

2016年05月23日

modo901/902/10の新機能を調べてみた その88

modo10でゲーム開発環境に出力するための専用レイアウトが追加された。

fig08

レイアウトの下には様々なパレットのスイッチがあって、

fig09

それをON/OFFすることでパレットの構成をワンタッチで切り替えられる。

fig11

そしてゲームツールにはゲーム開発環境への出力用の仕組みが集められている。

fig10

あわせてゲーム環境用(UnityとUnreal)のマテリアルなどが追加された。

fig13

当然マテリアルのパラメータもmodoのものとは違ってくる。

fig12

各パラメータはエフェクトとして画像マップに割り当て出来る。

fig14

ゲーム環境に出力するにはマテリアルは出力先にあわせたものに置き換える必要がある。

「Unityマテリアル」のパラメータを見て行くと、

「Base Albedo」はサーフェスのベースカラー。

fig15

「Metallic」はサーフェスのメタリックっぽさを決めるパラメータ。大きくすると鏡面っぽい光沢になる。

fig16

「Fresnel」は光沢の強さを決める。

fig17

「Smoothness」は表面がツルツルなのかザラザラなのかを決める。

fig18

「NormalScale」「DetailNormalScale」は「Main Map」「Secondary Map」と2枚ある「NormalMap」の強度を決める。

fig19

「Height Scale」は「Height Map」のスケールを決める。

これはエフェクトでは「Unity Bump」が当てられる。このパラメータの効果はmodoのビューポートでは確認出来なかったのでUnity側で変更してみたのが下のGIFアニメ。ノーマルマップと一緒に使うものらしい。

fig20

「Emissive Color」と「Emissive Level」は放射ライトの色と強度。

fig21

続きはまた次回。

modo901ブログ目次



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