2018年12月

2018年12月20日

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

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

前回のテストがうまくいったので、ビットマップ座標上で、ある点がポリゴンメッシュ内かどうかをチェックするために、「crossFaceMaps()」が返す「maps」配列内のポリゴンメッシュ頂点の座標値を最初からビットマップ座標にして、Z座標値のかわりにUVマップの連続・不連続のフラグを格納するように変更した。「mg2t」が重心座標からテクスチャ座標に変換するマトリクスで、「mg2b」が重心座標からビットマップ座標に変換するマトリクスだ。不連続フラグを組み込んだので「maps」の配列に格納するのはビットマップ座標値に変換されたポリゴン頂点の配列と、その座標をワールド座標に変換する「mb2w」マトリクスだけになった。

fn crossFaceMaps &maps theMesh theChannel mt2b =
(
  invBrushTransform = inverse( brushtransform)
  crossfaces = selectcrossface()
  for faceIndex in crossfaces do (
    vlist = #()
    sufFace = getFace theMesh  faceIndex
    append vlist (getVert theMesh sufFace.x)
    append vlist (getVert theMesh sufFace.y)
    append vlist (getVert theMesh sufFace.z)
    mg2w=(matrix3 [vlist[1].x,vlist[1].y,vlist[1].z] [vlist[2].x,vlist[2].y,vlist[2].z] [vlist[3].x,vlist[3].y,vlist[3].z] [0,0,0])
    texFace = meshop.getMapFace theMesh theChannel faceIndex
    tv1= meshop.getMapVert theMesh theChannel texFace.x
    tv2= meshop.getMapVert theMesh theChannel texFace.y
    tv3= meshop.getMapVert theMesh theChannel texFace.z
    mg2t=(matrix3 [tv1.x,tv1.y,1] [tv2.x,tv2.y,1] [tv3.x,tv3.y,1] [0,0,0])
    mg2b = mg2t * (matrix3 [ bitmapx,0,0][0,-bitmapy,0][0,0,0][0,bitmapy,0])
    elist = #()
    elist[1] = is_unce texFace.x texFace.y theMesh theChannel
    elist[2] = is_unce texFace.y texFace.z theMesh theChannel
    elist[3] = is_unce texFace.z texFace.x theMesh theChannel
    
    mg2b = mg2t * mt2b
    mb2g = inverse mg2b
    mb2w = mb2g * mg2w
    
    clipface &vlist &elist invBrushTransform 

    if vlist.count == 0 then continue
    maplist =  #()
    i = 1
    for v in vlist do (
      mp = (meshop.getBaryCoords theMesh faceIndex v) * mg2b
      mp[3] = int(elist[i])
      i = i + 1
      append maplist mp
    )
    append maps #(maplist , mb2w)
  )
),

そこでこれを呼び出す側の「doPaint()」も変更になって、シンプルになった。このあと「maps」を使って内外判定を「pcol()」の中でやらなきゃならないし、いちいち渡していくのも大変なのでプライベートのプロパティでファンクションの外に出しちゃおうと思う。

fn doPaint = (
  local theMesh = snapshotAsMesh theObj
  local theChannel = 1
  local maps = #()
  crossFaceMaps &maps theMesh theChannel mt2b
  checkBitmap = #{}
  edgecheck = #{}
  edgeBitmap = bitmap bitmapX bitmapY color:white

  for map in maps do (
    if map[1].count >2 then paintFace map[1] map[2]
  )
),

続きはまた次回。

本年はここまで。皆様よいお年をお迎え下さい。

新年は1月7日から始めようと思います。

maxまとめページ



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

2018年12月19日

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

前回は「CurveClone」で複製するオブジェクトのサイズを測ってカーブに隙間無く並べる事をやってみた。

前回作ったものをよく観察してみると、カーブの始端は複製するメッシュと端面が揃っているんだけど、

fig1

終端は1つ分はみ出すように複製されているのがわかる。

fig2

今回はこれを解消して複製オブジェクト列とカーブの長さを揃えてみたい。

具体的には複製する個数を1つ減らして、複製の終端位置を複製するメッシュ1つ分だけずらしてやればいい。

そこでノードグラフを以下のように作り変えてみた。

fig3

カーブの「長さ」をメッシュの「サイズY」で割って作ったステップ数から1を引いたものを「Path Segment Generator」の「ステップ」チャンネルに入力。

fig5

