2012年7月2日月曜日

maxスクリプトで頂点を選択

ふと、スクリプトからオブジェクトの頂点を選択したいと思って調べてみた。
実力不足から、ヘルプを上手く活用することができないのもあり、引くに引けず数時間かかってしまった。ちっくしょう。
まだ、maxscriptの構造がボヤっとしているからスムーズに行かないのだろう。

とまあ一応解決したのでメモです。
別にこれ使って、ツール作るとかじゃないです。只、気持ちをスッキリさせたかっただけです。

では、この数時間の経緯を追ってみたいと思います。

はじめに、選択しているオブジェクトの頂点の番号を与えてやれば消せるだろうと考えました。
頂点番号5の頂点を消すと考えて、イメージ的にselectVert $ 5 で消せるかなと。
結果、こんなメソッドは定義されてないということでエラーが出ました。
んで、ヘルプを探りました。慣れないのでどう探したら良いのやら。。
とりあえず、vertexやら何やらで検索かけて探しました。こんなんでよいのか不安になりながら。

するとこういったメソッドを発見
↓↓↓↓
deleteVert

これは、オブジェクトの頂点インデックスを指定して削除するメソッドです。

もう後は、deletevertではなくて頂点選択のメソッドを探すだけかなと思いました。上記のselectVertみたいな。

それがない~んです。
あるのは、
getNumVerts  --オブジェクトの頂点数をゲットするメソッド
getVert  --オブジェクトの指定した頂点をpoint3(現在の座標での位置)を返すメソッド

等々。。。


ここで、振り出しに戻り、又検索の嵐。。自暴自棄になってます。成長しないな~。
てか検索、日本語引っかからないのが腹立つ。何か意味があるのかしら??

そこで「メッシュ頂点の選択:」という欄がありました!
絶対これやん!
getVertSelection
#[]
空の配列マーク?が返ってきた。
ヘルプだと、現時点における頂点の選択セットを返しますということらしい。
このメソッドは選択されている頂点番号を返すだけのようだ。

駄目だ。。もうそんなメソッドないのか。。

またも、しつこくヘルプを探る。ちょっとヘルプの見方に慣れてきた。
とりあえず、頂点はコレクションに格納されているからコレクションのタイプを見てみた。

するとVertexSelection値というのがあった。

バーと流し見してみたら,

select --VertexSelection 内の頂点を選択します。

を発見。と、発見してみたはいいもののってなんだ?

ヘルプより----------------------------------------------------------------------


VertexSelection は、シーン メッシュ ノードの一連の頂点を仮想配列として表します。
これを使用すると、インデックスで頂点にアクセスしたり、頂点間を繰り返したり、マップされた関数を頂点に適用したりできます。

「Editable_Mesh」も参照してください。

VertexSelection 配列は動的です。メッシュ ノードの頂点や選択された頂点の変更に伴って内容が変更されます。

VertexSelection 値はマップ可能です。



----------------------------------------------------------------------------------

では、VertexSelectionを作らなきゃselectできないってことで、用意されているコンストラクタで値を作成してみる。

.selectedVerts  -- メッシュ オブジェクトで現在選択されている頂点です。

.verts -- メッシュ オブジェクトのすべての頂点、読み込み専用です。

この二つが用意されている。
これを使い、作成してみる。

vtx = $.verts
select vtx

できた!!選択したオブジェクトの頂点全部選択できました!!

うわっ、二行とかしょぼ。

頂点番号で指定する場合は

vtx = $.verts
select vtx[#{8}]


コレクションのインデックスで指定する場合は

vtx = $.verts
select vtx[8]


てとこかな。
他にも、いろいろプロパティやら演算子やらあるけど、とりあえずはここまで。

--追記--07/07--
上記の頂点選択スクリプトは何も選択していない状態では効果が見えない。
なので、オブジェクトを一度選択して、さらに頂点レベルに入って選択しなくては効果が見えない。

box001モデルの頂点番号6を選択したいとき

select $box001
subobjectlevel = 1
select $.verts[#{6}]

とする。



まとめ。
なんでこんな時間かかったんやろ。。。
ただ、オブジェクトのプロパティを指定してあげてselectメソッド使うだけなのに。。






0 件のコメント:

コメントを投稿