2018年10月

2018年10月31日

Selection Assembliesについて調べてみた その17 modo12

引き続き「presets」パネルの「Selection Assemblies」にあるアセンブリを調べてみたい。

今回は「Select Edges By Angle」アセンブリ。

fig01

これも中を開けてみるとシンプルな構成になっていて、「Selection Operator:Edge」から「角度」チャンネルを引き出して、その値とアセンブリ入力「Minimum Angle」と比較して大きければエッジが選択されるようになっている。

fig02

下の画像のように2枚のポリゴンで構成されたポリゴンメッシュ2つをメッシュアイテム内に作ってテストしてみた。

fig03

このアイテムに「Edge Bevel」を追加して、

fig04

「スケマティック」ビューで「Edge Bevel」に「Select Edges By Angle」を接続する。

fig05

「Select Edges By Angle」の「Minimum Angle」を80°に設定して、

fig06

「Edge Bevel」の「値」を100mmにした。

fig08

これが結果。2枚のポリゴンが為す角が90度のエッジはベベルされて、45度のエッジはベベルされなかった。90度の方は80度以上で、45度は80度未満だからね。

fig07

続きはまた次回。

modo10-12ブログ目次



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

2018年10月30日

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

前回「doPaint()」から「paintFace()」を呼び出す時点で「vface」に格納されている多角形のデータで、不連続UVマップのデータが消えてしまうところまで確認した。「vface」には多角形の頂点座標のデータが順に入ってるんだけど、その座標値は2次元で、3つ目のデータが0か1かで次の頂点との間のエッジが不連続UVエッジなのかどうかを現すようになっている。そこで「doPaint()」のプログラムなんだけど、よく見ると「map」データから頂点データを取得して、1個ずつ処理していく時にその頂点よりひとつ前の頂点との間の距離を調べて1より大きい時に「vface」に頂点を登録している。そして最後の点と最初の点の距離を最後に調べて1未満だったら最後の点を削除するようにしている。この場合、最後の点とひとつ前の点の距離が1未満で、最後の点と最初の点の間のエッジが不連続UVだった場合に、最後の点が登録されないから不連続エッジのデータが消えてしまう事になる。

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 (
    vface = #()
    bbp = undefined
    for i = 1 to map[1].count do (
      p = map[1][i]
      bp = [p.x * bitmapx,bitmapy - p.y * bitmapy,int(map[3][i])]
      if (bbp == undefined ) or ((bp[1]-bbp[1])^2 + (bp[2]-bbp[2])^2) >= 1 then append vface bp
      bbp = bp
    )
    
    dse = (vface[1].x - vface[vface.count].x)^2 + (vface[1].y - vface[vface.count].y)^2
    if dse < 1.0 then deleteItem vface vface.count
    if vface.count >2 then paintFace vface map[2] 
  )
),

解決は簡単で長さを調べるエッジを不連続UVのデータが示すエッジと一致させればいいだけだ。

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 (
    vface = #()
    for i = 1 to map[1].count do (
      ni = int(mod i map[1].count) + 1
      ap = map[1][i]
      np = map[1][ni]
      bp = [ap.x * bitmapx,bitmapy - ap.y * bitmapy,int(map[3][i])]
      nbp = [np.x * bitmapx,bitmapy - np.y * bitmapy]
      if  ((nbp[1]-bp[1])^2 + (nbp[2]-bp[2])^2) >= 1 then append vface bp
    )
    if vface.count >2 then paintFace vface map[2]
  )
),

これが実行結果。不連続UV境界のエラーは解消された。

fig01

fig02

続きはまた次回。

maxまとめページ



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

2018年10月29日

Selection Assembliesについて調べてみた その16 modo12

引き続き「presets」パネルの「Selection Assemblies」にあるアセンブリを調べてみたい。

今回は「Select Curve Polygons」だ。

fig03

下がアセンブリを展開したもので、見ての通り非常に単純な作りだ。

fig01

「選択オペレータ:ポリゴン」から面積を出力させて、この値と0.0を比較して等しい時に「選択オペレータ:ポリゴン」の「選択」チャンネルにTrueを返すようになっている。下が「AはBと等しい」ノードのプロパティ。

fig02

つまり面積が0のポリゴンが選択される事になり、カーブもポリゴンとしてみると面積が0になるので、検出できるわけだけど、当然1ポイントや2ポイントポリゴンも選択されることになる。

下のように1つのメッシュアイテムに2本のカーブと1つのポリゴンを作ってこのアセンブリの動作を試してみた。

fig04

「セットアップ」レイアウトでこのアイテムに「Polygon Extrude」を追加して、

fig05

「Selection」に「Select Curve Polygons」を追加してみた。

