予告通りスクリプトオペレーターでの適用に挑戦してみました。
手動ですが、一応成功したっす。☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ
手順としては…
1.ポリゴンメッシュオブジェクトのプリミティブノード(Explorerでは[Polygon Mesh])上で右クリック
2.[スクリプトオペレータの設定]を選択。
3.X軸を0にしたいポイントのクラスタを作成
4、3をScripted Operator Rditor 内上部の表の部分にドラッグ(名前:InPoint アクセス:In ってのができるはず。名前等はそのままでOK)
5.下記ソースを真ん中のウインドウにコピペ
//クラスタオブジェクトを取得
var Pnt = Dictionary.getobject(InPoint.value ,false);
//クラスタ内のコレクションを取得
var PntList = Pnt.CreateSubComponent().ComponentCollection;
//すべてのポイントの位置を取得
var AllPntPos = new VBArray(Inpolymsh.value.Geometry.Points.PositionArray).toArray();
//配列の書き換え(該当ポイントのX軸が0になるようにする)
for(var i = 0; i < PntList.count; i++)AllPntPos[PntList(i).Index * 3] = 0;
//結果の適用
Out.Value.Geometry.Points.PositionArray = AllPntPos;
6.適用ボタンをクリック
以上でスクリプトオペレータの作成は完了です。
適用をクリックした瞬間にクラスタ内のポイントがOのポイントに移動したはずです。
ただしローカル基準の話です。
グローバルではありません。
回転が0で移動だけしているのならグローバル基準での適用も可能なんですが、回転値なんて入ってた日にゃ無理っす。
(簡単な方法しらないだけかも?)
前回の記事ではJScriptはポイントを編集する際オブジェクトをフリーズしなければならないと書きましたが、
スクリプトオペレータは例外のようです。
なんでかは知らないので聞かんといてちょーだい。
それとクラスタ内のポイントを取得する際、何故かそのままでは取得できなかったので
一旦オブジェクトを取得してからサブコンポーネントの取得をしました。
これ↓↓じゃなんでダメなんですかね??
InPoint.value.CreateSubComponent().ComponentCollection;
ご存じの方いましたら是非教えて下さいませ。 ナンデダロ~ォ♪((乂(゚д゚ ;)≡(; ゚д゚)乂))ナンデダロ~♪
あと、スクリプトオペレータ適用後にポイントの編集などした場合は見事に0以下に移動しちゃいます。
総スルーです。(´○`; ポカーン
これはポイント編集の履歴のほうがスクリプトオペレータよりモデリング上位に来てしまうからみたいですねー。
なのでそのスクリプトオペレータをポイント編集の履歴より上位に持っていけば無問題っす。
さらに言うとシェイプコンストラクションモード内に置いておけばモデリング中は常にスクリプトオペレータが適用されることになるようです。キタ━(゚∀゚)━!
次の展開としてはXSI徒然日記さんの「ポイントを0平面で固定」の様にプラグイン化ですねー。
プラグインからスクリプトオペレータを作成するっていう練習であります。
また成果が出たら報告しますー。
では~~~。☆。.:*:・'゜ヽ( ´ー`)ノ
0 件のコメント:
コメントを投稿