腕のひねりの補正


 ボーンで腕をひねる場合、そのままだと腕が痩せてねじ切れてしまう。

 クォータニオン補間を使えば痩せないが、まだクォータニオン補間が使えない場合は多い。
 なのでこれを避けるためにボーンを分割して、段階的に回転させるのが一般的。

 しかし、これでも少し痩せてしまう。
 分割するボーンを増やせば軽減されるが、あまり増やすとボーンの設定とウェイトの塗り分けが大変。

 何かいい方法はないものか……。

 ん?

 痩せたのなら、ボーンをスケールして太らせればいいじゃないか。

ボーンの設定

 ボーンの親子関係を以下のようにする。

 Cが本来のひねるボーンで、Bが補正用のボーン。
 通常、CはBの子になっているが、Bを太らせると子のボーンも太るため、親子関係を外す。

 単純にボーンの距離に応じてウェイトを割り当て、Cを90°、Bを45°回転させると下図のようになる。

 ……これではまずい。
 ボーンとボーンの間が痩せているので、BをスケールしてもBの横が太るだけで、凸凹のままだ。

 Bをスケールさせたときにちょうど元の太さになるようにするには、Bの周囲がまんべんなく痩せるようにしないといけない。
 痩せるのは、複数のウェイトが干渉する部分だ。
 だからAとCのウェイトをBの領域まで拡げ、Bのウェイトが他のウェイトとまんべんなく干渉するようにする。

 そうすると下図の左のようになるので、BのXYスケールを160%にすると、右のように痩せが補正される。

 A, B, C のウェイトをグラフで表すと以下のようになった。

 真ん中で3つのウェイトがそれぞれ33.33%になる。
 少々ややこしいので、ウェイトペイントかウェイトエディタは必須だろう。

エクスプレッションの設定

 Cが90°回転したときにBが45°回転するようにするのは、簡単に設定できる。
 LWだったらフォロワーを使って、Bの回転値をCの半分にすればいい。

 Cが90°回転したときにBのXYスケールを160%にするのは、フォロワーではできない。
 Cが-90°になったときも160%にしないといけないので、絶対値が扱えないといけない。
 これはエクスプレッションで設定する。

--

 90°で60%増えるので、倍率は 0.6÷90=0.007 になる。
 これに100%を足す。
 回転値は絶対値になるようabsをつける。
 LWのエクスプレッションだと以下のようになる。

abs([オブジェクト名.ひねりボーン名.Rotation.B]) * 0.007 + 1

 これを補正ボーンのXスケールとYスケールに適用する。

--

 実際は、ウェイトの塗り方で倍率は変わってくる。
 いろんな値を入力して適当な所を探る。
 太りすぎるとけっこう不自然なので気をつける。