2009年5月27日水曜日

◇アップデート◇ スクリプトオペレータを使用してポイントをX軸に固定するプラグイン

発見したバグを修正した
スクリプトオペレータを使用してポイントをX軸に固定するプラグイン(バージョン1.1)を
アップロードしました。
昨日と同じく以下のアドレスよりダウンロードしてくださいませ。

http://mochi-mochi-web.hp.infoseek.co.jp/


現在までにダウンロードしたかたはダウンロード後ファイルの上書きでOKです。

今日の朝発見したバグですが、どうやらポイントクラスタの特性によるものだったようです。
ポイントクラスタはクラスタ内に含まれるポイントから延びているエッジに新規ポイントが追加された場合、
自動的にクラスタ内に追加するようです。
たぶん。
なので、

1.ポイントクラスタにスクリプトオペレータを実行。
2.ぺったんこになる。
3.ポイントから延びるエッジに新規ポイントを追加
4.新規ポイントもクラスタに強制追加
5.新規ポイントもいっしょにぺったんこ。

という流れになっていたようです。
なので、バージョン1.1ではポイントクラスタではなく、エッジクラスタを使用することとしました。
エッジクラスタであれば不要な新規エッジが追加されることもないようなので、大丈夫かとおもわれます。
たぶん。

なので、使用方法としては『エッジを選択してから実行』となりました。
ご注意くださいませ。



これで、はれてモデリングのお供になるのではないかと・・・。
ただ、処理内容が少し複雑になったため、高ポリゴンになるにつれ処理が重くなることが予想されます。orz

あと、画像のようにクラスタに隣接する場所に新規ポイント等と追加すると少し挙動がおかしくなるようです。
(真中にポイントを追加したつもりでも、ずれてしまう。)
というのも、スクリプトオペレータで強制的にポイントを0にしているだけで本来のポイント位置は別にあるからというのが理由のようです。

これは・・・トレードオフというところでしょうか・・・。
う~~~ん・・・。
常に適用しないほうがいいのかもしれませんねー。
こればっかりは使っていってみないとわからない点です。
とりあえず今はこれで妥協ということで。


拍手する

2009年5月26日火曜日

スクリプトオペレータを使用してポイントをX軸に固定するプラグイン

追記:バグ発見!
またやってしまった・・・orz
ポイントを追加選択ポイント付近に新規ポイントを追加すると
そのポイントもクラスタ内に含まれてしまうようで、X軸0に固定されてしまいます。
クラスタの作成方法が問題か??
近々アップデートしますので、それまではまともに使えないと思われます。
申し訳ないです。

前回の続きその2です。
できました。☆-ヽ(*´∀`)八(´∀`*)ノイエーイ
スクリプトオペレータを使用してポイントをX軸に固定するプラグイン。

せっかく作ったので、公開してみます。
XSI徒然日記さまの「ポイントを0平面で固定」とほとんどおんなじですが気にしない!!
任意のポイントに適用するのででちょっとだけ違うってことで。(;´Д`)
(…スイマセン…orz)


以下のページに飛んで最新プラグインの項目からダウンロードしてください。
PointCls_Zero_Fixation.jsって名前です。

http://mochi-mochi-web.hp.infoseek.co.jp/

ダウンロードしたら解凍して
C:\users\ユーザー名\Softimage\XSIバージョン\Application\Plugins
内にぶち込んでやってくださいませ。
正常にプラグインがインストールされていたらXSI画面右 Transform > 選択ポイントをX軸0に固定 が追加されてるはずです。たぶん。




使用方法は

・ポイントを選択状態にし、Transform > 選択ポイントをX軸0に固定 を実行

のみです。
簡単です。
選択したポイントがX軸に固定されているのをご確認くださいませ。キタ━(゚∀゚)━!
動かしてもX軸は移動しないはずです。


画像はわかりやすく左半分を選択してますが、通常使用用途となるとX軸0付近のポイントのみでしょう。

間違えてしまった場合はオブジェクトのシェイプコンストラクションモードにあるClsZero_Fixationという名前のスクリプトオペレータを(#゚Д゚)ゴルァ!!(削除)してください。
元に戻ります。
逆に用済みになった場合はオブジェクトをフリーズして頂ければきれいさっぱり姿を消します。




ちなみに、そんな複数オブジェクトに一度に適用しないだろうという勝手な考えの元、
オブジェクトの複数選択には対応してないっす。

注意点としてはX軸とはオブジェクトのローカルのX軸となります。
グローバルではありませんのでご注意くださいませ。

疲れたので、苦労した点などはまた後日。
ではぁ~。




あ、ちなみにLand-Yさまからのリクエストされたプラグインの作成は諦めてませんよ~!
とある問題にぶち当たっていまして…orz
もう必要とされていないと思われますが、気長におまちくださいませ。
修行を積んでまいりますので…。


拍手する

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平面で固定」の様にプラグイン化ですねー。
プラグインからスクリプトオペレータを作成するっていう練習であります。
また成果が出たら報告しますー。

では~~~。☆。.:*:・'゜ヽ( ´ー`)ノ


拍手する

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平面で固定」
を見たからなんですけどね。
数万ポリゴンになると重いって書いてたのでクラスタ内だけなら処理も軽いかな~なんて。

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


拍手する