2011年06月

2011年06月30日

modo501 SDK いじってみた その20 modo501 SP3

だいぶチャンネルモディファイヤの調べも付いてきたかなと思っていたら、「形状コンストレイント」に「メッシュ」というコネクタがあるのに気が付いた。

fig01

当然チャンネルタイプとしてこれも存在するだろうと思って調べてみたけど、定義されているタイプは以下の通りで「メッシュ」なんて見つからない。

#define LXsTYPE_INTEGER "integer"
#define LXsTYPE_FLOAT "float"
#define LXsTYPE_DISTANCE "distance"
#define LXsTYPE_PERCENT "percent"
#define LXsTYPE_ANGLE "angle"
#define LXsTYPE_FLOAT3 "float3"
#define LXsTYPE_DISTANCE3 "distance3"
#define LXsTYPE_PERCENT3 "percent3"
#define LXsTYPE_ANGLE3 "angle3"
#define LXsTYPE_TIME "time"
#define LXsTYPE_LIGHT "light"
#define LXsTYPE_STRING "string"
#define LXsTYPE_FILEPATH "filepath"
#define LXsTYPE_UVCOORD "uvcoord"
#define LXsTYPE_BOOLEAN "boolean"
#define LXsTYPE_AXIS "axis"
#define LXsTYPE_MEMORY "memory"
#define LXsTYPE_PIXEL "pixel"
#define LXsTYPE_FPIXEL "fpixel"
#define LXsTYPE_COLOR "color"
#define LXsTYPE_COLOR1 "color1"
#define LXsTYPE_MATRIX3 "matrix3"
#define LXsTYPE_MATRIX4 "matrix4"
#define LXsTYPE_DATETIME "datetime"
#define LXsTYPE_TOD "timeofday"
#define LXsTYPE_DATE "date"

ちなみにこのメッシュコネクタに適合するのはメッシュアイテムのチャンネルリストの一番下のmeshチャンネルだ。

fig02

これが繋いだところ。

fig03

形状コンストレイントはこの接続で対象とするメッシュを指定し、インデックスチャンネルでメッシュ内のポイントやエッジ、ポリゴンなどを指定してエレメントの位置情報を取得したりするものだ。

このスケマティックビューを眺めていてもしょうがないのでとりあえずクエリを使ってこのチャンネルを調べてみる事にした。

メニューからレイアウト→パレット→コマンド履歴を選んでコマンド履歴パネルをフローティング状態で表示させて履歴のタブを選択してからスケマティックビューに追加したVertexPosition:Meshノードを選択した。するとコマンド履歴に以下の3行が追加された。

schematic.toFront cmGeometryConstraint018 group017
select.node schmNode019 set
select.item cmGeometryConstraint018 add 

これを見るとこのチャンネルモディファイヤのアイテムIDはcmGeometryConstraint018のようだ。そこでシーンサービスのクエリのセレクタをこのアイテムにするためにコマンド履歴パネルの一番下にあるコマンド入力に以下のクエリを入力してEnterキーを押した。

query sceneservice item.name ? cmGeometryConstraint018

するとパネルの表示が「結果」タブに切り替わり、

Vertex Position:Mesh

と表示された。これで以降のシーンサービスのクエリのターゲットはこのアイテムになる。

次にこのアイテムに付いているチャンネルの数を調べた。

query sceneservice channel.N ?

結果は13だった。だからこのアイテムには0〜12番のチャンネルが存在する。そこで今度は0〜12のチャンネルの名前を1つずつ調べて「mesh」という名前のチャンネルを探した。すると4番のチャンネル名が「mesh」だった

query sceneservice channel.name ? 0

enable

query sceneservice channel.name ? 1

draw

query sceneservice channel.name ? 2

operation

query sceneservice channel.name ? 3

mode

query sceneservice channel.name ? 4

mesh

そこで4番のチャンネルについて調べてみると、

query sceneservice channel.type ? 4

storage

query sceneservice channel.subtype ? 4

mesh

query sceneservice channel.vecMode ? 4

