2017年05月19日

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

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

前回のプログラムについて今回は動作について書いてみたい。

メインになるのは「serchFaces()」ファンクションだ。このファンクションはブラシと干渉する面を探し出すものだ。

fn searchFaces theMesh seed  brushsize  brushtransform = (
	sufFace = getFace theMesh seed
	p0 = (getVert theMesh sufFace.x)
	p1 = (getVert theMesh sufFace.y)
	p2 = (getVert theMesh sufFace.z)
	
	if chckEdge p0 p1 brushsize brushtransform then (
		face = neighborface #{sufFace.x,sufFace.y} theMesh - doneface
		if (face as array).count ==1 then (
			doneface += face
			searchFaces theMesh (face as array)[1]  brushsize  brushtransform
		)
		
	)
	if chckEdge p1 p2 brushsize brushtransform then (
		face = neighborface #{sufFace.y,sufFace.z} theMesh - doneface
		if (face as array).count ==1 then (
			doneface += face
			searchFaces theMesh (face as array)[1]  brushsize  brushtransform
		)
		
	)
	if chckEdge p2 p0 brushsize brushtransform then (
		face = neighborface #{sufFace.z,sufFace.x} theMesh - doneface
		if (face as array).count ==1 then (
			doneface += face
			searchFaces theMesh (face as array)[1]  brushsize  brushtransform
		)
		
	)
)

引数は4つで、探索するメッシュオブジェクト「theMesh」、探索の起点となる面「seed」、干渉するブラシのサイズ「brushsize」、干渉するブラシの変換マトリクス「brushtransform」を与える必要がある。

受け取った面から3頂点の座標値を取得して、

	sufFace = getFace theMesh seed
	p0 = (getVert theMesh sufFace.x)
	p1 = (getVert theMesh sufFace.y)
	p2 = (getVert theMesh sufFace.z)

「chckEdge()」で三角形の1辺がブラシの立方体と干渉しているかチェックして、干渉している場合は「neighborface()」ファンクションで、その辺を共有する2つの面を取得して、そこから既に処理済みの面のリスト(doneface)を取り除く。残ったbitarray値を配列に変換して「count」プロパティで要素数を調べて面が1つあれば、それは未処理の面なので、処理済みのリスト(doneface)に加えて、その身処理の面を探索の起点として新たに「searchFaces()」を呼び出す。呼び出された「searchFaces()」は与えられた面の3辺を調べてブラシに干渉する未処理の面を探して処理済みのリスト(doneface)に加えてさらに「searchFaces()」を呼び出して行き、処理する面が無くなったら戻ってくる。

	if chckEdge p0 p1 brushsize brushtransform then (
		face = neighborface #{sufFace.x,sufFace.y} theMesh - doneface
		if (face as array).count ==1 then (
			doneface += face
			searchFaces theMesh (face as array)[1]  brushsize  brushtransform
		)
		
	)

この処理が3辺に対して行われる。

そしてこのファンクションを呼び出しているのが下の部分で、テスト用にパラメータを設定して呼び出して、最終的に「doneface」に結果を得て、それを使って面を選択して動作の確認をしている。

(
	local seedface=19
	global doneface=#{seedface}
	local theMesh = snapshotAsMesh $GeoSphere001
	local brushtransform = $Box001.transform
	local brushsize=10
	searchFaces theMesh seedface  brushsize  brushtransform
	select $GeoSphere001
	setFaceSelection $GeoSphere001 doneface 
	max modify mode
	subObjectLevel =4
)

続きはまた来週。

maxまとめページ



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

トラックバックURL

この記事にコメントする

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

Archives