Since | 18.5 |
matrix [] solvephysfbik(matrix xforms[], int parents[], dict jointoptions[], matrix targetxforms[], int targets[], dict targetoptions[], int iters, float damping, float tolerance)
このソルバはsolvefbikとは異なるアルゴリズムを使用します。 このソルバの方が通常では幾分実行が遅いですが、スケルトンの挙動に対するコントロールが多く用意されており、より高品質な結果を生成することができます。 さらに、このソルバは、オプションでジョイント毎の質量と重心位置を使用してスケルトンの重心のターゲット位置を求めることができるので、バランスの維持といった物理ベースの挙動が可能です。
solvefbikと比較すると、このソルバの方がジョイント制限が有効な時の挙動が安定しており、異なる優先度レベルでターゲットが存在している時により正確な結果が生成されます。 さらに、このソルバは、1,2本のジョイントのジョイント角度を大きく変化させるのではなく、チェーンに沿ってジョイント角度の変化をより均等に分散させる傾向があります(特に、方向ターゲットが使用されている時がそうです)。
回転ウェイトと移動ウェイトのパラメータには、計算中おける各ジョイント軸の挙動に対するコントロールが用意されています。 このコントロールを使用することで、特定のジョイントが他のジョイントよりも大きく回転するようにしたり、特定のジョイント軸を固定したり、(伸縮する)ジョイントを移動できるようにすることができます。
以下の場合は空っぽの配列が返されます:
-
xforms
またはjointoptions
のサイズがparents
と同じでない場合。 -
targetxforms
またはtargetoptions
のサイズがtargets
と同じでない場合。
xforms
計算されるリグ内のすべてのトランスフォームのワールドトランスフォーム。
parents
各トランスフォームの親トランスフォームインデックス。-1の値はルートを示します。
jointoptions
ジョイントのオプションパラメータを指定します。有効なキーは以下のとおりです:
rotation_weights
ジョイントの回転軸のウェイトを指定したvector
。
相対ウェイトを大きくするほど、その軸で回転させて解を求めるようになります。
ゼロのウェイトは、その回転軸を無効にします。
デフォルト値は{1,1,1}
です。
translation_weights
ジョイントの移動軸のウェイトを指定したvector
。
相対ウェイトを大きくするほど、その軸に沿って移動させて解を求めるようになります。
ゼロのウェイトは、その移動軸を無効にします。
ルートジョイントをピン留めしないようにするには、そのルートの移動ウェイトをゼロベクトル以外の値(例えば、{1,1,1}
)にしてください。
デフォルト値は{0,0,0}
です。
rotation_order
ジョイントの回転順を指定したint
。
以下に載せている回転順序定数のどれか。
これらの定数は$HFS/houdini/vex/include/math.h
から取り込むことができます。
定数名 |
回転順序 |
---|---|
XFORM_XYZ |
回転順序 X, Y, Z |
XFORM_XZY |
回転順序 X, Z, Y |
XFORM_YXZ |
回転順序 Y, X, Z |
XFORM_YZX |
回転順序 Y, Z, X |
XFORM_ZXY |
回転順序 Z, X, Y |
XFORM_ZYX |
回転順序 Z, Y, X |
rotation_lower_limits
ジョイントの回転軸の回転制限の下限(単位はラジアン)を指定したvector
。
回転制限は、(指定されていれば)ジョイントのローカルRestトランスフォームを基準に適用されます。
Note
特定の軸が回転しないようにするには、この回転制限をゼロに設定するよりも、ウェイトをゼロに設定する方がはるかに効果的です。
rotation_upper_limits
ジョイントの回転軸の回転制限の上限(単位はラジアン)を指定したvector
。
translation_lower_limits
ジョイントの移動軸の移動制限の下限を指定したvector
。
translation_upper_limits
ジョイントの移動軸の移動制限の上限を指定したvector
。
rest_xform
ジョイントの静止ポーズを指定したローカル空間のmatrix
。
デフォルト値は単位行列です。
rest_rotation_weights
このソルバが回転軸の静止トランスフォームに合わせようとする強さを指定したvector
。
これは、どのエンドエフェクターターゲットよりも優先度が低いです。
静止トランスフォーム拘束が有効な時は通常では0.1
の値が最適値で、0の値はその拘束を無効にします。
デフォルト値は{0,0,0}
です。
rest_translation_weights
このソルバが移動軸の静止トランスフォームに合わせようとする強さを指定したvector
。
これは、どのエンドエフェクターターゲットよりも優先度が低いです。
静止トランスフォーム拘束が有効な時は通常では0.1
の値が最適値で、0の値はその拘束を無効にします。
デフォルト値は{0,0,0}
です。
mass
ジョイントに関連付けられているボディの質量を指定したfloat
。
このパラメータは、重心ターゲットが指定されている時にのみ使用されます。
デフォルト値は1.0
です。
local_com
ジョイントの重心の位置をローカル空間で指定したvector
。
{0,0,0}
の値(デフォルト)は、ジョイントの位置に重心を置きます。
targets
スケルトン内のエンドエフェクターのトランスフォームインデックスのリスト。
targetxforms
エンドエフェクターのターゲットワールドトランスフォームのリスト。このリストの順番はtargets
と同じです。
targetoptions
ターゲットのオプションパラメータを指定します。有効なキーは以下のとおりです:
weight
ターゲットの重要度を指定したfloat
。
複数のターゲットが同じ優先度の時は、相対ウェイトが高いターゲットの方へ優先されて到達するようになります。
デフォルト値は1.0
です。
priority
ターゲットの優先度を指定したint
。
優先度の低いターゲットほど優先度の高いターゲットに干渉することができません。
例えば、優先度を使用することで、スケルトンの上半身を操作する時に足を着地させたままにすることができます。
デフォルト値は0
です。
depth
ゴールトランスフォームに到達させるために調整可能な親ジョイントの数を指定したint
。
マイナスのdepth
は、チェーン全体が影響を受けることを意味します。
デフォルト値は-1
です。
target_type
エンドエフェクターがターゲットトランスフォームの位置や向きに合わせる方法を指定したint
。
0
の値(デフォルト)は位置のみのターゲットを示し、1
は向きのみのターゲットを示し、2
は位置と向きの両方に合わせます。
3
の値はスケルトンの重心を制御するターゲットを示します(targets
のトランスフォームインデックスは使用されません)。
Only one center of mass target can be provided.
joint_offset
ソルバがゴールトランスフォームに整列させようとするトランスフォームを生成するためにジョイントトランスフォームと組み合わせるローカル空間トランスフォームを指定したmatrix
。
これを使用することで、ジョイントからオフセットしたところ(例えば、ボーンの終端)にターゲットを配置することができます。
iters
実行する反復回数の最大数。
tolerance
パラメータを使用すれば、ソルバを早く終了させることができます。
damping
ソルバの減衰係数。 例えば、ターゲットに到達不可な時に値が大きいほどより安定した結果が得られます。 しかし、値が大きすぎると、収束に多くの反復が必要になります。 通常では約0.5が適切な初期値です。
tolerance
収束をチェックする時に使用する許容値。デフォルトは1e-5です。
位置がこの許容値内に収束すれば、アルゴリズムが停止します。
0にすると、ソルバは常にiters
の反復回数をそのまま実行します。
See also | |
crowds | |
solve | |
transform |