ヘア コンストレイントのセットアップ

 
 
 

コンストレイントを使用して、ヘア カーブをスタイリングします。たとえば、コンストレイントはヘアを後ろにまとめたりポニーテイルにするときの髪留めの役割を果たします。作成できるコンストレイントには、輪ゴム(Rubber Band)スティック(Stick)トランスフォーム(Transform)ヘア対ヘア(Hair to Hair)毛束(Hair Bunch)衝突球(Collide Sphere)そして衝突立方体(Collide Cube)などさまざまな種類があります。コンストレイントの種類については、ヘアのコンストレイントの種類を参照してください。最後の 2 つは黙示的な衝突コンストレイントで、他の種類のコンストレイントとは違った効果をもたらします。詳細については、衝突ヘア コンストレイントの扱いを参照してください。

コンストレイントを作成すると、選択したヘア カーブに影響を与えるようにコンストレイントが設定されます。これらのヘア カーブの ID は、hairConstraint ノードのカーブのインデックス(Curve Indices)アトリビュートに保存されます。ID は、ヘア システム上のヘアのインデックス(UV グリッドのロケーション)を示します。

開始フレームでは、シミュレーションによって、コンストレイント ノードの位置に最も近いコンストレイント対象カーブ上のポイントが定義されます。現在のフレームがこの開始フレーム以前の場合は、コンストレイント ノードと接続点を最も近いポイントの更新に移動できます。シミュレーションを再生するときには、コンストレイントはカーブ全体ではなく、このポイントの最初の集合に対して作用します。コンストレイントの種類によって、このポイントの集合をシミュレートする方法が決まります。

これにより、シミュレーションの開始時にはコンストレイントによってヘアにフォースがまったく適用されず、シミュレーションが進むにつれてコンストレイントされるようになります。一般的に、コンストレイントは、ヘアの開始位置とシェイプをモデリングおよび定義した後に適用します。シミュレーション開始フレームのモデルの位置を編集したり、異なるシーン向けに設定する場合は、開始フレームのヘアに対する相対的な位置が変わらないように、あるヘアの毛根ノードまたはオブジェクト トランスフォームのコンストレイントをグループ化した方がよい場合があります(コンストレイントは、毛束(Hair Bunch)コンストレイントを除いて、常に開始位置(Start Position)との相対関係で定義されるため)。

コンストレイントは、ポイントの集合にフォースを適用することで機能します。適用されるフォースの量は、コンストレイントの固さ(Stiffness)アトリビュートによってスケールされます。下回るとポイントへのコンストレイントの関連付けが失われるしきい値を定義する粘着の強さ(Glue Strength)アトリビュートもあります。ポイントは、開始フレームでコンストレイントに接着されます。コンストレイントによって適用されるフォースがこの粘着の強さを超えると、コンストレイントが失われ、そのポイントはシミュレーションの残りの部分ではコンストレイントされなくなります。粘着の強さが 1 の場合、粘着力が無限に強く、コンストレインが失われることはありません。シミュレーションの半ばでコンストレイントをスナップするのに必要な強さは加減が難しく、適切なポイントでコンストレイントが失われるように(0 と 1 の間の)粘着値をいくつか試してみる必要がある場合があります(必要に応じて、1 から 0 までの間で粘着の強さをアニメートすることもできます)。

コンストレイントは、選択した各カーブの 1 つのポイントだけに作用するため、同一のカーブ集合の異なる位置に複数のコンストレイントを適用し、カーブの複数のポイントをコンストレイントした方がいい場合もあります。

ヘアのコンストレイントを設定するには

  1. 目的のヘアカーブを選択します。
  2. ヘア > コンストレイントの作成(Hair > Create Constraint)を選択後、適切なコンストレイント タイプを選択します。詳細については、ヘアのコンストレイントの種類を参照してください。
  3. hairConstraintShape ノードのコンストレイント アトリビュートを設定します。コンストレイント アトリビュートについては、hairConstraintShape を参照してください。

ヘアのコンストレイントの種類

ここでは、コンストレイントの種類について説明します。

輪ゴム(Rubber Band)

コンストレイントから設定ポイントにゴムを取り付けるようなものです。各ラバー バンドの長さは、開始フレームのコンストレイントからポイントまでの距離になります。ポイントとコンストレイント間の距離がラバーバンドの長さより長くなった場合、コンストレイントに向かって引っ張るフォースが作用します。

