2017年04月21日

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

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

今回は前回の方針に従ってプログラムを作ってみたい。

まずは2本のエッジが交差しているかどうかの判定だ。

これも媒介変数t1を使ってエッジを考えれば簡単だ。エッジの両端の点の座標を(x1,y1)、(x2,y2)とすると、エッジ上の点pの座標(px,py)は、

px =(x2−x1)t1+x1
py =(y2−y1)t1+y1

と書けて、媒介変数t1が0〜1の間であれば、点pはエッジ上に存在する。

このエッジと交差判定するエッジの両端の座標値を(x3,y3)、(x4,y4)とすると、

px =(x4−x3)t2+x3
py =(y4−y3)t2+y3

となって、2つのエッジの交点はこのpx,pxの値が同じになるところなので、

(x2−x1)t1+x1=(x4−x3)t2+x3
(y2−y1)t1+y1=(y4−y3)t2+y3

これを整理して行列の形に直すと、

fig01

となる。これを変形して、
fig02

ここで、2x2行列の逆行列が存在するためには、この行列の行列式

fig03

で、detが0でなければいい。もし0なら2つのエッジは交点を持たず平行と言う事になる。上の行列の式をdetを使った式に書き直すと以下のようになる。

fig04
これでt1とt2が求まるので、それぞれが0〜1の間にあるかどうかで交点が存在するかどうかが判定できる。

下が判定ファンクションだ。せっかく交点を計算しているから、実際使う時は算出できたt1、t2を返した方がいいだろうね。

threshold = 0.00000001

fn isCross p1 p2 p3 p4 = (
	det = (p2.x-p1.x)*(p3.y-p4.y)+(p3.x-p4.x)*(p1.y-p2.y)
	if abs(det) < threshold then return false
	t1 = ((p3.y-p4.y)*(p3.x-p1.x)+(p4.x-p3.x)*(p3.y-p1.y))/det
	t2 = ((p1.y-p2.y)*(p3.x-p1.x)+(p2.x-p1.x)*(p3.y-p1.y))/det
	if t1>=0.0 and t1<=1.0 and t2>=0.0 and t2<=1.0 then return true
	return false
)

それではまた次回。

maxまとめページ



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

トラックバックURL

この記事にコメントする

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

Archives