2009年5月18日月曜日

クラスタ(エッジ)内に含まれるポイントのX軸を0にする

エッジのクラスタを作成。
クラスタを選択した状態で実行するとクラスタ内に含まれるエッジを取り出し、
さらに中に含まれるポイントを取り出して、ポイントのX軸を0にするというもの。

プラグイン化もされてないし、ソース貼り付けるだけですが…。

///////////////////////////////////////////////////////////////////////////////////////////////
var oCluster = Selection(0);
//クラスタからサブコンポーネントコレクションを取得
var oSubComponent = oCluster.CreateSubComponent().ComponentCollection;

//コレクション作成
//var PointArray = new ActiveXObject( "XSI.Collection" );
var PointArray = new Array();

for(var i = 0; i < oSubComponent.count; i++){
for(var h = 0; h < oSubComponent(i).Points.count; h++){
var flg = true;
for(k = 0; k < PointArray.length; k++)if(PointArray[k] == oSubComponent(i).Points(h).index)flg = false;
if(flg)PointArray.push(oSubComponent(i).Points(h).index);
}
}


//オブジェクトのポイント
var ObjPnt = oCluster.Parent3DObject.ActivePrimitive.Geometry.Points;
var aPos = new VBArray(ObjPnt.PositionArray);
var aPos2 = aPos.toArray();


for(var i = 0; i < PointArray.length; i++)aPos2[PointArray[i]* 3] = 0;

//オブジェクトをフリーズ
FreezeObj( oCluster.Parent3DObject.name );

ObjPnt.PositionArray = aPos2;

///////////////////////////////////////////////////////////////////////////////////////////////


ポリゴンとかエッジとかポイントとかあんまりスクリプトからいじったことがないので練習がてら作ってみました。
(めんどくさいことをしてるのは練習のため。)
今回明らかになったのはJScriptではポイントのポジション配列を戻す際、オブジェクトをフリーズしなくてはならないということ。
VBではそんなことないように見えるんだけど…なんとめんどくさい仕様なんだろ。
それもこれもJScriptが2次元配列をだね…ブツブツ…。

ポイントのX軸を0にするっていうのは、対象化した際マージするポイントにはよくやる作業ですよね。
たぶん。

このままプラグイン化するのは簡単だけども、
今後できたらいいなーと思ってるのがスクリプトオペレータを使った展開。
毎回スクリプトを実行するのはめんどうですし。
スクリプトオペレータだったらクラスタ内に含まれるポイントには常に効果が表れるということになりますからね。

というのも、
XSI徒然日記さんの「ポイントを0平面で固定」
を見たからなんですけどね。
数万ポリゴンになると重いって書いてたのでクラスタ内だけなら処理も軽いかな~なんて。

まぁ、まだスクリプトオペレータ勉強中なのでどうなるか分かりませんが…。
なんか成果がでたら報告します。


拍手する

2 件のコメント:

  1. はじめまして TERAと申します。

    最近スクリプトをはじめたばかりで、うんうん、うなる日々です。
     ちょうど、タグ付けしたポイントをカーブに沿わせるスクリプトを作成してますので、記事を参考にさせてもらいます(ペコリ
     JScriptを使用してますが、Arrayの使い方が、VBArrayの理解が前提というところがあって、なかなかつらいですよ。

     次のスクリプトオペレーターでの適用がミソなので、期待してます。

    返信削除
  2. TERAさま、いらっしゃいませです。
    参考には…なったらうれしいです。

    TERAさまのスクリプトは「難しそうなのを作っておられる…」と先日ブログを拝見して思いました。

    VBArrayは配列がやたらと長くなるから面倒ですよねー。
    何で2次元配列サポートしてないんじゃーー!!あほーーー!!という感じです。
    (まぁJScriptでも配列に配列入れれば同じことはできるわけですが…。)

    スクリプトオペレータに関しては勉強始めたばっかりなので、まともにできるかどうか心配ですが頑張ってみますです。

    TERAさま、お互いがんばりましょー!!

    返信削除