Skin Weights Transfer

概要

Skin Weights Transfer は、選択したコンポーネント上で、複数のソースインフルエンスから複数のターゲットインフルエンスにスキンウェイトを移動するツールです。

ソースインフルエンスのウェイトは比例配分で減算され、その分がターゲットインフルエンスに分配されます。複数ターゲットへの分配方法は Even(均等)、Proportional(既存ウェイト比率)、Distance(距離ベース)の 3 種類から選択できます。移動量はパーセンテージまたは絶対値で指定できます。

Soft Selection に対応しており、フォールオフ領域のコンポーネントも含めて、ウェイト値に応じた量のウェイトが移動されます。

起動方法

専用のメニューか、以下のコマンドでツールを起動します。

import faketools.tools.rig.skin_weights_transfer.ui
faketools.tools.rig.skin_weights_transfer.ui.show_ui()

image001

使用方法

ウェイトを移動するには、以下の手順を行います。

  1. skinCluster が設定されたメッシュまたはコンポーネントを選択し、SET ボタンをクリックして skinCluster を設定します。
  2. 左側の Source (from) リストから、ウェイトの移動元となるインフルエンスを選択します(複数選択可: Ctrl+クリック / Shift+クリック)。
  3. 右側の Target (to) リストから、ウェイトの移動先となるインフルエンスを選択します(複数選択可: Ctrl+クリック / Shift+クリック)。
  4. Distribution コンボボックスで分配方法を選択します(ターゲットが複数の場合に有効)。
  5. 対象となる頂点・CV・ラティスポイントを選択します(Soft Selection 有効時はフォールオフ領域も含まれます)。
  6. 転送モード(Percentage / Value)を選択します。
  7. Amount スライダーで移動量を設定します。
  8. 実行ボタンをクリックしてウェイトを移動します。

オプション

SkinCluster

操作対象の skinCluster を設定します。

  • メッシュまたはコンポーネントを選択した状態で SET ボタンをクリックすると、選択されたオブジェクトに設定されている skinCluster が自動的に検出されます。
  • 検出された skinCluster 名がフィールドに表示されます。

インフルエンスフィルター

インフルエンスリストの表示を絞り込む機能です。

  • テキストフィルター: スペース区切りでキーワードを入力すると、いずれかのキーワードを含むインフルエンスのみが表示されます(OR 検索)。
  • Affected Only ボタン: オンにすると、現在選択しているコンポーネントに対してウェイトが 0 より大きいインフルエンスのみが表示されます。表示順はウェイトの合計値が大きい順にソートされます。Maya の選択を変更するとリアルタイムに更新されます。

Source (from) リスト

ウェイトの移動元となるインフルエンスを選択します。

  • 複数のインフルエンスを選択できます(Ctrl+クリック / Shift+クリック)。
  • 選択中のインフルエンス数がラベルに [N] の形式で表示されます。
  • リストで選択したインフルエンスは Maya ビューポート上でハイライト表示されます。

Target (to) リスト

ウェイトの移動先となるインフルエンスを選択します。

  • 複数のインフルエンスを選択できます(Ctrl+クリック / Shift+クリック)。
  • 選択中のインフルエンス数がラベルに [N] の形式で表示されます。
  • Source と Target で同じインフルエンスを選択することはできません(重複するとエラーになります)。

Distribution(分配方法)

複数のターゲットインフルエンスにウェイトを分配する方法を選択します。ターゲットが 1 つの場合は、どの設定でも結果は同じです。

  • Even: 移動したウェイトを全ターゲットに均等に分配します。
  • Proportional: 各ターゲットの既存ウェイト比率に基づいて分配します。すべてのターゲットのウェイトが 0 の場合は、自動的に Even にフォールバックします。
  • Distance: コンポーネントと各ターゲットジョイントの距離に基づいて分配します(逆距離加重法)。近いジョイントほど多くのウェイトを受け取ります。

転送モード(Percentage / Value)

ウェイトの移動方法を選択します。

  • Percentage: ソースインフルエンスのウェイト合計に対する割合(0〜100%)で移動量を指定します。
  • Value: 絶対値(0.0〜1.0)で移動量を直接指定します。ソースのウェイト合計を超える場合は、ソースの合計値にクランプされます。

Amount

転送モードに応じた移動量を指定します。

Percentage モード(デフォルト):

  • 100%: ソースインフルエンスのウェイトをすべてターゲットに移動します。
  • 50%: ソースインフルエンスのウェイトの半分をターゲットに移動します。
  • 0%: ウェイトは移動されません。

Value モード:

  • 1.0: 最大 1.0 のウェイトをターゲットに移動します(ソースの合計を超えない範囲)。
  • 0.1: 最大 0.1 のウェイトをターゲットに移動します。