fig06

これが結果。カーブだけが選択されてExtrudeされている。「Select Curve Polygons」の「反転」プロパティをONにするとポリゴンだけがExtrudeされるようになる。

fig07

続きはまた次回。

modo10-12ブログ目次



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

2018年10月25日

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

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

まだまだいろいろ粗が目立つわけだけど、ビットマップの解像度を落すとその粗がかなり目立ってくる。塗り潰されるべき部分に謎の亀裂が・・・。

fig01

この亀裂周辺のポリゴンを選択してUVマップを確認してみると、

fig02

不連続UVエッジの上側の矢印の部分ははみ出し塗りがされているのに下側の部分ははみ出し塗りがなされていない。これが亀裂の原因のようだ。

fig03

そこでこの多角形の部分について「paintFace()」に渡された「vface」を確認してみると、3つ目の値が全て0で、全てのエッジが連続UVエッジになってしまっている。これでははみ出し塗りはしないわけだ。
fig04

そこでさらに遡って「paintFace()」を呼び出している「doPaint()」でこの面に該当する「map」データを抽出してみた。

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 (
    vface = #()
    bbp = undefined
    for i = 1 to map[1].count do (
      p = map[1][i]
      bp = [p.x * bitmapx,bitmapy - p.y * bitmapy,int(map[3][i])]
      if (bbp == undefined ) or ((bp[1]-bbp[1])^2 + (bp[2]-bbp[2])^2) >= 1 then append vface bp
      bbp = bp
    )
    
    dse = (vface[1].x - vface[vface.count].x)^2 + (vface[1].y - vface[vface.count].y)^2
    if dse < 1.0 then deleteItem vface vface.count
    if vface.count >2 then paintFace vface map[2] 
  )
),

これがそのデータ。これを見るとこの多角形は4つの頂点で構成されていて、4つ目の点と最初の点を結ぶエッジが不連続UVエッジになっている。それらの座標値は[0.595691,0.74008]-[0.616064,0.746651]だ。しかしその前のエッジが[0.616976,0.743821,1]-[0.616064,0.746651]でほぼ長さが0のエッジだ。「doPaint()」ではエッジの長さが0の時は頂点を追加しなかったり除去したりしているので、どうやらこのあたりが元凶のようだ。

#([0.595691,0.74008,1], [0.606716,0.728838,1], [0.616976,0.743821,1], [0.616064,0.746651,1])
(matrix3 [0.26302,0.359304,-0.0766335] [0.114066,-0.198268,-0.237607] [-37.0834,-47.7961,58.5569] [0,0,0])
#(false, false, false, true)

続きはまた次回。

maxまとめページ



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

2018年10月24日

Selection Assembliesについて調べてみた その15 modo12

引き続き「presets」パネルの「Selection Assemblies」にある「Select By Volume」アセンブリを調べてみたい。

中身がだいたいわかったので今回はこれを使って見た。

fig01

上のGIFアニメは「Select By Volume」を使ってシーン中央の平面を超えた部分をストレッチさせてみたものだ。

まず下のようにZ軸上に平面(Plane)と球体(Sphere)の2つのメッシュアイテムをシーンに追加する。

fig02

平面は原点に配置して、球体は上の画像のように適当な大きさにスケーリングする。Dキーを何回か押して再分割して頂点を増やしておくと、変形がより滑らかになる。

「セットアップ」レイアウトの「メッシュオペレータ」リストで「Sphere」を選択し、「オペレータ追加」ボタンを押して、「Mesh Operations」→「選択」から「Assign Selection Set」を追加、同様に「Deformers」→「エフェクタ」から「Transform Effector」を追加する。

fig03

「Assign Selection Set」を選択して、「プロパティ」パネルで下のように設定する。

fig05

同様に「トランスフォーム」を選択して下のように設定する。「頂点選択セット」はシーンに選択セットが存在しないと一覧に出てこないようなので、「Assign Selection Set」で設定しても、先に「Select By Volume」をリンクして、頂点への割り当てを無効にしてしまうと出てこなくなるので注意が必要だ。

fig06

「トランスフォーム」の設定が終わったらスケマティックビューにアイテムを追加して下のように接続する。

fig04

最後に「トランスフォーム」の「Transform Effector」を選択して、スケールを変更する。

fig07

あとは球体をアニメーションさせれば球体上の頂点が平面の表側に来るとスケーリングが適用されて球体が伸びるようになる。

fig01

「Select By Volume」の頂点選択のバグっぽい仕様でボリュームの外側にある時だけ選択状態になるので、平面の表側でトランスフォームが有効になる。

続きはまた次回。

modo10-12ブログ目次



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