❏ この記事の内容
Maya の Bifrost を使用した『スパイラルカーブ(ストランド)』をご紹介します。
また、カーブの形状によっては「手作業よりも Bifrost で簡単な処理を組んだ方が作りやすい」場合もあると伝われば幸いです。
対象読者
・エフェクトデザイナー
・テクニカルアーティスト
・Bifrost の活用事例が知りたいデザイナー
環境
・Maya 2024
・Bifrost 2.11.0.0
❐ 目次
❐ Bifrost でスパイラルカーブを作成するメリット
簡単に調整できる
例えば、スパイラルカーブの “回転量” を自在に変えることができます。
fカーブを用いてバイアスをかけられる
カーブの半径や高さにバイアスを掛けることができます。
❐ 処理の全体像
【処理の全体像】
- 元になる位置配列を作成
- 配列番号ごとのバイアスを作成
- スパイラルを作成
Bifrost のカーブは “srand(ストランド)” といい、Mayaにある従来のカーブとは別物です。
この記事においては内容が伝わりやすいように “カーブ” と記載しています。
❐ 元になる位置配列を作成
【source_position の中身】
『sequence_array』について
『sequence_array』は “start” の値から “step” した値の “size” 数の配列を作成できます。
例えば、“size = 5”, “start= 0”, “step= 1” にした場合、
配列は “0, 1, 2, 3, 4” が作成されます。
以下のように1マスずつ並ぶイメージです。
①『sequence_array』で高さ配列を作成
『sequence_array』の配列の最大値 = step ✕ (size – 1) となります。
今回は『input』の “height” が最大値になる配列を作成したいです。
例えば、”height = 10″, “size = 101” の場合
『sequence_array』に以下を入力します。
・size = 100(⇐ 以外の数でも問題ありません。)
・start = 0
・step = height ÷ (“size” を 『decrement』に入力した返り値)
『decrement』は整数の減算のときに使用します。
『subtract』でも同じことはできますがノードの意味の幅を制限し、理解しやすくできます。
②『scalar_to_vector3』で vector3 を作成
以下のように入力し、スパイラルの元になる位置配列を作成します。
・x = “0”
・y = 高さ配列
・z = “radius”(スパイラルの半径)
❏ 配列番号ごとのバイアスを作成
【make_indices_bias の中身】
このノードでは次以降の処理で使用するための “indices_bias” を作成しています。
①『get_array_indices』で配列番号を取得
『get_array_indices』はノード名の通り、入力配列の配列番号を返します。
例えば、入力配列が5つの要素を持つ場合、出力は [0, 1, 2, 3, 4] となります。
②『change_range』で配列番号を正規化
- 配列番号を『to_float』で float に変換。
- 『change_range』で配列番号を 0 ~ 1 に正規化。
❏ スパイラルを作成
【make_spiral の中身】
radian と degree
どちらも角度の単位です。
Bifrost では回転系ノードの入力は “radian” がほとんどです。
また、『degrees_to_radians』ノードで使い慣れた “degree” を使用できます。
radian | π/2 | π | 3π/2 | 2π |
degree | 90° | 180° | 270° | 360° |
①『lerp』で配列番号ごとの回転量を作成
・”second”i = “sweep”
・”fraction” = “indices_bias”
『input』の “sweep” がスパイラルの回転量。
“indices_bias” により、『lerp』の返り値は「配列の最初 ~ 最後」にかけて、 「”0″ ~ “sweep” の値」になります。
②『axis_angle_to_quaternion』でクォータニオンを作成
『axis_angle_to_quaternion』は “axis” が回転軸で “radians” で回転量
・axis 9
= (0, 1, 0)
・radians = ①の値を『degrees_to_radians』に入力した返り値
③『rotate_by_quaternion』で位置配列を回転
『rotate_by_quaternion』で “axis” が回転軸で “radians” で回転量
・vector 9
= 位置配列
・quaternion = ②の値
❏ 半径と高さにバイアスをかける
【radius_height_bias の中身】
①半径にバイアス
『input』の “indeces_bias” を『evaluate_fcurve』でリマップ。
それを “spiral_position” と乗算。
②高さにバイアス
『input』の “indeces_bias” を『evaluate_fcurve』でリマップ。
“height” と乗算。
③ 『scalar_to_vector3』で vector3 を作成
・x = ① の X座標
・y = ②
・z = ① の Z座標
❏ 番外:ストランドを Maya カーブにする
現状、標準機能で Bifrost カーブ(ストランド)を Maya カーブにコンバートすることはできません。
ですが、プロシージャルではありませんが以下の手順でそれを行えます。
①カーブのポイント数を減らす
『source_position』の『sequence_array』の “size” を減らしてください。
この値がコンバートしたあとのカーブの頂点数になります。
②カーブの位置配列(point_position)を 『output』 に接続
※『output』のポート名は “point_position” から変更しないでください。
③以下の python スクリプトをコピー
# -*- coding: utf-8 -*-
"""
・BifrostのstrandをMayaカーブにする。
・選択したoutputノードの位置配列からカーブを作成。
・port名 = "point_position"
"""
from maya import cmds
def convert_strand_to_curve():
"""
strand を maya カーブにコンバート
"""
# 変数宣言
bif_curve_position = []
open_bifGraph = cmds.vnnCompoundEditor(query=True, dg=True)
for i in range(cmds.getAttr(open_bifGraph + ".point_position", s=True)):
bif_curve_position.append((cmds.getAttr(f"{open_bifGraph}.point_position[{i}]")[0]))
# カーブ作成
cmds.curve(p=bif_curve_position, d=3)
return
convert_strand_to_curve()
④Script Editer で実行
- カーブの point_position をアウチプットした Bifrost Graph を選択。
- Script Editer の「python」タブに②をペースト
- スクリプト実行
❏ まとめ
・Bifrost で変幻自在にスパイラルカーブを作成できる。
・手作業よりも簡単にカーブを作成できことがある。
・簡単なスクリプトでも業務効率化につながる。
スパイラルカーブに限らず、 Bifrost で数学的に作成した方が簡単なカーブはあると思います。
その場合は Bifrost を積極的に活用していただけますと幸いです。