2019年02月

2019年02月28日

ビットマップペイントツールのチュートリアルをやってみた その206 3dsmax 2019

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

前回「meshop」と「UVWアンラップ」で頂点番号が異なることがわかったので「UVWアンラップ」の方でこのギャップを埋めるのに使えそうなメソッドを見つけてみた。

<integer><Unwrap_UVW>.numberPointsInFace <integer>index 
面の頂点の数を取得します。
 <integer> index - 検査中の面のインデックス。

<integer><Unwrap_UVW>.getVertexIndexFromFace <integer>faceIndex <integer>ithVertex 
面から頂点のインデックスを取得します。
 <integer> FaceIndex - 検査する面のインデックス。
 <integer> IthVertex - 取得する i 番目の頂点。 <integer><Unwrap_UVW>.getVertexGeomIndexFromFace <integer>faceIndex <integer>ithVertex
面からジオメトリの頂点のインデックスを取得します。
<integer> FaceIndex - 検査する面のインデックス。
<integer> IthVertex - 取得する i 番目の頂点。この値は 1 からその面が持つ頂点の数の間の値になります。

前回のUVマップで今度は「getVertexIndexFromFace()」を使って頂点を取得して、それを使って「selectVertics()」で頂点を選択してみた。

fig 1

下がそれをやってみたもの。前回の「getMapVertsUsingMapFace()」で得られる頂点配列とは異なっているのがわかる。

fig 2

これがその結果。今度はちゃんと3番の面まわりの3つの頂点が選択された。

fig 3

続きはまた次回。

maxまとめページ



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

2019年02月27日

メッシュオペレータでいろいろやってみた その18 modo12

前回に引き続き「正規化フォルダ」のプロパティを調べてみた。

「ソース制限」は「最大ソース」と共に使われるオプションで、1つの頂点に作用するデフォーマーの数を制限するオプションだ。

fig6

例えば下のGIFアニメのように腕のスケルトンがわき腹に影響して必要の無い変形が起きてしまっている場合、

fig-1

影響を受けている頂点のウェイトを見てみると、

fig2

このようにいくつものスケルトンにバインドされたウェイトが存在している。

fig3

ここで「ソース制限」をONにして「最大ソース」を2にすると、各頂点はウエイトマップの値が大きいものから順に2つだけ影響するようになり、他のスケルトンからは影響を受けなくなる。

fig4

これがその結果。マニュアルにはUnityでは1つの頂点に影響できるジョイントが4つまでと言う制限があるのでそれに合わせるのにも有効と書いてある。

fig-5

続きはまた次回。

modo10-12ブログ目次



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

2019年02月26日

ビットマップペイントツールのチュートリアルをやってみた その205 3dsmax 2019

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

プログラムをいろいろ試していたらおかしな症状が出たので調べてみたら「meshop」と「UVWアンラップ」で頂点の番号が一致しない事がわかった。

例えば下のような平面をシーンに追加して、

fig1

「UVWアンラップ」を追加した。

fig2

そしてこんな感じで部分的に分割したマップにしてみた。番号は面の番号だ。

fig3

ここで「getMapVertsUsingMapFace()」を使って3番の面に繋がる頂点を取得して、その頂点を含む面を「getMapFacesUsingMapVert()」で取得してみた。

fig4

3番の面は4の面しか繋がっていないから取得した面は当然3と4になった。

次に同じことを1番の面についてやってみた。

fig5

結果として1,2,9,10,11,12が取得できた。この結果から3番の面は分離してある面に違いなさそうだ。

そこでこの面から取得して頂点を「UVWモディファイヤ」から選択してみた。

fig6

これがその結果。全然違う頂点が選択されたのがわかる。

fig7

以上の事から頂点番号については扱いを気をつけないと酷い目にあいそうだ。

続きはまた次回。

maxまとめページ



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

2019年02月25日

メッシュオペレータでいろいろやってみた その17 modo12

