2018年04月24日

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

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

今回は前回作ったプログラムについて。

fn is_unce v1 v2 obj tch= (
  faces1 = meshop.getMapFacesUsingMapVert obj tch #{v1}
  faces2 = meshop.getMapFacesUsingMapVert obj tch #{v2}
  if (faces1 * faces2).numberSet == 1 then return true
  return false
)

obj = $Teapot001
tchannel = 1
fn v2e v1 v2 obj = (
  obj.modifiers[#unwrap_uvw].selectVerticesByNode #{v1,v2} obj
  obj.modifiers[#unwrap_uvw].vertToEdgeSelect()
  return obj.modifiers[#unwrap_uvw].getSelectedEdges() 
)

ucedges = #{}
for f = 1 to obj.faces.count do (
  theVerts = (meshop.getMapVertsUsingMapFace obj tchannel #(f)) as array
  if is_unce theVerts[1] theVerts[2] obj tchannel then ucedges += (v2e theVerts[1] theVerts[2] obj)
  if is_unce theVerts[2] theVerts[3] obj tchannel then ucedges += (v2e theVerts[2] theVerts[3] obj)
  if is_unce theVerts[3] theVerts[1] obj tchannel then ucedges += (v2e theVerts[3] theVerts[1] obj)
)
subobjectLevel = 2
obj.modifiers[#unwrap_uvw].selectEdgesByNode ucedges obj

まず不連続UV境界をチェックしているのが「is_unce()」ファンクションだ。引数「v1」「v2」に不連続境界かどうかを調べたいエッジ両端のUVマップの頂点インデックスが渡されて、「meshop.getMapFacesUsingMapVert」でそれぞれの頂点を含むUV面のビット配列が「faces1」「faces2」に得られる。ビット配列の乗算は2つの配列の共通する要素を抽出する計算になり、「numberSet」はその配列の中の要素数を返す。これが1なら2つの頂点を含む面が1つしかないので不連続境界という事になり、ファンクションの戻り値としてtrueを返す。それ以外はfalseを返す。

「v2e()」ファンクションは2つのUVマップの頂点インデックス「v1」「v2」からその頂点を両端に持つエッジのインデックス番号をビット配列で求めるものだ。

サンプルで使った「Teapot001」には「UVWアンラップ」モディファイヤが追加されえちて、その「selectVerticesByNode()」メソッドで2点の頂点を選択状態にして、「vertToEdgeSelect()」でその2点をエッジに変換する事で2点を両端に持つエッジを選択状態にする。そして最後に「getSelectedEdges()」で選択されているエッジをビット配列で取得して返す。オブジェクトに設定されている「UVWアンラップ」モディファイヤのメソッドは「オブジェクト.modifiers[#unwrap_uvw].メソッド」でアクセス出来る。

最後はメイン部分で、不連続境界エッジのインデックス番号を格納するビット配列「ucedges」を用意しておいて、オブジェクトに含まれる面のインデックス番号を1番から順に最後まで変数「f」に入れて、そこから「getMapVertsUsingMapFace()」でその面に含まれる3つの頂点番号を「theVerts」に配列に変換して取得する。

その3つの頂点から2つを組みあわせを変えながら「is_unce()」に渡して不連続境界かどうか調べて、そうだったらその2点から「v2e()」でエッジ配列を取得して、「ucedges」配列に追加する。

これを全ての面に対して行えば全ての不連続境界エッジのインデックス番号が「ucedges」に入る。

最後にサブオブジェクトレベルをエッジに切り替えて、「selectEdgesByNode()」で「ucedges」に入っているエッジ全てを選択状態にする。

続きはまた次回。

maxまとめページ



take_z_ultima at 11:30│Comments(0)3ds Max | CG

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 

Archives