モディファイヤ サブオブジェクト変換プロパティ

 

   

モディファイヤ クラス - クイック ナビゲーション

MAXScript では、モディファイヤ サブオブジェクト変換プロパティ (中心とギズモの位置、回転とスケールなど) は現在の作業座標系で与えられるのではなく、通常はオブジェクトが所属する座標系にあります。これは、シーン ノード変換プロパティとは逆です。指定する値は該当サブオブジェクトに対応するトラック ビューに表示されるものや、そのサブオブジェクト プロパティの式コントローラ トラック変数で参照されるものとまったく同じになります。ローカル座標からワールド座標に変換するには、ローカル座標をノードの objecttransform 行列で乗算します。ワールド座標からローカル座標に変換するには、ワールド座標をノードの objecttransform 行列の逆行列で乗算します。

obj=box pos:[10,20,30]
addModifier obj (affect_region())
objTM=obj.objecttransform
modTM=getModContextTM obj obj.affect_region
--calculate world coordinates of end point
obj.affect_region.end_point * (inverse modTM) * objTM
--set end point at world coordinates [20,20,0]
obj.affect_region.end_point = [20,20,0] * modTM * (inverse objTM)

FFD コントロール ポイント

FFD コントロール ポイント サブオブジェクト プロパティにもアクセスできますが、特別な配慮が必要です。コントロール ポイント プロパティには、トラック ビューに表示されるものと同じ名前が付けられます。また、空白にはアンダースコア _ を使用するという MAXScript 命名規約の制約を受けます。

$foo.ffd_2x2x2.control_point_1
$baz.ffd_3x3x3.control_point_32 = [1,2,3]

FFD コントロール ポイントにアクセスするときには、特に 2 つの点に注意してください。第一に、アクセスできるコントロール ポイントは、手動でまたは animateVertex() animateAll() MAXScript 関数の使用によって既にアニメートされているものに限られます(「頂点およびコントロール ポイントのアニメーションのスクリプト」を参照)。この動作は、通常の 3ds Max の使用時にトラック ビューで見ることができます。コントロール ポイントをアニメートしない限り、コントロール ポイントのキーフレームをトラック ビューに配置できません。

2 番目に、コントロール ポイント座標は FFD ラティス空間にあります。これは単位空間で、左下隅 (control_point_1 で) [0,0,0]、FFD ラティスの反対側の隅が[1,1,1]となります。設定の際に、隅の座標を計算したりスケール処理するときは注意してください。これは通常の 3ds Max の使用での FFD コントロール ポイントのトラック ビューにも反映されます。これらの値をキーフレーム プロパティ ダイアログ ボックスや関数グラフで見ると、ポイントがワールド空間座標内ではなくこの単位ラティス空間内にあることがわかります。FFD をコントロールするために式コントローラを使おうとするときにも、この空間で作業する必要があります。モディファイヤ ユーティリティ関数 getModContextBBoxMin() および getModContextBBoxMin() を使用して FFD ラティスのワールド空間座標の境界を判断し、スケール処理したラティス空間座標をワールド座標から計算することができます。これらの関数の詳細は、「モディファイヤの共通プロパティ、演算子、メソッド」を参照してください。

次に、FFD コントロール ポイントへのアクセスと座標系の変換のスクリプト例を示します。

b=box pos:[10,20,0]
ffd=ffdbox()
addModifier b ffd
animateVertex ffd 64
cp64posL=ffd.control_point_64
objTM=b.objecttransform
modTM=(getModContextTM b ffd)*ffd.lattice_transform.value
modBBMin=getModContextBBoxMin b ffd
modBBMax=getModContextBBoxMax b ffd
cp64posW=(modBBMin+(cp64posL*(modBBMax-modBBMin)))* (inverse modTM) * objTM