nHair を使用する際の詳細なヒント

以下はヘアを操作する上でのアドバイスです。

ヘアの最高密度オプション変数

以下のオプション変数について知っていると便利です。

createHairMaxDensity

既定値は 100 です。この値を大きくするには次を入力します。

optionVar -intValue createHairMaxDensity 150;

これにより、サーフェス上で作成またはペイントできるヘアの行/列の最大値が決まります。この解像度によるグリッド内での位置に基づいて毛根に名前が付きます。このような名付けが行われるのは、ヘア ペイント ツール(Paint Hair Tool)が名前を頼りに任意の UV におけるヘアを検索しているためです。

変数が大きくなると、サーフェス上ではより多くの数の毛根がペイント可能になります。ただし、毛根の密度が小さくてもペイントが遅くなります。この変数を変更すると、作成済みのヘア システムがペイントできなくなります(1 つの領域でのペイントがブラシの下にない毛根に影響する可能性があります)。

変数の値を小さくすると、ペイントのスピードは多少改善しますが、毛根の密度はそれほど高くできません。

既定のグリッドは 100×100 で、サーフェスあたりの最大毛根数は 10000 になります。

pfxstrokes コマンドを使用する

pfxstrokes コマンドの基本的な使用法は、ペイント エフェクト(Paint Effects) チューブの情報をファイルに落とすことです。これは、ペイント エフェクト(Paint Effects)からカーブを生成したり、別のレンダラに情報を送る場合に便利です。チューブ(Tubes)がオンになると、ヘアやブラシには異なるデータ フォーマットが使用されます。

ペイント エフェクト(Paint Effects)runtimecreate の MEL スクリプトをコールできます。これらはブラシ ノードの文字列アトリビュート paint create func と paint runtime func として定義されます。文字列はコールする関数の名前に設定します。MEL 関数は、渡して戻す必要のある特定の引数の集合を持ちます。ワークフローは、付属のテンプレート MEL ファイルのいずれかをコピーし、関数名とファイル名を変更し、次に関数の各要素を編集します。Runtime または Create 関数がブラシに定義されていると、ストロークを描画したときに関数がコールされます。pfxstrokes コマンドは、何も描画せずに、ストロークを再描画せよというコールを擬似的に実行します。このため、pfxstrokes コマンドの実行時にはこれらのスクリプトも評価されます。

ポリゴン上のポイント コンストレイントとして毛根ノードを使用する

毛根ノードはポリゴン上のポイント コンストレイントとして使用できます。1 つの方法は、ヘアをいくつか作成してから、毛根以外のすべてを削除することです。たとえば、ヘア システム、pfxHair、開始位置(Start)カーブなどを削除します。次いでオブジェクトを毛根の下にペアレント化します。あるいは、スクリプトの毛根ノードを使用します。

以下は、ポリゴンの球のサーフェスに円錐をコンストレイントするスクリプトの例です。円錐は法線およびポリゴンに定義された UV 点の接線を基準に動きます (ポリゴンの UV セットで未定義の値に UV が設定されていると、円錐は球の中心に表示されます)。

// create a cone, poly sphere and a follicle node
string $sphere[] = `polySphere`;
string $cone[] = `cone`;
string $fol = `createNode follicle`;
// get the parent transforms of the follicle
string $folTform[] = `listTransforms $fol`;
// connect the sphere to the follicle
connectAttr ($sphere[0] + ".outMesh") ($fol + ".inputMesh");
connectAttr ($sphere[0] + ".worldMatrix[0]") ($fol + ".inputWorldMatrix");
// apply the follicle output positions to its own transform
connectAttr ($fol + ".outTranslate") ($folTform[0] + ".translate" );
connectAttr ($fol + ".outRotate") ($folTform[0] + ".rotate" );
// parent the cone under the follicle
parent -r $cone[0] $folTform[0];
// the default uv of 0 0 doesn't exist on the poly sphere, so we set it
setAttr ($fol + ".parameterV") 0.5;
// rotate the cone to point along the normal
setAttr ($cone[0] + ".rotateY") -90;

縄跳び(ダイナミック カーブ)を手にアタッチする

トランスフォーム(Transform) nConstraint やグループを使用したり、動くオブジェクトに dynamicConstraintShape ノードをコンストレイントします。オブジェクトのツイストと回転に従って剛性のあるものがくっついたバネのような動作をするように、ダイナミック カーブをロックする必要があります。ダイナミック カーブがうまくアタッチされない場合は、コンストレイントを持ったバグです。相対的なコンストレイント位置は開始フレームで定義されるため、開始フレームではなんのフォースも適用されません。開始(Start)カーブは、縄を握っている手によってモデリングする必要があります。

縄跳びの縄の場合も、根元の近くに来る手の毛根をグループ化し、もう一方の手にグループ化された縄の端にトランスフォーム(Transform) コンストレイントを使用することで処理できます。ただし、follicleShape ノードのポイントのロック(Point Lock)アトリビュートのアタッチなし(No Attach)オプションで開始点をコンストレイントすることはできません。アタッチなし(No Attach)では、開始点は重力の影響で移動し続け、カーブの張力やコンストレイントによって引っ張られることはありません。

ワイヤ デフォーマとしてのヘア

ヘア カーブは、動くオブジェクトに対してペアレント化してワイヤ デフォーマとして適用する場合に、小刻みなエフェクトを表現するような場合に便利です。ヘアをワイヤ デフォーマとして使用して、サーフェスのすべてまたは一部をダイナミックにすることができます。