2017年06月19日

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

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

今回は前回書いたコードについて中身を見て行きたい。追加したプログラムは「crossFaceMaps()」とそれを呼び出すテストプログラムだ。

「crossFaceMaps()」はブラシに見立てた立方体の変換マトリクス「brushtransform」とブラシのサイズ「brushsize」、それがヒットした面のインデックス「seedface」、ペイントするメッシュオブジェクト「theMesh」、使用するUVマップチャンネル「theChannel」、そして結果を受け取る「maps」配列の参照を渡すと、メッシュとブラシが干渉した部分をUVマップ上の多角形としてその輪郭の頂点の配列を生成して返すものだ。

(
	local seedface=19
	local theMesh = snapshotAsMesh $GeoSphere001
	local theChannel = 1
	local brushtransform = $Box001.transform
	local brushsize=10
	maps = #()
	crossFaceMaps &maps theMesh seedface theChannel brushtransform brushsize
	print maps
)

そしてこれがそのコード。

fn crossFaceMaps &maps theMesh seedface theChannel brushtransform brushsize invBrushTransform=
(
	invBrushTransform = inverse( brushtransform)
	crossfaces = queloop theMesh seedface  brushsize  brushtransform
	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)
		
		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,0] [tv2.x,tv2.y,0] [tv3.x,tv3.y,0] [0,0,0])
		clipface &vlist  brushsize invBrushTransform
		
		maplist =  #()
		for v in vlist do (
			mp = (meshop.getBaryCoords theMesh faceIndex v) * mg2t
			append maplist mp
		)
		append maps maplist
	)
)
  • まず「clipface()」で使うブラシ変換マトリクスの逆行列を生成し、「invBrushTransform」に格納する。
  • 次に「queloop()」でブラシと干渉するメッシュの面のインデックスのリストを生成し、「crossfaces」に格納する。
  • この面のインデックスのリストからfor文で1つずつ「faceIndex」に取り出して、以下のループ処理をする。
    • 面の頂点の座標値リストを「vlist」に格納
    • 面の頂点のUV座標値3つを「tv1」、「tv2」、「tv3」に取り出し、それらを「matrix3」にまとめて「mg2t」に格納する。このマトリクスを重心座標系の座標値に後ろからかけると、UV座標系の座標値が求められる。
    • 面の輪郭の「vlist」を「clipface()」でブラシ立方体でクリッピング処理をして、結果で「vlist」を更新する。これで面1枚ぶんのブラシとの干渉部分の多角形が得られる。
    • 次にUVマップ上の多角形を格納するための配列を生成して「maplist」に格納する。
    • 「vlist」に入っている座標値を「v」に1つずつ取り出して、「meshop.getBaryCoords()」で重心座標系に変換し、さらに「mg2t」をかけてそれをUV座標系に変換する。そしてその値を「maplist」に追加する。
    • これを面の頂点の座標値全てに対して行えば、クリップされた面のUVマップ上の座標値のリストが「maplist」に得られる。
    • 面1枚ぶんのリストが出来たらそれを「maps」配列に追加する。
  • 以上を「crossfaces」にある面全てに対して行えば、「maps」にはUV座標に変換されたクリップ面の頂点座標値リストのリストが得られる。
続きはまた次回。

maxまとめページ



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

トラックバックURL

この記事にコメントする

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

Archives