2010年2月9日火曜日

ブログ移籍

半年間放置した挙句、ブログを移籍してみました。
誰が来てくれるんだと思いますが、一応投稿。

新しいブログは http://d.hatena.ne.jp/mochio326/ です。

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

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


拍手する

2009年4月29日水曜日

自動インストールプラグインバージョン更新メッセージ表示

- 追記 -
えぇっと・・・この記事間違ってたようです。
改めて職場で実験したら見事にXSIが立ち上がるたびにポップアップウインドウが表示されてしまいました・・・
むぅ・・・やはり外部にファイルを置くしかないのか・・・。orz


最近仕事でバリバリと自動インストールプラグインを作成しております。
お陰でだいぶ慣れてきました。
半年にくらべてかなり上達したんじゃぁないだろうか??ヽ(´ー`)ノ

半年前に作ったプラグインの中身なんて見た日にゃ、目も開けられない状態なのです。w|;゚ロ゚|w ヌォオオオオ!!
つい最近も半年ほど前に作ったプラグインの修正要望が来たついでに、
良くしようと思ったらフルスクラッチになってしまったという…

それはそうと、プラグインを大量に作るようになって、更新の際に関係者に告知をするのが面倒になってきました。
告知時に関係者が全員いないこともあるわけで…。
なので、ここはプラグインが更新されたら自動的にポップアップウインドウを出して告知しようと思いました。

今まで職場で使われてきた方法は

  1. バージョン情報を別ファイルに記録
  2. プラグイン更新時に別ファイル内のバージョンと見比べて更新されているか判断
  3. 更新されていたら告知

でした。
でもそれってスマートじゃない!!
別ファイルだったら消されちゃった日にゃ泣くしかないじゃん!!
…と思ったので別手口を模索。

プラグインの更新を行うコマンド Application.UpdatePlugins(); ってのがあるんですが、
これって更新されたかどうかスクリプトログには出力されるのに、なんにも返してくれないんです。
使えねぇやつめ…。ヽ( ・∀・)ノ┌┛ガッΣ(ノ`Д´)ノ

そこで XSILoadPluginコールバックに注目。
XSILoadPluginコールバックはプラグインがロードされたら呼ばれる関数です。
なのでここでポップアップウインドウ出せばいいのでは!!
ということで試してみました。


////////////////////////////////////////////////////////////////////////
function XSILoadPlugin( in_reg )
{
in_reg.Author = "mochio";
in_reg.Name = "hogehoge";
in_reg.Email = "";
in_reg.URL = "";
in_reg.Major = 1;
in_reg.Minor = 0;

//コマンド登録
in_reg.RegisterCommand(hogehoge,hogehoge);
var msg = "\n" +
"■更新情報■\n"+
"いろいろと新しい昨日盛り込んでみました。\n" +
"詳しくはヘルプドキュメントをご覧下さい。";

XSIUIToolkit.MsgBox("――― Plugin " + in_reg.Name + "が更新されました。――――\n" + msg,siMsgOkOnly,"更新情報");

return true;
}
////////////////////////////////////////////////////////////////////////


  1.  プラグインファイルを更新
  2.  XSIでプラグインの更新をポチっとな
  3.  ポップアップウインドウが表示される。
  4.  もう一回XSIでプラグインの更新をポチっとな。
  5.  ポップアップウインドウは表示されず。

おぉ!!これいいのでは!?
しかし…
  1.  XSIを立ち上げる
  2.  かならずポップアップウインドウが表示される。∑ヾ( ̄0 ̄;ノ オーット!
という罠が…。
というのもXSIを立ち上げたときにもすべてのプラグインがロードされてるからですね。
そりゃそうか。ε=( ̄。 ̄;A フゥ…

まぁいっか~と放置して数日。
また気になり始めたので再度挑戦。

今度はXSILoadPluginコールバック内で、バージョン等を記述している点に注目。
ってことはその記述よりも前にバージョンを取得して、後に再度取得すればバージョンの比較ができんじゃねぇだろうか??
ということで試してみたのがρ( ̄∇ ̄o) コレ

////////////////////////////////////////////////////////////////////////
function XSILoadPlugin( in_reg )
{
//旧プラグインバージョンの確認(文字列なのはわざとよ~)
var Old_Plugin_Version = in_reg.Major + "." + in_reg.Minor;

in_reg.Author = "
mochio";
in_reg.Name = "hogehoge";
in_reg.Email = "";
in_reg.URL = "";
in_reg.Major = 1;
in_reg.Minor = 0;

//新プラグインバージョンの確認
var New_Plugin_Version = in_reg.Major + "." + in_reg.Minor;

//コマンド登録
in_reg.RegisterCommand(hogehoge,hogehoge);

if(Old_Plugin_Version != New_Plugin_Version){
var msg = "\n" +
"■バージョン情報■\n"+
Old_Plugin_Version + " >> "+ New_Plugin_Version + " \n\n" +
"■更新情報■\n"+
"いろいろと新しい昨日盛り込んでみました。\n" +
"詳しくはヘルプドキュメントをご覧下さい。";

XSIUIToolkit.MsgBox("――― Plugin " + in_reg.Name + "が更新されました。――――\n" + msg,siMsgOkOnly,"更新情報");

}

return true;
}
////////////////////////////////////////////////////////////////////////


こんどこそ出来た~~!!d(>_< )Good!!
これで更新情報を告知したいときはバージョン情報を書き換えればOKだわ~~!
一応個人的要件は満たしてるから満足。

…でももっと簡単な方法あったりします??
だれか知ってたら教えて下さいーー (;^_^A アセアセ・・・



拍手する

2009年3月30日月曜日

のぉぉぉぉぉぉ!!! ウワァァ-----。゚(゚´Д`゚)゚。-----ン!!!!

さっきの記事を投稿して10秒。
メールを確認したらLand-Yさまより、
「他の方にプラグイン作っていただきました」
とのメールが!!
それも2日前。
(ブログへのコメントなんですが、メールでも届く設定にしております。)

やっちまったよー!!
かぁーちゃん!!orz

ウワァァ-----。゚(゚´Д`゚)゚。-----ン!!!!


せっかくリクエストしてくださったのにーーーーーーーーーーーーーーー!!
何たる失態!!!
アホー!自分のアホーーーー!!!ヽ(`Д´#)ノ ムキー!!

…ちなみに代わりに作って下さったのはゲームモーションブログさまです。

で、でも、ゲームモーションブログさまのものは選択している頂点にのみ有効…なのかな???
い、一応自分で今作っているのはポリゴンでもいいようにする予定だったから続けて開発はしよう…うん、そうしよう。
でもって詫びることによう。
いや、いま詫びよう。

m(_ _)m m(_ _)mホントすいませんでした。m(_ _)m m(_ _)m



拍手する