前回に引き続き「正規化フォルダ」のプロパティを調べてみた。

「ワールドトランスフォームを使用」はデフォーム時にアイテムのワールドトランスフォームの影響を加えるかどうかを切り替えるオプションだ。

fig1

例えば下のようにスケルトンがバインドされたメッシュがあった場合、スケルトンを回転させると影響を受けるメッシュも一緒に回転する。

fig-2

ここでメッシュだけX軸方向に500mm移動させると、

fig4

スケルトンだけが残されて、メッシュが移動する。

fig3

この状態で「ワールドトランスフォームを使用」をOFFにしてスケルトンを回転させると、メッシュはローカル空間内で変形するので、メッシュの変形は移動前と変らない。

fig5

今度は「ワールドトランスフォームを使用」をONにしてみると、メッシュの移動がメッシュとスケルトンのバインド関係に含まれるようになり、スケルトンとメッシュの相対位置を保ちながら移動するので、元とは異なる変形になる。

fig-6

続きはまた次回。

modo10-12ブログ目次



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

2019年02月21日

ビットマップペイントツールのチュートリアルをやってみた その204 3dsmax 2019

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

前回のプログラムの下のコードの前の位置で「edges」ビット配列にマップの縁にある頂点が全て入っている。そして「edgeVerts」配列には縁にある各頂点の隣にある2つの縁にある頂点の配列が入っている。

loopEdges = #()
edgeVerts = edges as array
for i = 1 to edgeVerts.count do (
  v1 = edgeVerts[i]
  if edges[v1] then (
    loopEdge = #(v1)
    edges[v1] = false
    nfind = true
    do (
      v2 = useEdges[v1][1]
      if edges[v2] then (
        append loopEdge v2
        edges[v2] = false
      ) else (
        v2 = useEdges[v1][2]
        if edges[v2] then (
          append loopEdge v2
          edges[v2] = false
        ) else (nfind = false)
      )
      v1 = v2
    ) while nfind 
    append loopEdges loopEdge
  )
 )

まず処理結果を入れる「loopEdges」配列を用意して、「edges」ビット配列を配列に変換した「edgeVerts」配列を用意する。ビット配列は順番に値を取り出したりするのは向かないけど、ある値が入っているかどうかを調べるのは得意なので、ループとして調べ終わった頂点は「edges」から消して行って、未処理かどうかは「edges」にその頂点があるかどうかで調べる。一方「edgeVerts」の方は順に頂点を拾い出して、その頂点がまだ「edges」に残っていたら、その頂点から始まるループを「useEdges」を辿って調べて行く。

1周ぶんのループデータは「loopEdge」配列に格納して、最後に「loopEdges」に登録する。初期値は「edgeVerts」から取り出された「edges」に残っていた頂点が入った配列だ。

「loopEdge」に登録した頂点はもう処理済みになるので「edges」の該当する場所をfalseにする事で「edges」配列から消す。

そして与えられた頂点と「useEdges」から、その頂点と繋がる頂点が入った配列を得て、その1番目に入っている頂点を取得する。もしこれが「edges」に残っていたなら未処理頂点なのでそのまま「loopEdge」に追加して、「edges」からは消す。

「edges」に無ければ接続されている2番目の頂点の方が「edges」にあるか調べる。もし見つかったらこっちの頂点を「loopEdge」に追加して「edges」から消す。

どちらの頂点も「edges」に無ければループが一周したものと見なしてこのループの探索は終了して、「loopEdge」を「loopEdges」に追加して、「edgeVerts」から次の「edges」に残っている頂点を取り出して、その頂点から始まるループを探索する。

まだループが続くようなら新しく見つかった頂点から再び探索を続ける。

「edgeVerts」が無くなったら処理は終りで、結果として「loopEdges」にマップの縁にある頂点が各ループごとに接続順に入った配列になって格納される。

続きはまた次回。

maxまとめページ



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