こういう機能が欲しい!
これぐらいのスクリプトならすぐ出来そうだから作ってみたけど、めちゃめちゃ遅い!
なにをやっても遅いです。
ハイポリには使えないツールなので、そのまま失敗作のフォルダに入れておきます。
こういうスクリプトはどっかで見たことがあるなー
きっとこれより速いんだろうなー。
と思って、りんぷるさんのサイトに似たようなツールがありました。
俺のしょぼいスクリプトと違って、シンメトリマップを利用しています。
これはめちゃめちゃ速いです!さすがりんぷるさんですね。
エッジとポリ選択は普通に1個ずつの位置を比べているから、めっちゃ遅いけど。
りんぷるさんのスクリプトは両側を選択するので、少しいじってみました。
自分のパクリバージョンは、反対側だけを選択します。SHIFTを押しながら実行すると両側を選択します。
そして、エッジとポリゴン選択にもこのシンメトリマップを利用すれば早くなるんじゃないかと思って、せっかくいじってるから色々実験してみました。
結果は3倍以上速くなりました!!
スクリプトはここからDOWNLOADが出来ます。

では、ここからはスクリプト的な話です。ちょっとしたメイキングオブ。
VBScriptでは変数を宣言しなくてもスクリプトが動きますが、なぜか計算が遅くなります。
なので、VBScriptで書くなら宣言した方が良い。
とrrayさんが si-community.com で実験したことを覚えています。
こういうシンプルなスクリプトでも影響があるか試してみました。
XSI男にサブディビジョン x3 をかけて、38148ポリになりました。
左腕をポイント選択して、スクリプトを実行。
その結果:
ポイント・宣言なし:305 ms
ポイント・宣言あり : 276 ms
エッジとポリゴンが時間掛かりすぎるので、XSI男にサブディビジョンx1にして(9540ポリ)で試してみました:
ポリ・宣言なし:10022ms
ポリ・宣言あり:9485ms
エッジはもっと遅いので、サブディビジョン無し:
エッジ・宣言なし:62711ms
エッジ・宣言あり:58898ms
変数を宣言するだけで 5 ~ 7% のパフォーマンスが上がりました。
もっと複雑なスクリプトの場合は、この差がもっと大きくなるんでしょうね。
Option Explicitを使ったほうが良さそうですね。
※ Option Explicit とは、全部宣言しないとエラーが出てくるオプションです。使い方は:Option Explicit を書くだけです。
ポリゴンとエッジ選択が遅い原因は、選択されているポリゴンのXYZ位置をオブジェクトの全ポリゴンのと一個ずつ比べるからです。
それで思いついたことは、選択したポリゴンをポイントに変えて、シンメトリーマップで反対側を取得して、ポリゴンに戻せば速くなるんじゃないかな。
これだけでは正確にミラー選択が出来ませんが、ある程度ポリゴン数を一気に絞ることが出来ました。
これから絞られたポリゴンだけに比べれば良いです。
この2ステップ比較法は自分のしょぼいスクリプトを少しでも早くするために使っていたから、ここでも試してみました。
結果は:
XSI男にサブディビジョンx1 、腕を選択してからスクリプト実行:
エッジ : 62133 ミリ秒 --> 17984 ミリ秒
ポリ : 9758 ミリ秒 --> 3117 ミリ秒
結構速くなりましたね!3倍以上!
あのしょぼいスクリプトの作成時間は無駄ではありませんでした。良かったな~。
誰かの役に立てば良いな。
あっ、もう一つ分かったのは、XYZ位置を比べる時に、XYZ同時より、軸を一つずつ絞っていったほうが速いです。
良く考えてみると当たり前ですけどね。
3軸同時で比べたほうが書くところが減るから楽だと思ってそう書いてました。最初スクリプトを勉強し始めた時にOMなんかにこだわりがなかったし、何秒ぐらいは待てるじゃんと思っていたけど、やっぱりコンポーネントとかになると、計算が半端なく重たくなってしまいますね。スクリプトは1コアしか使えないし。
では、また。