❏ この記事の内容
Maya の Bifrost を使用した『curve_warp』の作成方法をご紹介します。
この機能さえあればエフェクトメッシュの形状はほとんど作れてしまいます。
Bifrost は手作業では作成しにくいカーブを数学的に簡単に作成できるため「Curve_Warp」との相性は抜群です。
❐ 目次
- 自作コンパウンド
- Bifrost でcurve_warpをするメリット
- 処理の全体像
- カーブから transform を作成
- メッシュのY座標を正規化
- メッシュを添わせる
- メッシュをトランスフォーム
- まとめ
❐ 自作コンパウンド
冒頭の動画は私が作成したコンパウンド「curve_warp」の動画です。
Mayaの標準機能にも「curve_warp」はありますが、それを強化した機能を Bifrost で作成しました。
エフェクトメッシュでは必須の処理なので、この機能があると Bifrost 作成できるメッシュの幅が格段に広がります。
❐ Bifrost で「curve_warp」をするメリット
1、エフェクトメッシュに特化した機能の追加を行える
左;回転制御
右:通常処理
例えば、メッシュがカーブに沿う際に回転を行わないようにすれば、竜巻メッシュを簡単に作ることができます。
2,「Scale Curve」や「Twist Curve」の調整が行いやすい
Maya標準の「Curve Warp」は “Scale Curve” などの調整カーブのポイント数を4つ以下にすることができません。
しかし、Bifrost で作成した「Curve Warp」の場合それらのポイント数を2つにし、ドライバを操作することで簡単に調整カーブを操作できます。
❐ 処理の全体像
- カーブからトランスフォーム配列を作成。
- メッシュのY座標を正規化。
- 1の配列数をメッシュの頂点数と同じにする。
- 3でメッシュをトランスフォームさせる。
上記が『メッシュをカーブに沿わせる』処理の流れです。
メッシュをカーブに沿わせるだけであれば意外と簡単にできます。
※前提
Bifrost では Maya のカーブをストランド(strand)という形式で扱います。
しかし、この記事の説明では内容が入ってきやすい “カーブ” で説明します。
❐ カーブから transform を作成
【処理の全体像】
- カーブの頂点の並びを等間隔に整える
- 整形したカーブから transform を作成
【resample strand の中身】
- 「update_strands_length」でカーブの長さを取得。
- リサンプルしたカーブのポイント数が “curve_resample_count” と一致するようにする。
- 「resample_strands」でカーブをリサンプル。
まず、「update_strands_length」でカーブの長さを取得します。
「update_strands_length」は”strands”とノード名にある通り複数のstrand(カーブ)を処理します。
そのため、 ”strand_length”は配列です。
今回の処理は1つのstrand(カーブ)を想定しているため「first_in_array」で配列から最初の値を取得。
最終的に「resample_strands」で “spatial_distance” をもとにカーブをリサンプルします。
その目的は下記の2つです。
①カーブの頂点を等間隔にする。
┗偏りなくメッシュにカーブを沿わせる。
②カーブの頂点数を設定。
┗処理負荷を軽減する。(通常カーブは頂点数が多くなりがち)
spatial_distance = 再サンプリングするポイント間の距離
[取得した値 ÷ (curve_resample_count – 1) ]を “spatial_distance” 入力することで、カーブの頂点数を “curve_resample_count” と同じ頂点数にすることができます。
【compute_transform の中身】
- 「update_strands_basis」でカーブの “接線” と “法線” を取得。
- 1を「normal_and_tangent_to_orientation」でクォータニオンに変換。
- 2と「get_point_position」で transform を作成
まず「update_strands_basis」でカーブの “接線” と “法線” を取得します。
赤矢印 = 接線(tangent)、緑矢印 = 法線(normal)
次に、取得した値を「normal_and_tangent_to_orientation」でクォータニオンに変換。
その値を「SRT_to_matrix」の “quaternion” に入力、「get_point_position」の値を “translation” に入力し transform を作成。
❏ メッシュのY座標を正規化
【処理の全体像】
【normalize_scale の中身】
- 「get_point_position」で頂点位置を取得。
- 「change_range」でY座標を正規化。
- 「set_point_position」で頂点位置を設定。
単純にメッシュのY座標を “0~1” に正規化しています。これにより、後の処理が正確に行えます。
❏ transform の配列数をメッシュの頂点数と同じにする。
【処理の全体像】
【interpolate_transform_matrix の中身】
最終的に「interpolate_transform_matrix」でメッシュの各頂点に使用する transform を取得します。
このノードでは “first” と “second” を “fraction” で補間します。
処理自体は「lerp = linear interpolation(線形補間)」と似たような内容です。
【curve_matrix の中身】
- メッシュのY座標と(カーブの頂点数 -1 )を乗算
- 1を「round_to_ceiling」で切り上げ
- 2を1で減算
- 2を “long型” に変換
前提として「curve_matrix」は「lerp_matrix_array」で使用する値の準備です。
メッシュの各頂点のY座標をもとに “mesh_fraction” と “curve_indicies” を算出。
左の画像を例に説明します。
メッシュの頂点に表示しているのは “mesh_fraction” の数値です。
この値が「interpolate_transform_matrix」の “fraction” になります。
この値はメッシュの頂点のY座標よりも、
[カーブの頂点番号が大きい値の頂点番号- 小さい値の頂点番号]です。
例えば、カーブの頂点番号 “2” と “1” を見てみるとその間のメッシュの頂点の値は “0.4” です。
上記の処理のために、[メッシュのY座標と(カーブの頂点数 -1 )を乗算]を行っています。
“curve_indicies” は次の処理の「lerp_matrix_array」で使用します。
【lerp_matrix_array の中身】
- 「curve_matrix」で作成した “curve_indicies” をもとに transforfm 配列から値を取り出す。
- 配列サイズを「interpolate_transform_matrix(for_each)」の “max_iterations” に入力。
- 「interpolate_transform_matrix」に “mesh_fraction” を入力
「interpolate_transform_matrix(for_each)」ですべての transform 配列を補間し、出力します。
❏ メッシュをトランスフォーム
【処理の全体像】
【transform_mesh_point の中身】
- メッシュの頂点位置をY座標 = “0” にして取得。
- 「lerp_matrix_array」で作成した transform で変形。
メッシュの頂点位置をY座標 = “0” というのは左の画像のような状態です。
この状態にすることで、カーブの位置に正しくメッシュ沿わせられます。
※ Y座標 = “0” にしないと、右の画像のようにメッシュがカーブの範囲外に行きます。
❏ まとめ
・Bifrost ではエフェクトメッシュに特化した「Curve_Warp」を作成できる!
・接線、法線、Matrix などはなんとなく程度の理解でも役に立つ!
Bifrost では 「Maya 標準機能の強化版」をコード無しで作成できます。
『Houdini を覚えたけど会社にライセンスが無くて Maya しか使えない…』という方には特におすすめです!