2019年02月12日

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

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

ようやくUVマップの輪郭を取得出来るようになったんだけど、その方法は繋がってる面のかたまりを取得して、その面の3つのエッジについてそのエッジを共有する2枚の面があるかどうかで縁かどうかを判定している。この方法だと隣接する面は共有するエッジを持っているので各面ごとに同じエッジを判定する事になって効率が悪い。そこでエッジを重複して調査しないようにする事を考えてみた。

で、選択した面のグループからエッジの配列を取得して、そのエッジをチェックすれば効率が良かったんだけど、エッジから頂点を取得したり面からエッジを取得したりする方法が見つからなかった。前回のように選択の変換を使う方法はあるけど、どうかなぁと思って、チェックしたエッジの両端の頂点を記録して、それをチェックする方法にしてみた。

「useEdges」配列を用意して、チェックした頂点の片方の番号を添字として、その配列にもう片方の頂点の番号をビット配列で格納することで両方の頂点が同時にチェックされているかを調べやすくしてみた。

下の太字の部分がその追加したものだ。

fn is_unce v1 v2 obj tch= (
  if useEdges[v1]!=undefined  then
    if useEdges[v1][v2] then return false else useEdges[v1] += #{v2}
  else useEdges[v1] = #{v2}
  if useEdges[v2]!=undefined  then
    if useEdges[v2][v1] then return false else useEdges[v2] += #{v1}
  else useEdges[v2] = #{v1}
  faces1 = meshop.getMapFacesUsingMapVert obj tch #{v1}
  faces2 = meshop.getMapFacesUsingMapVert obj tch #{v2}
  if (faces1 * faces2).numberSet == 1 then return true
  return false
)

theObj = $
useEdges = #()
islands = #()
muw = theObj.modifiers[#unwrap_uvw]
muw.setTVSubObjectMode 3
n = muw.numberPolygons()
allpolys = #{1..n}
do (
sseed = (allpolys as array)[1]
muw.selectFaces #{sseed}
a = muw.getSelectedFaces()
do (
  b = a
  muw.expandSelection() 
  a = muw.getSelectedFaces()
) while not (a-b).isempty
append islands (a as array)
allpolys -= a
) while not allpolys.isempty
muw.selectFaces #{}

theMesh = snapshotAsMesh theObj
theChannel = 1
edges = #{}
for island in islands do (
  for faceIndex in island do(
    texFace = meshop.getMapFace theMesh theChannel faceIndex
    if is_unce texFace.x texFace.y $ theChannel then edges += #{texFace.x,texFace.y}
    if is_unce texFace.y texFace.z $ theChannel then edges += #{texFace.y,texFace.z}
    if is_unce texFace.z texFace.x $ theChannel then edges += #{texFace.z,texFace.x}
  )
)
subobjectLevel = 1
muw.selectVerticesByNode edges theObj

結果として前回テストした960枚程度の面では配列を使うオーバーヘッドが大きくなってしまって僅かに遅くなってしまった。元のプログラムで0.75秒で追加したもので0.81秒。やらない方が良かったな。

続きはまた次回。

maxまとめページ



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

この記事にコメントする

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

Archives