Shift キーによるスナップ:

Shift キーを押しながらスライダーをドラッグすると、値が一定の刻みでスナップします。

  • Percentage モード: 5 刻み(0, 5, 10, 15, … 100)
  • Value モード: 0.05 刻み(0.00, 0.05, 0.10, 0.15, … 1.00)

複数のソースインフルエンスが選択されている場合、各ソースのウェイトは保有比率に応じて比例配分で減算されます。

Soft Selection 対応

Maya の Soft Selection が有効な場合、フォールオフ領域のコンポーネントも自動的に対象に含まれます。各コンポーネントの移動量は Soft Selection のウェイト値(0.0〜1.0)に応じて乗算されます。

  • ウェイト 1.0(直接選択): 指定した Amount がそのまま適用されます。
  • ウェイト 0.5(フォールオフ中間): Amount の 50% が適用されます。
  • ウェイト 0.0(範囲外): ウェイトは移動されません。

Soft Selection が無効の場合は、従来通りすべての選択コンポーネントに対して均等に移動が行われます。

注意: Affected Only フィルターは Soft Selection の影響を受けず、従来通り直接選択されたコンポーネントのみを参照します。

ウェイト移動の仕組み

各コンポーネントに対して以下の計算が行われます。

  1. すべてのソースインフルエンスのウェイト合計を算出します。
  2. 転送モードに応じた移動量を算出し、Soft Selection ウェイトを乗算します。
  3. 各ソースインフルエンスから、保有比率に応じてウェイトを比例配分で減算します。
  4. 減算した合計分を、選択した Distribution 方法に基づいてターゲットインフルエンスに分配・加算します。

Percentage モードの計算式:

移動量 = ソース合計 × (Amount / 100) × Soft Selection ウェイト

Value モードの計算式:

移動量 = min(Amount × Soft Selection ウェイト, ソース合計)

単一ターゲットの例

例(Percentage モード):

  • Source A のウェイト: 0.6、Source B のウェイト: 0.3、Amount: 50%、Soft Selection ウェイト: 1.0 の場合
  • 移動量: (0.6 + 0.3) × 0.5 × 1.0 = 0.45
  • Source A から減算: 0.45 × (0.6 / 0.9) = 0.30 → 残り 0.30
  • Source B から減算: 0.45 × (0.3 / 0.9) = 0.15 → 残り 0.15
  • Target に加算: +0.45

例(Soft Selection 適用時):

  • 同じ条件で Soft Selection ウェイトが 0.5 の場合
  • 移動量: (0.6 + 0.3) × 0.5 × 0.5 = 0.225
  • Source A から減算: 0.225 × (0.6 / 0.9) = 0.15 → 残り 0.45
  • Source B から減算: 0.225 × (0.3 / 0.9) = 0.075 → 残り 0.225
  • Target に加算: +0.225

複数ターゲットの例

例(Even 分配):

  • Source A のウェイト: 0.9、Amount: 100%、Target X と Target Y の 2 つを選択
  • 移動量: 0.9
  • Target X に加算: 0.9 × 0.5 = 0.45
  • Target Y に加算: 0.9 × 0.5 = 0.45

例(Proportional 分配):

  • Source A のウェイト: 0.6、Amount: 100%、Target X(既存ウェイト 0.3)と Target Y(既存ウェイト 0.1)を選択
  • 移動量: 0.6
  • Target X の比率: 0.3 / (0.3 + 0.1) = 0.75
  • Target Y の比率: 0.1 / (0.3 + 0.1) = 0.25
  • Target X に加算: 0.6 × 0.75 = 0.45
  • Target Y に加算: 0.6 × 0.25 = 0.15

例(Distance 分配):

  • Source A のウェイト: 0.8、Amount: 100%、Target X(頂点から距離 2.0)と Target Y(頂点から距離 8.0)を選択
  • 移動量: 0.8
  • Target X の逆距離: 1/2.0 = 0.5
  • Target Y の逆距離: 1/8.0 = 0.125
  • Target X の比率: 0.5 / (0.5 + 0.125) = 0.8
  • Target Y の比率: 0.125 / (0.5 + 0.125) = 0.2
  • Target X に加算: 0.8 × 0.8 = 0.64
  • Target Y に加算: 0.8 × 0.2 = 0.16

対象コンポーネント

以下のコンポーネントタイプに対応しています。

  • 頂点(Vertex)
  • CV(Control Vertex)
  • ラティスポイント(Lattice Point)

選択されたコンポーネントが skinCluster のジオメトリに属していない場合、エラーとなります。