0

query sceneservice channel.label ? 4

メッシュ

という結果になった。どうやらチャンネルタイプは「storage」らしい。他のチャンネルも調べてみたらトランスフォーム入出力両方ともチャンネルタイプは「storage」でサブタイプは「matrix4」だった。

次に「storage」をキーワードにマニュアルを検索してみるとlx_package.htmの中にIlxAddChannelインターフェースにSetStorageがあるとの記述が見つかった。

  LXxMETHOD( LxResult,
SetStorage) (
  LXtObjectID self,
  const char *stType);

解説は

Channels are added to packages using an IlxAddChannel interface. The NewChannel() method starts a channel definition, and the rest of the methods qualify it until the next channel is started.

だけ。どうやらパッケージクラスのpkg_SetupChannels()メソッド内で使ったNewChannel()に続けてSetStorage()を実行すると、そのチャンネルはStorageタイプになるようだ。このメソッドが対象にするチャンネルは最後にNewChannel()して作ったチャンネルなのでメソッドのパラメータにチャンネルを指し示すものは何もない。

ついでに「the rest of the methods」の残りも並べておくと

  LXxMETHOD( LxResult,
SetGradient) (
  LXtObjectID self,
  const char *inType);

   LXxMETHOD( LxResult,
SetVector) (
  LXtObjectID self,
  const char *vecType);

   LXxMETHOD( LxResult,
SetDefault) (
  LXtObjectID self,
  double defFlt,
  int defInt);

   LXxMETHOD( LxResult,
SetDefaultVec) (
  LXtObjectID self,
  double *defVec);

この方法でグラディエントやベクタータイプも設定出来るようだ。そしてstorageはそれ以外のユーザー定義型とでも言うモンのようだ。

以上からmeshコネクタを作るには、pkg_SetupChannels()メソッド内でNewChannel()した後にSetStorage()を呼び出せばいいところまではわかった。しかしNewChannel()する時のタイプは依然不明のままだ。

  LXxMETHOD( LxResult,
NewChannel) (
  LXtObjectID self,
  const char *name,
  const char *type);

チャンネルタイプは単なる文字列のデータで、整数なら"integer"、距離なら"distance"になっている。どうもこうして単に文字列で指定しているところを見ると、自由にタイプを設定できる事が前提なんじゃないかと思えて来た。そしてスケマティックビューで接続できるのはこれらの文字列が合致しているものってな感じかな。そこで振り返ってみるとトランスフォーム入力チャンネルがチャンネルタイプ「storage」でサブタイプは「matrix4」で、このチャンネルを設定するには

  LxResult
