[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
MaxScript:嫌な三角ポリゴンを目立たせてみる。
2009.09.06 Sunday 12:36 | MaxScript
**カテゴリーに「MaxScript」を追加しました。**
さて、今回はタイトルどおり、「嫌な三角ポリゴン」を目立たせるスクリプトを書いてみました。
「嫌な三角ポリゴン」とは、、人それぞれでしょうが、今日の私は
1.三角ポリゴンの存在そのもの。
2.さらにはそれが一つの頂点に集中している。
のが嫌だ、、という設定にします。
そんなのがあったら色でその場所を知らせる、、というものにしたいと思います。
ちょうどこの画像の様な感じです。
サーモグラフィーみたいになっていますが、赤いところほど一つの頂点に三角ポリゴンが集中し、緑のところはその頂点に三角ポリゴンがないことをあらわすようにしています。画像中の黒丸で囲んだところは「カット」の作業ミスのようです。同じ、、あるいは近い場所に頂点ができてしまっています。
モデリングの最中に余計な三角ポリゴンを見つて修正したい、見つけやすくしたい、、、、なんていうときには「ちょっとは」使えるかもしれません。
まずはコード。
↓こちらをクリックしてダウンロードしてください。
Colorize_TriPoly.zip
解凍すると、Colorize_TriPoly.msというファイルがあると思うので、ボタンに登録するなり、開いておいてCtrl+Eするなりして使ってください。
使い方は、
0.対象オブジェクトは「編集可能ポリゴン」です。
1.マテリアルを準備する。
新規でマテリアルを準備します。
「拡散反射光カラー」のマップに「頂点カラー」を指定します。
マップチャンネルは今回は0です。たぶんデフォルト。
2.この表示をしたいオブジェクトに上記のマテリアルを適用。
ドラッグ&ドロップが楽です。
3.頂点カラーをビューポートで表示できるようにする。
「オブジェクトプロパティ」で
・「頂点のチャンネル表示」にチェックを入れ、その下が「頂点カラー」になっているのを確認。
・「シェーディング」はお好みで。今回はOFFにしています。
4.オブジェクトを選択した状態(サブモードでもOK)でスクリプトを実行する。
*見づらい場合はビューポートの設定で「エッジ面」をチェックすると見やすくなると思います。
あとは、作業中必要に応じて都度スクリプトを実行するだけです。
注意点は、
1.何があっても私は責任を負いませんので、十分にテストして納得されてから実用してください。
特にマップチャンネル0を使用している方はそのデータが上書きされますので、こちらのチャンネルを変更するなどしてください。(スクリプトの最初の行 MapCNo = 0 がマップチャンネルの番号です。また、それに併せてマテリアルのマップチャンネル番号を変更してください)
2.遅いです&リアルタイムではありません。
とりあえず書いたコードで私にとっては問題ない速度で動作していたので、そのままです。
また、多少遅かったとしても使用頻度とコードを考える時間とのバランスを考慮するとこのくらいのレベルで十分だと判断したからでもあります。
コードを見ると判りますが、何度も同じFACEの頂点数を調べる要領の悪いやり方をしているので、そこを他のやり方考えるだけでも速くなりそうです。なので、興味のある方は書き換えて遊んでください。
スクリプトの作りとしてはこれから始めたい方などにはわかりやすい方だと思います。
For~do/IF~then/Case~of といった一般的な処理を含めています。
コードの中身は下記のとおりです。
-- ここから
MapCNo = 0
AllQuad = [0,255,0]
Tri1 = [255,255,0]
Tri2 = [255,192,0]
Tri3 = [255,64,0]
Tri4Plus = [255,0,0]
for i = 1 to $.numverts do
(
Tricount = 0
FaceEx = polyOp.getFacesUsingVert $ #{(i)} as array
for j = 1 to FaceEX.count do
(
VertNum = polyOp.getFaceDeg $ FaceEx[j]
if VertNum == 3 then Tricount += 1
)
Vcolor = case Tricount of
(
0: AllQuad
1: Tri1
2: Tri2
3: Tri3
default: Tri4Plus
)
polyOp.setVertColor $ MapCNo #{(i)} Vcolor
)
--ここまで。
やっていることは、オブジェクトの全ての頂点一つ一つにたいして、
1.その頂点を共有しているFACEをリストアップ
2.そのリストを元にFACEの頂点数を調べる。
3.もし頂点数が3(=三角ポリゴン)ならカウンタを1つ増やす)
として、カウンタの値に応じて頂点に色をつける。
というのを繰り返しているだけです。
独特(?)なのは下の3つ。
1. polyOp.getFacesUsingVert $ #{(i)} as array
リストにある頂点を使用しているFACEのリストを返す。
2. polyOp.getFaceDeg $ FaceEx[j]
リストにあるフェイスが使用している頂点数を返す。
3. polyOp.setVertColor $ MapCNo #{(i)} Vcolor
リストにある頂点の指定したマップチャンネルに、指定した色をつける。
よく出てくる、 $ は選択されているオブジェクトをさします。(確か)
青文字の as Array は型変換で、もしこれをつけない場合は、BitArrayという独特の配列型が返ってくるのに対して、 as Arrayとすれば 通常の配列型で返ってきます。
命令がどれで、変数/パラメータがどれで、、としていけばそんなに難しくないと思います。
ちなみに Tricount += 1 は Tricount=Tricount+1 と同じです。
C言語の書き方なのですが、こちらがスマートだから使いました。
Tricount ++ という記述(インクリメンタル演算子)はダメでした。
さて、今回はタイトルどおり、「嫌な三角ポリゴン」を目立たせるスクリプトを書いてみました。
「嫌な三角ポリゴン」とは、、人それぞれでしょうが、今日の私は
1.三角ポリゴンの存在そのもの。
2.さらにはそれが一つの頂点に集中している。
のが嫌だ、、という設定にします。
そんなのがあったら色でその場所を知らせる、、というものにしたいと思います。
ちょうどこの画像の様な感じです。
サーモグラフィーみたいになっていますが、赤いところほど一つの頂点に三角ポリゴンが集中し、緑のところはその頂点に三角ポリゴンがないことをあらわすようにしています。画像中の黒丸で囲んだところは「カット」の作業ミスのようです。同じ、、あるいは近い場所に頂点ができてしまっています。
モデリングの最中に余計な三角ポリゴンを見つて修正したい、見つけやすくしたい、、、、なんていうときには「ちょっとは」使えるかもしれません。
まずはコード。
↓こちらをクリックしてダウンロードしてください。
Colorize_TriPoly.zip
解凍すると、Colorize_TriPoly.msというファイルがあると思うので、ボタンに登録するなり、開いておいてCtrl+Eするなりして使ってください。
使い方は、
0.対象オブジェクトは「編集可能ポリゴン」です。
1.マテリアルを準備する。
新規でマテリアルを準備します。
「拡散反射光カラー」のマップに「頂点カラー」を指定します。
マップチャンネルは今回は0です。たぶんデフォルト。
2.この表示をしたいオブジェクトに上記のマテリアルを適用。
ドラッグ&ドロップが楽です。
3.頂点カラーをビューポートで表示できるようにする。
「オブジェクトプロパティ」で
・「頂点のチャンネル表示」にチェックを入れ、その下が「頂点カラー」になっているのを確認。
・「シェーディング」はお好みで。今回はOFFにしています。
4.オブジェクトを選択した状態(サブモードでもOK)でスクリプトを実行する。
*見づらい場合はビューポートの設定で「エッジ面」をチェックすると見やすくなると思います。
あとは、作業中必要に応じて都度スクリプトを実行するだけです。
注意点は、
1.何があっても私は責任を負いませんので、十分にテストして納得されてから実用してください。
特にマップチャンネル0を使用している方はそのデータが上書きされますので、こちらのチャンネルを変更するなどしてください。(スクリプトの最初の行 MapCNo = 0 がマップチャンネルの番号です。また、それに併せてマテリアルのマップチャンネル番号を変更してください)
2.遅いです&リアルタイムではありません。
とりあえず書いたコードで私にとっては問題ない速度で動作していたので、そのままです。
また、多少遅かったとしても使用頻度とコードを考える時間とのバランスを考慮するとこのくらいのレベルで十分だと判断したからでもあります。
コードを見ると判りますが、何度も同じFACEの頂点数を調べる要領の悪いやり方をしているので、そこを他のやり方考えるだけでも速くなりそうです。なので、興味のある方は書き換えて遊んでください。
スクリプトの作りとしてはこれから始めたい方などにはわかりやすい方だと思います。
For~do/IF~then/Case~of といった一般的な処理を含めています。
コードの中身は下記のとおりです。
-- ここから
MapCNo = 0
AllQuad = [0,255,0]
Tri1 = [255,255,0]
Tri2 = [255,192,0]
Tri3 = [255,64,0]
Tri4Plus = [255,0,0]
for i = 1 to $.numverts do
(
Tricount = 0
FaceEx = polyOp.getFacesUsingVert $ #{(i)} as array
for j = 1 to FaceEX.count do
(
VertNum = polyOp.getFaceDeg $ FaceEx[j]
if VertNum == 3 then Tricount += 1
)
Vcolor = case Tricount of
(
0: AllQuad
1: Tri1
2: Tri2
3: Tri3
default: Tri4Plus
)
polyOp.setVertColor $ MapCNo #{(i)} Vcolor
)
--ここまで。
やっていることは、オブジェクトの全ての頂点一つ一つにたいして、
1.その頂点を共有しているFACEをリストアップ
2.そのリストを元にFACEの頂点数を調べる。
3.もし頂点数が3(=三角ポリゴン)ならカウンタを1つ増やす)
として、カウンタの値に応じて頂点に色をつける。
というのを繰り返しているだけです。
独特(?)なのは下の3つ。
1. polyOp.getFacesUsingVert $ #{(i)} as array
リストにある頂点を使用しているFACEのリストを返す。
2. polyOp.getFaceDeg $ FaceEx[j]
リストにあるフェイスが使用している頂点数を返す。
3. polyOp.setVertColor $ MapCNo #{(i)} Vcolor
リストにある頂点の指定したマップチャンネルに、指定した色をつける。
よく出てくる、 $ は選択されているオブジェクトをさします。(確か)
青文字の as Array は型変換で、もしこれをつけない場合は、BitArrayという独特の配列型が返ってくるのに対して、 as Arrayとすれば 通常の配列型で返ってきます。
命令がどれで、変数/パラメータがどれで、、としていけばそんなに難しくないと思います。
ちなみに Tricount += 1 は Tricount=Tricount+1 と同じです。
C言語の書き方なのですが、こちらがスマートだから使いました。
Tricount ++ という記述(インクリメンタル演算子)はダメでした。
PR
Comment