2016年1月5日火曜日

【Maya】 【python】ポリゴンの凹面を判別する。

少し前からですが、アーティストの方から割と要望をいただく件として、
「ポリゴンメッシュの凹面を自動判別する機能」があります。

早めに開発着手したかったのですが、なかなか手が空かず、
時間ばかりいただいてしまいました。。
で、ちょうど年末年始、数学に強い従兄の助言もいただき、
時間のあるこの時期に大体形にしてみたので、こちらでも紹介します。

■どうやって凹凸を判別するか?
 チェックするポリゴンは4頂点の4角形であることが前提です。
 そもそも3角形だったら平面だし。5角形だったらそもそもポリゴン割れし。
 
 で、仕組みはこうです。
 ずばり内積と外積を使います。

 ベクトルの内積と外積を使って、4頂点のうち、
 3頂点の平面から見た残りの1点の位置を判別します。












 








~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
かんたんに外積:
2つのベクトルに垂直なベクトルを算出します。

 

















 
かんたんに内積:
ベクトルAをベクトルBに成分分解したときの、そのベクトルの長さを求めます。



















~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 その手順は…、

 ①3頂点で作る、1点から伸びる2本のベクトルの外積を出して、
 この3角形に垂直なベクトルを算出します。





















 ②残り1頂点で作るベクトルと、①の三角形に垂直なベクトルの内積を求めます。





















 この内積の値が正か負かで、残りの1点の位置が算出できるはずです。

■しかし、ポリゴンのみかたで凹か凸かが変わってしまう。
 この4頂点ですが…

こうみるか




















こうみるかで、凹か凸かが変わってしまいます。




















 要は、どの頂点を判別するのか、準点を定める必要があるわけです。
 ここは、判別の基準をアーティストさんに確認する必要がありますが、、、
 とりあえず、一度Triangulateをかけた時の形状が、凹か凸かを判別するように
 考えることにしました。

 要は、このポリゴンを…





















 Triangulateをかけて…


 この3角形に含まれない頂点…


 つまり、この頂点を判別することにします。


■melに便利なコマンドが
 melにズバリ、内積・外積を算出するコマンドがあるので、これを使うっきゃない。
 
 外積:cross  http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/cross.html
 内積:dot    http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/dot.html 

 しかし、頂点計算など、数が多い処理は全てmelで処理するには重たすぎるので、
 基本はすべてpythonで書くことにし、pythonからmelプロシージャを呼び出すようにします。

そんな感じで、ぱっと作ってみました。
※使用方法は、mel文を先に実行しておくか、sourceコマンドで読んでおいた上で
ポリゴンを選択し、python文を実行します。
すると、凹んだ角形のみが選択された状態で終了します。

実際にまだ使っていないので、信頼性は低いですが。
いろいろテストなどして、ブラッシュアップしていこうと思います。
 
以下ソース

0 件のコメント:

コメントを投稿