2009年5月22日金曜日

前回の続き

前回書いたクラスタに含まれるポイントのX軸を0にするスクリプトの続き。

予告通りスクリプトオペレーターでの適用に挑戦してみました。
手動ですが、一応成功したっす。☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ

手順としては…

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 件のコメント:

コメントを投稿