逆に「サイズY」を「長さ」で割ると、全体の長さに対する1個分の割合が出るので、それを1から引けば全体に対してメッシュを1個引いた長さの割合が出る。それを「Path Generator」の「終点」に入力すれば、複製の終点位置がメッシュ1つ分戻る事になる。

fig6

これが結果。これで端面が両方とも合致した。

fig4

続きはまた次回。

modo10-12ブログ目次



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

2018年12月18日

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

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

前回の凸ポリゴンメッシュに対する内外判定を実験してみた。

下のようにXY平面上に変形した平面のポリゴンメッシュとポイントを用意して

fig 1

下のスクリプトを実行して「Point001」が「Plane001」の内側になるか外側になるかを判定してみた。ポリゴンメッシュは窪みが見えるけど、判定に使うのはこのメッシュを構成する三角ポリゴンなので全て凸ポリゴンだ。

theMesh = snapshotAsMesh $Plane001
tr = $Plane001.transform
p = $Point001.pos
pin = false
for i = 1 to theMesh.faces.count while not pin do (
  v = #()
  face = getFace theMesh  i
   append v ( (getVert theMesh face.x) - p )
   append v ( (getVert theMesh face.y) - p )
   append v ( (getVert theMesh face.z) - p )
  c = (cross v[3] v[1])[3]
  if c == 0.0 then (
    pin = true 
  ) else (
    if c < 0.0 then dr = -1 else dr = 1
    pout = false
    for j = 1 to 2 while not pin do (
      c = (cross v[j] v[j+1])[3]
      if c == 0.0 then (
        pin = true
      )
      if c < 0.0 then d = -1 else d = 1
      if dr * d < 0 then (
        pout = true
      )
    )
    if not pout then pin = true
  )
)
print pin

「Point001」が内側にある時はtrueが出力されて、外側の時はfalseが出力されるのを確認した。

続きはまた次回。

maxまとめページ



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

2018年12月17日

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

前回はカーブの長さにあわせて「CurveClone」で複製する数を調整するようにしてみた。

今回はそれをさらに進めて、並べるもののサイズを自動的に測って数を算出するようにしてみた。

下が「メッシュオペレータ」リストで、何も入っていない「Mesh」アイテムに「Merge Meshes」で「Troid」を読み込んで、「Curve Clone」で複製している。

fig3

そして下がそのスケマティックビューだ。「Troid」のサイズは「Mesh Info」ノードの「サイズY」チャンネルから取得している。これが「Troid」のY軸方向の長さになるので、その値でカーブの長さを割れば、複製する数が算出できるわけだ。

fig1

「Mesh Info」は「チャンネルモディファイヤ」の「ジオメトリ」の中にある。

fig 5

これがその結果。

fig2

オリジナルの「Troid」のY方向のスケールを50%にすると、このように複製される数が倍になって隙間は出来ない。

fig4

続きはまた次回。

modo10-12ブログ目次



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

2018年12月13日

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

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

さて、前回書いた通りアンチエイリアスをするにはある点が多角形の内側にあるのか外側にあるのかを判定しないとならない。これにはいろんな方法があるけど、今回は多角形が凸ポリゴンなのが前提なので、外積を使う方法を使ってみようかと思う。幸いなことに外積は「Point3」クラスのメソッド「cross」で計算出来るので簡単だ。

2つのベクトルの外積は2つのベクトルを2辺とする平行四辺形の面積を長さとする、平行四辺形に垂直なベクトルとなる。

fig1

平面に垂直なベクトルは2本あるけどそれは外積の最のベクトルの順番で決まり、2つのベクトルの為す角度がnπ(nは整数)で反転する。だから丁度nπのところで0になる。
fig2

そこである点Pから凸多角形の各頂点に向けたベクトルを考えて、それらを順番に2つとって外積を計算する場合、Pが凸多角形の内側にあればベクトルの回転方向は常に一定だから外積のベクトルも常に同じ向きになる。
fig3

しかし点Pが凸多角形の外にある場合は向きが逆になるものが出てくる。これは当然符号が逆になる。
fig4

点Pがエッジ上、または頂点にある場合は0になる。

これを使ってビットマップ上の多角形に対してある点が内側にあるか外側にあるかを調べたいなら、多角形の各エッジの両端を終端とする調べたい点とのベクトルの外積をとって、ビットマップ座標XYに対してZ座標値の符号を調べれば内外判定が出来るってわけだ。

続きはまた次回。

maxまとめページ



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