CLinearBlendPackage::pkg_SetupChannels (
  ILxUnknownID addChan)
{
  CLxUser_AddChannel ac (addChan);

  ac.NewChannel ("matrixInput", LXsTYPE_MATRIX4);
  ac.SetStorage(ストレージタイプを示す文字列);

       :

という具合になると予想できる。そこでサブタイプmatrix4をmeshに置き換えてわからないストレージタイプ文字列もmeshにしてチャンネルを追加してみた。チャンネルを追加するのに次の3つのメソッドの中の太字の部分を書き加えたよ。

  LxResult
CLinearBlendInstance::cmod_Allocate (
  ILxUnknownID cmod, // ILxChannelModifierID
  ILxUnknownID eval, // ILxEvaluationID
  ILxUnknownID item,
  void **ppvData)
{

        :

  // Lookup the index of the 'blend' channel and add as an input.
  modItem.ChannelLookup ("blend", &chanIdx);
  chanMod.AddInput (item, chanIdx);

  modItem.ChannelLookup ("mesh", &chanIdx);
  chanMod.AddInput (item, chanIdx);


  // Lookup the index of the 'output' channel and add it as an output.

        :

}

  unsigned int
CLinearBlendInstance::cmod_Flags (
  ILxUnknownID item,
  unsigned int index)
{

        :

if (LXx_OK (modItem.ChannelLookup ("inputB", &chanIdx))) {
if (index == chanIdx)
return LXfCHMOD_INPUT;
}

  if (LXx_OK (modItem.ChannelLookup ("mesh", &chanIdx))) {
  if (index == chanIdx)
    return LXfCHMOD_INPUT;
  }

       :

  return 0;
}

  LxResult
CLinearBlendPackage::pkg_SetupChannels (
  ILxUnknownID addChan)
{

       :

  ac.NewChannel ("output", LXsTYPE_FLOAT);
  ac.SetDefault (0.0, 0);

  ac.NewChannel ("mesh", "mesh");
  ac.SetStorage("mesh");

  return LXe_OK;
}

そして試してみたのが下の画像。スケマティックビューでmeshと接続できるようにはなった。そしてノードの一番下のコネクターのラベルが日本語で「メッシュ」になっているところを見ると、なんか合致するもんがあったんだろうな。

fig04

せっかく繋がったんだからこのリンクの先からメッシュデータが持ってこられるといいんだけど、チャンネルからの読込みには

  LxResult
ReadInputVal (
  ILxUnknownID attr,
  unsigned int inputIndex,
  void **val)

というメソッドがあるのでこれでvalにメッシュオブジェクトが渡ってきてくれているといいんだけどどうなのかな? ILxItem インターフェースには

  LXxMETHOD( LxResult,
ChannelStorageType) (
  LXtObjectID self,
  unsigned index,
  const char **type);

というのもあって、チャンネルのストレージタイプが調べられるみたいだし、

This method returns the storage type of the channel, which can be valid exo-type name for numeric and stored custom types.

とも書かれている。「valid exo-type name for stored custom type」がカギなのかな?

まだまだ謎は多いね。このあたりが判明すると、メッシュからいろんな情報を拾い上げてコンストレイントに持ってこられるんだけどね。

それではまた次回。

カテゴリー別ページ



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

2011年06月29日

3dsmax2012をいじってみた その19 3ds max 2012

ジェリーアンダーソンSF特撮DVDコレクション全部買うといくらになるんだろう・・・。

さて、ツールメニューの続きだ。

fig10

「UVWテンプレートをレンダリング」はUVマップを画像に変換する機能だ。その画像を下敷きにしてペイントソフトでテクスチャ画像を作成すれば、UVマップとの位置あわせが容易になる。

fig01メニューを選ぶと左のダイアログボックスが表示される。ここで一番下の「UVテンプレートをレンダリング」ボタンを押せば、下のようなレンダリング結果を表示するダイアログボックスが出る。ここで一番左のファイルに書き出すボタンを押せばUVマップの1X1のエリアの画像が書き出せる。

fig02

レンダーUVの「幅」と「高さ」は出力する画像のサイズを決めるもので、「アスペクト比を推測」ボタンを押すと、「幅」の値は固定したまま「高さ」の値だけ変更されてマップ画像のアスペクト比がポリゴン表面でできるだけ1:1になるように調整される。

例えば立方体のUVマップが下のように設定されている場合、
fig03

こんな縦横同じピクセル数の市松模様をマッピングすると、

fig04

オブジェクトはこんな感じになる。

fig05

ここでUVマップをこのようにU方向に縮めてみると、

fig06

マッピングされている画像の市松模様は正方形じゃなくなる。これは貼り付けられた画像のピクセルのアスペクト(縦横)比が1:1じゃなくなってしまったためだ。

fig07

このUVマップに対してレンダーUVの幅を1024にして「アスペクト比を推測」ボタンを押すと、高さが517になった。

fig08

レンダリングするとこのように横長の画像になる。

fig09

ここでこの画像を保存し、クラスターの位置に市松模様を貼ってみると

fig10

オブジェクトにマッピングされた画像は正方形の市松模様になった。

fig11

このように「アスペクト比を推測」は”できるだけ”ポリゴン表面のマッピング画像のアスペクト比が1:1になるように画像のサイズを調整する機能なわけだ。今回の例のように単純なものであれば綺麗に整えられるけど、実際はポリゴンごとにゆがみ方は様々になっているわけで、それを1枚の画像のアスペクト比を調整して全部OKになるわけは無いので、あくまでベターな状態を模索する機能なわけで「推測」となってるわけだね。

他の部分については簡単に説明しておくと、

「両面レンダリング」は裏返ってるUVマップもレンダリングの対象にするかどうかのスイッチ

「塗りつぶし」のカラーチップとアルファ値はクラスターを塗り潰す時の色とアルファ値だ。クラスターを塗り潰す方法は「モード」によって決まる。モードは「なし」「塗潰し」「法線」「シェーディング」の4通りが選べる。

「なし」の場合は塗り潰されない。

fig12

「塗潰し」の場合は指定の色で塗り潰される。

fig13

「法線」は頂点の法線をポリゴン表面でスムージングした法線マップ画像になる。下の画像は立方体に対して行ったものだけどエッジ部分の頂点は頂点を共有する面の法線の平均方向に法線が取られるために、エッジ部分と内側では色が異なっている。実際のポリゴンは平面なのに法線マップはエッジ部分でスムーズに変化するというなんともおかしな結果になってしまうので注意が必要だ。

fig14

「シェーディング」はツールが設定したライトを当てた時の陰影でクラスターを塗り潰す。レンダリングに使われるライトはシーンのライト設定とは無関係なようだ。

fig15

「オーバーラップ」はポリゴンが重なっている時にその部分を指定の色で塗り潰す機能だ。

「エッジ」のカラーチップとアルファはエッジの色とアルファ値を決めるものだ。

「可視エッジ」はポリゴンの縁にあるエッジをレンダリングするかどうか

「非表示エッジ」はポリゴンが内部表現で三角形ポリゴンの組み合わせになっていたりする場合に生じる表示されないエッジをレンダリングするかどうかの設定。

「シームエッジ」はクラスターの縁部分を別の色で塗るかどうかの設定。

とまあこんなところだ。

マッピングメニューには次の3つのメニューがある。

fig16

「フラッテンマッピング」は以前にUVWを編集ダイアログの「分解」ロールアウトの中に出てきた「フラット化」のボタンのシリーズの中の

fig15

fig16Flatten:Customのフライアウトにある設定ボタンと同じ機能だ。

「ノーマルマッピング」はオブジェクトを囲む色々なタイプの投影面にポリゴンを投影してUVマップを生成するツールだ。ツールを起動すると下のダイアログボックスが表示される。

fig17

ポリゴンはそのポリゴンに最も平行に近い投影面に投影される。投影面は次のものが選択出来る。

fig18

「前後のマッピング」「左右のマッピング」「上下のマッピング」はオブジェクトを挟む2枚の投影面にポリゴンを投影する。下のGIFアニメは3つの投影面を切り替えてマッピングしてみたものだ。2枚の投影面しかないからクラスタは2つに分かれる。

fig19

「ボックスの上部以外のマッピング」はオブジェクトを囲む前後左右の4面の投影面を使うもの。

fig20

「ボックスマッピング」は上下前後左右の6面投影。

fig21

ダイヤモンドマッピングはオブジェクトを囲む8面体への投影。

fig22

これはティーポットだとちょっとわかり辛いので球体を展開してみた。

fig23

これを見ると投影面はこんな感じの8面体であると推測(マニュアルには何も書いて無いし・・・)できる。

fig24

それではまた次回。

maxまとめページ



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

2011年06月28日

modo501 SDK いじってみた その19 modo501 SP3

今年ももう半分終わろうとしているんだねぇ。以前に買った地デジチューナー+ネットワークプレーヤーのHVT-BCT300は今月上旬にファームウェアがアップデートされてDLNAサーバー機能が付くって話だったので楽しみに待っていたら下旬に変更になっていた。その下旬もそろそろ終わりですが、期待して待ってます>IODATA

さて、ここまでわかったチャンネルモディファイヤ作成のための手順をまとめると、

  1. CLxImpl_Packageを継承したパッケージクラスを作り、static LXtTagInfoDesc descInfo[]とインスタンスを生成ためのファクトリーサーバーCLxPolymorph<> chanmod_factoryを追加し、pkg_SetupChannels ()、pkg_TestInterface ()、pkg_Attach ()をオーバーライドする。
  2. 1のクラスで生成されるインスタンスのクラスをCLxImpl_PackageInstanceとCLxImpl_ChannelModItemクラスを継承したクラスとして定義し、pins_Initialize ()、pins_Cleanup ()、pins_SynthName ()、cmod_Flags ()、cmod_Allocate ()、cmod_Cleanup ()、cmod_Evaluate ()をオーバーライドする。さらにこのインスタンスを生成するパッケージを示すポインター変数とCLxUser_Itemクラスのメンバー変数、インスタンスのインターフェースを格納するメンバー変数を用意する。
  3. 1で追加したstatic LXtTagInfoDesc descInfo[]は生成するインスタンスの親クラスがchanModifyであることを示すために、

    LXtTagInfoDesc CLinearBlendPackage::descInfo[] = {
     { LXsPKG_SUPERTYPE, "chanModify" },
     { 0 }
    };

    の部分が必須である。
  4. 1のクラスのコンストラクタでファクトリーサーバーにCLxIfc_PackageInstanceとCLxIfc_ChannelModItemのインターフェースを2で定義したインスタンスクラスをテンプレートクラスとして追加する。
  5. 1でオーバーライドしたpkg_SetupChannels ()の実装は、メソッドに渡された引数からCLxUser_AddChannelオブジェクトを作り、そのオブジェクトのNewChannel (チャンネルのラベル, チャンネルタイプ)メソッドを使ってチャンネルモディファイヤに必要な数のチャンネルを追加し、SetDefault (実数初期値, 整数初期値)で初期値を設定する。
  6. 1でオーバーライドしたpkg_TestInterface ()の実装は、引数で与えられたguidのインターフェースがファクトリーサーバーにあるかどうかを返すようにする。
  7. 1でオーバーライドしたpkg_Attach ()の実装はファクトリーサーバーのAlloc()メソッドでインスタンスを生成させ、そのインスタンスにそれを生み出したパッケージのポインタとインターフェースを登録してメソッドの引数で渡されたポインタにインスタンスを返す。
  8. 2でオーバーライドしたcmod_Allocate ()メソッドは渡された引数からアイテムとチャンネルモディファイヤのラッパーオブジェクトを作って、アイテムのChannelLookup()メソッドで5で定義したチャンネルのラベルからチャンネルのインデックス番号を調べ、チャンネルモディファイヤのAddInput()、AddOutput()メソッドでアイテムのインデックス番目と接続した入出力チャンネルをチャンネルモディファイヤに追加する。さらに必要ならローカルデータを割り当てることも出来て、cmod_Evaluate ()メソッドの引数void *dataとして渡す事が出来るらしい。void **ppvDataがその橋渡しの変数だろうね。
  9. 2でオーバーライドしたcmod_Cleanup ()メソッドは8のcmod_Allocate ()メソッドでアロケートされたものがあればここで開放する。
  10. 2でオーバーライドしたcmod_Flags ()メソッドはスケマティックビューに表示されるアイテム用で、引数indexが指すアイテムチャンネルの役割をフラグで返す。フラグは LXfCHMOD_OUTPUT、 LXfCHMOD_INPUT、 LXfCHMOD_MULTILINKの3種類あり、LXfCHMOD_MULTILINKはLXfCHMOD_INPUTと組み合わせて使用して、マルチチャンネル入力を定義する。こんな感じ。

    if (LXx_OK (modItem.ChannelLookup ("inputs", &chanIdx)))
    {
      if (index == chanIdx)
        return (LXfCHMOD_INPUT | LXfCHMOD_MULTILINK);
    }

  11. 2でオーバーライドしたcmod_Evaluate ()メソッドにはチャンネルモディファイヤのメインの処理部分を記述する。引数で与えられたチャンネルモディファイヤをCLxLoc_ChannelModifierでローカライズしてやれば、ReadInputFloat()メソッドなどでチャンネルから値が取り出せ、WriteOutputFloat()メソッドなどで値が出力できる。マルチチャンネルならInputCount()メソッドで接続されているリンクの数を調べてReadInputFloatByIndex()などでチャンネル番号+リンク番号で読み込みが出来る。
  12. 2でオーバーライドしたpins_Initialize ()メソッドはパッケージがアイテムをアタッチする時に呼び出される。引数として生成されたインスとその親クラスのインスタンスが渡される。ここでsetを使ってインスタンスを参照したら、pins_Cleanup ()でclear()して開放する。
  13. 2でオーバーライドしたpins_Cleanup ()メソッドはアイテムが削除される直前に呼び出されるメソッド。ここでメモリーを開放したり参照カウントを下げたりするんだろうね。
  14. 2でオーバーライドしたpins_SynthName ()メソッドはアイテムに自動でつく名前を設定する。
  15. プラグインのinitialize()ファンクションに、1のクラスをCLxPolymorph<>のテンプレートクラスとしてインスタンスを生成し、そこにCLxIfc_PackageインターフェースとCLxIfc_StaticDescインターフェースを追加してthisModuleにAddServerするコードを書く。

とまあこんな感じだ。リニアブレンドのコードはまさにチャンネルモディファイヤの骨組みみたいなもんで、自分で新しいチャンネルモディファイヤを作りたければこのコードをそっくりコピーして肉付けしていけば済みそうだ。未だに不明なのはLXsPKG_IS_MASKの役割かな。

それではまた次回。

カテゴリー別ページ



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

2011年06月27日

SHOWAレンジでチンするから揚げ粉を試してみた

揚げ物は大量の油を使うから何かとメンドクサイ。だからと言ってお惣菜は結構高い。そんな人向けに電子レンジでから揚げが作れる粉が昭和から出たので使ってみた。

商品名は「レンジでチンするから揚げ粉」で、他にもう1社同じようなものを出している。

fig01

お肉は西友の特売で半額のものを使用w。
fig02

作る手順は袋の裏に書いてある。今回のお肉は200gで、我が家の電子レンジが500Wなので、から揚げ粉は大さじ2杯ちょっとで、加熱時間は5分30秒くらいかな?

fig03

まずはから揚げ粉大さじ2杯ちょっとをビニール袋に入れ、そこに1口大に切ったお肉を投入し、ビニール袋を振りながら肉の表面にまんべんなく粉が付着するようによく混ぜる。

fig04

この粉の場合、肉に味がしみ込むための時間は必要ない。

お皿にキッチンペーパーを敷いて、そこにさっきのお肉を円形に並べた。電子レンジはターンテーブルが回るだけの安物なので、均等に加熱するためにはなるべく円形に並べた方がいい。

粉が付着した状態ですでにから揚げに見えるけど、まだ生肉だからね。


fig05

そして加熱すること5分30秒。肉の表面から油がにじみ出てクッキングシートに落ちて吸収される。あまりこのまま置いておくと肉がクッキングシートに付着するから要注意だ。

fig06

見た目はから揚げそのものだ。

fig07

切ってみると中から肉汁が・・・。

fig08

さすがに揚げたてのから揚げのようなパリっとした歯ごたえまでは無かったけど、粉っぽさはかなり抑えられている感じだ。ただ粉を入れすぎたのか、それとも粉をまぶしてから加熱するまでにちょっと時間をかけすぎたのか、ちょっとしょっぱい仕上がりになってしまった。まあご飯と一緒に食べるにはこのくらいでいいかも知れないな。

とにかくとっても簡単にから揚げが出来るようになったし、油も随分落として食べられるので、体重が気になる自分にはいいかも。



take_z_ultima at 16:36|この記事のURLComments(0)TrackBack(0)料理 | Goods

3dsmax2012をいじってみた その18 3ds max 2012

日経ソフトウェアでキネクトSDKを使ったプログラミングの連載が始まったみたいだね。こういうデバイスで気軽にモーションキャプチャーが出来るようになるといいね。1台ほしいなぁ。でもその前に液晶モニタと冷蔵庫どうしようかなぁw

UVWアンラップモディファイヤのUVWを編集ダイアログのロールアウトとツールバーが終わったので、残りはメニューバーだけだ。メニューバーに入っている機能は重複している部分も多いので、その辺は省略する。

fig06まずは「ファイル」メニュー。ここにはUVマップの保存と読み込み、リセットのメニューがある。保存とロードはUVマップをファイルに書き出すのとそれを読み込む機能だ。そして「すべてをリセット」はUVWモディファイヤが保持しているUVWマップのデータをモディファイヤスタックの下のUVWマップで上書きするものだ。

fig07UVWマップはUVWアンラップをモディファイヤスタックに追加した時にスタックにUVWマップが存在していればUVWモディファイヤにコピーされ、無ければ新規に生成される。そしてそのコピーされたUVWマップを編集するわけだけど、「すべてをリセット」はそのデータを破棄して新規にモディファイヤスタックにUVWアンラップが追加された状態に戻してしまうわけだ。

fig08「選択」メニューはそれぞれの選択から他の選択への変換メニューと、ポリゴンの裏返った奴や重なったやつを見つけ出すメニューが並んでいる。変換メニューはどれも現在の選択が完全に含んでいるエレメントが選択されるようになっている。

例えば下のように2枚のポリゴンが選択されている場合、これを頂点に変換すれば、ポリゴンに含まれる8つの頂点が選択状態になる。

fig09

「反転した面を選択」は裏返ったポリゴンを見つけ出して選択状態にする。これはポリゴン選択モードでのみ選択できる。見つけ出したポリゴンは「水平にフリップ」や「垂直にフリップ」を使ってひっくり返せば裏返せる。

「オーバーラップした面を選択」は重なっているポリゴンを選択状態にする。単純に独立したクラスターが重なり合っているだけならパックツールで解消できるけど、突起部分があるようなオブジェクトを展開した場合などに生じる重なりなどはこのツールで選択したあと選択を拡張して周辺を選択に加えたり不要な部分を選択からはずしたりした後で「リラックスカスタム」ツールでストレッチ量を増やしながら解消させたりなんてことも出来るね。

ツールメニューの中でまだ見ていないのは、「頂点をスケッチ」と「UVWテンプレートをレンダリング」だ。

fig10

頂点をスケッチはポイントをまとめてドラッグして並べる事ができるツールで、例えばクラスターのエッジを特定のビットマップ画像の曲線に沿わせたいなんて場合に利用するといい。

頂点選択モードにしてメニューを選択するとこのようなダイアログボックスが表示される。

fig11

ここで動作を設定する。選択方法はドラッグして頂点を次々選択していく方法と、1個ずつクリックして選択する方法とすでに選択されている頂点を使う方法の3通りが選べる。1個ずつ選択する方法は、選択モードから抜けるのに右クリックする必要がある。ドラッグして選択する場合はマウスボタンを離すとスケッチモードに切り替わる。このスケッチモードも「位置合わせ」オプションによって、フリーフォーム・ライン・ボックス・円が選べる。ラインのように直線に引くのはフリーフォームでもALTキーを押しながらクリックすることで行う事が出来る。スケッチのドラッグが終わると再び選択のドラッグに切り替わり、ドラッグのたびに交互に切り替わる。終了するときは右ボタンを押す。

境界線を描きなおしたら、内部についてはリラックスツールの「境界点を固定」オプションをONにして適用すれば調整は一度に出来るね。その時ストレッチパラメータを大きくすると、メッシュがピンと張るよ。

下のGIFアニメはこのツールを使って選択方法を「ドラッグして選択」にして、位置合わせを「フリーフォーム」でスケッチしてみたものだ。そのあとリラックスカスタムツールで境界を固定してリラックスさせてみた。

fig12

このようにテクスチャ画像にUVマップをフィットさせるときには役立ちそうだ。

それではまた次回

maxまとめページ



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