myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | Center 移動 スクリプト

前回MayaのPivot整列ツールを作ったからいつかSI版も作ってmAlignの次のバージョンに入れようと思っていました。

でも、SI版も欲しいと言われたので書いてみました。

Mayaと違ってSIのSDKに少しは慣れていてすぐに出来そうだから書いてみようと。丁度暇だったし。

や、詰まらない仕事がまだ残ってるけどね。

DOWNLOAD

そして、CamStudioをDLして、初めての動画を作ってみました。Followしかしてない俺のvimeoアカウントの初動画でございます。



スクリプトのちょっとだけの解説:

今回はグローバルとローカル両方対応するように書いてみました。

そのために、以下の2つのコマンドを利用しています:

Geometry.GetBoundingBox()

GetBBox()


GetBBox は グローバルのバウンディングボックスを返してくれます。そしてGetBoundingBoxはローカルのを返してくれます。しかし返ってくるデータは違います。

GetBox()の場合は 最大数値 x, y, z と 最小数値 x, y z という風に6個の数値を出してくれます。
一方
GetBoundingBox()はバウンディングボックスの真ん中 x, y, z と x, y, z の長さを出してくれます。

なので、ローカルのXの最大値はそのままじゃ分からないけど、センターと長さがあれば十分ですね。
センター + (Xの長さ / 2) で 分かります。
同じく
センター - (Xの長さ / 2) で Xの最小値が分かります。

それだけですね、あとは Translate で移動するとスクリプトの出来上がりです。


Maya版もローカル移動も欲しいかもな~。
でもMayaは面倒だな・・・。やる気が出たらまた書いてみます。

それじゃ、また。


追記:メインファンクションのコードを貼っておきます:


function alignpivot(opt, kine){
/*
opt: 0 = X min, 1 = Y min, 2 = Z min
3 = X max, 4 = Y max, 5 = Z max
6 = X avg, 7 = Y avg, 8 = Z avg
kine: 0 = local
1 = global
例: alignpivot (0, 0) --> ローカル座標のX軸の最小値にピボットを移動する
*/
var sel = selection
for ( var i=0, a = sel.Count; i < a; i++ ) {
//local:
if (kine == 0){
var bboxVba = sel(i).ActivePrimitive.Geometry.GetBoundingBox()
var bbox = bboxVba.toArray() ;
var x = 0;
var y = 0;
var z = 0;
if (opt == 0) { x = bbox[0] - (bbox[3] /2) }
if (opt == 1) { y = bbox[1] - (bbox[4] /2) }
if (opt == 2) { z = bbox[2] - (bbox[5] /2) }
if (opt == 3) { x = bbox[0] + (bbox[3] /2) }
if (opt == 4) { y = bbox[1] + (bbox[4] /2) }
if (opt == 5) { z = bbox[2] + (bbox[5] /2) }
if (opt == 6) { x = bbox[0] }
if (opt == 7) { y = bbox[1] }
if (opt == 8) { z = bbox[2] }
Translate(sel(i), x, y, z, siRelative, siLocal, siCtr, siXYZ, null, null, null, null, null, null, null, null, null, 0, null);
}
// global:
if (kine == 1){
var bbox = GetBBox(sel(i))
var x = sel(i).kinematics.global.posx.value
var y = sel(i).kinematics.global.posy.value
var z = sel(i).kinematics.global.posz.value
if (opt == 0 || opt == 3){ x = bbox(opt) }
if (opt == 1 || opt == 4){ y = bbox(opt) }
if (opt == 2 || opt == 5){ z = bbox(opt) }
if (opt == 6) { x = (bbox(0) + bbox(3))/2 }
if (opt == 7) { y = (bbox(1) + bbox(4))/2 }
if (opt == 8) { z = (bbox(2) + bbox(5))/2 }
Translate(sel(i), x, y, z, siAbsolute, siGlobal, siCtr, siXYZ, null, null, null, null, null, null, null, null, null, 0, null);
}
}
}