スティック(Stick)

コンストレイントから設定ポイントに棒を取り付けるようなもので、この棒はコンストレイントの中心を軸にして自由に回転することができます。これは、距離が長くなった場合の引力に加えて、コンストレイントとポイント間の距離が開始距離より短くなった場合には反発力が働くことを除いて、輪ゴム(Rubber Band)コンストレイントと同じです。このため、すべてのコンストレイント対象ポイントは、コンストレイントの中心から固定距離に保たれる傾向があります(開始フレームでの距離)。

トランスフォーム(Transform)

開始フレームでゼリーの固まりにポイントをコンストレイントしているようなものです。スティック(Stick)コンストレイントと違い、回転されたり、スケールされたりすると、コンストレイント ノードがコンストレイント対象のポイントに沿って引っ張られます。コンストレイント ノードの変形は、事実上このゼリーの固まりのトランスフォームというわけです。これは、肩のような接触点に沿ってヘアが流れ落ちるようにコンストレイントする際に便利です。またこれを利用して、手でつかんだり、ねじったときのヘアをシミュレートすることもできます。コンストレイントのスケールをアニメートすると、ヘアをまとめたり、分けたりすることができます。

ヘア対ヘア(Hair to Hair)

これを使用すると、(リボンを使った場合のように)ヘアを束ねて、コンストレイント位置に対してそのヘアのグループを自由に動かすことができます。実際のコンストレイントはヘアと自由に動かせるスティック(Stick) コンストレイントのようなものです。コンストレイント位置は開始フレームでのみ参照され、その後内部で使用されるコンストレイントがダイナミックに更新されます。

毛束(Hair Bunch)

少ない計算量で自己衝突と同じようにアニメートするときに、ヘアに対するボディを作成するのに便利です。コンストレイントに最も近い最初のポイント集合は、(集合体の幅に従って)オーバーラップしているところで互いに反発します。接触するとポイントがわずかにくっついてしまう、静電気現象のような状態もあります。ヘアのまとまりが開始フレームでオーバーラップしている場合、突然分かれてしまうこともあります(シミュレーション開始時にフォースがない他の手法とは異なります)。この問題は、状態が落ち着くまでシミュレーションを実行してから、開始位置(Start Position)を設定することによって解決できます。

衝突球(Collide Sphere)、衝突立方体(Collide Cube)

黙示的な衝突オブジェクトとして動作する球または立方体を挿入します。必要に応じて球または立方体をトランスフォームします。詳細については、衝突ヘア コンストレイントの扱いを参照してください。

注:

ヘアが衝突球(Collide Sphere)衝突立方体(Collide Cube)コンストレイント上で落ち着かない場合や、弾んでしまう場合は、コンストレイントの固さ(Stiffness)を下げます。特に、動きの速いコンストレイントやヘアでは、ヘアが速いスピードでコンストレイントから飛び出すことがあります。多くの場合、固さ(Stiffness)の値を下げることでこの問題は解決できます。

衝突ヘア コンストレイントの扱い

他のヘアのコンストレイントとは異なり、衝突球(Collide Sphere)衝突立方体(Collide Cube)は、ヘアの特定の CV だけではなくヘア全体に作用します。ジオメトリとの衝突に比べて、このようなオブジェクトにはいくつかの利点があります。

一般的には、トランスフォーム ジオメトリでグループ化されたこれらのコンストレイントをいくつか使用して、頭部や肩などの衝突部分のジオメトリ シェイプに近づけます。有機オブジェクトの場合は、複数の球を使用してそのうちのいくつかを楕円にスケールすることもあるでしょう。鋭角なエッジの場合は球では起こり得ない安定性の問題が発生することもありますが、壁や平坦なサーフェスには衝突立方体が最適です。ただし、衝突立方体(Collide Cube)コンストレイントの固さ(Stiffness)の値を低くすると、立方体のエッジがスムーズになる傾向にあります。

また、非常に不均等にスケールされた球では、ポイントがエッジに向かってスライドしてしまう問題(ほとんどの湾曲部分)が起きる可能性があります。これは、不均等にスケールされた立方体では発生しません。