【Bifrost:Maya】スパイラルカーブ(ストランド)作成方法

❏ この記事の内容

Maya の Bifrost を使用した『スパイラルカーブ(ストランド)』をご紹介します。
また、カーブの形状によっては「手作業よりも Bifrost で簡単な処理を組んだ方が作りやすい」場合もあると伝われば幸いです。

対象読者

・エフェクトデザイナー
・テクニカルアーティスト
・Bifrost の活用事例が知りたいデザイナー

環境

・Maya 2024
・Bifrost 2.11.0.0

❐ 目次

  1. Bifrost でスパイラルカーブを作成するメリッ
  2. 処理の全体像
  3. 元になる位置配列を作成
  4. スパイラルを作成
  5. 半径と高さにバイアスをかける
  6. 番外:ストランドを Maya カーブにする
  7. まとめ

❐ Bifrost でスパイラルカーブを作成するメリット

簡単に調整できる

例えば、スパイラルカーブの “回転量” を自在に変えることができます。

fカーブを用いてバイアスをかけられる

カーブの半径や高さにバイアスを掛けることができます。

❐ 処理の全体像

【処理の全体像】

  1. 元になる位置配列を作成
  2. 配列番号ごとのバイアスを作成
  3. スパイラルを作成

Bifrost のカーブは “srand(ストランド)” といい、Mayaにある従来のカーブとは別物です。
この記事においては内容が伝わりやすいように “カーブ” と記載しています。

❐ 元になる位置配列を作成

『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』で配列番号を正規化
  1. 配列番号を『to_float』で float に変換。
  2. 『change_range』で配列番号を 0 ~ 1 に正規化。

❏ スパイラルを作成

【make_spiral の中身】

radian と degree

どちらも角度の単位です。
Bifrost では回転系ノードの入力は “radian” がほとんどです。
また、『degrees_to_radians』ノードで使い慣れた “degree” を使用できます。

radianπ/2π3π/2
degree90°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 で実行
  1. カーブの point_position をアウチプットした Bifrost Graph を選択。
  2. Script Editer の「python」タブに②をペースト
  3. スクリプト実行

❏ まとめ

・Bifrost で変幻自在にスパイラルカーブを作成できる。
・手作業よりも簡単にカーブを作成できことがある。
・簡単なスクリプトでも業務効率化につながる。


スパイラルカーブに限らず、 Bifrost で数学的に作成した方が簡単なカーブはあると思います。
その場合は Bifrost を積極的に活用していただけますと幸いです。

VFX_Haku

3Dエフェクトデザイナー。たまに社内向け勉強会やってます。
興味がある分野は業務効率化やワークフロー整備、シェーダー開発。Python学習中!

投稿者記事

  1. READ MORE

    【Bifrost:Maya】プロシージャルに頂点アルファを設定|業務効率化

    2024-10-17

  2. READ MORE

    【Bifrost:Maya】カーブにメッシュを添わせる(Curve_Warp)|業務効率化

    2024-09-10

  3. READ MORE

    【Bifrost:Maya】プロシージャルなUV制御|業務効率化

    2024-08-02

  4. READ MORE

    【Bifrost:Maya】エフェクト用メッシュ作成事例|業務効率化

    2024-06-13

関連記事

  1. READ MORE

    【Houdini】ポイントアルファをカーブで制御しよう

    2024-04-17

  2. READ MORE

    【Bifrost:Maya】カーブにメッシュを添わせる(Curve_Warp)|業務効率化

    2024-09-10

  3. READ MORE

    【Bifrost:Maya】プロシージャルなUV制御|業務効率化

    2024-08-02

  4. READ MORE

    【Bifrost:Maya】プロシージャルに頂点アルファを設定|業務効率化

    2024-10-17

ページ上部へ戻る