【Maya : Bifrost】Dual Mesh(バリア形状)ノードを自作しよう

この記事では、Bifrost で Dual Mesh ノードを作成する方法を紹介します!
エフェクトメッシュではバリア表現で使用されるケースが多いかと思います。

対象読者

・エフェクトデザイナー
・テクニカルアーティスト
・Bifrost に興味があるデザイナー

環境

・Maya 2024
・Bifrost 2.15.0.0

サンプルデータ

以下の手順でサンプルデータを確認できます。
Bifrost はノードの情報を「テキスト」としてコピー&ペーストできます。

以下ボタンをクリック

「ノード情報のテキスト」がクリップボードに保存されます。

コピーボタン

②Bifrost 2.15.0.0 をダウンロード

Bifrost は Maya とは別に独自にバージョンがあります。
完了したら、Bifrost 2.15.0.0 をダウンロードしたバージョンの Maya を起動

③Bifrost Graph Editer にペースト

[Window > Bifrost Graph Editer]を開き、「Create Graph」をクリック

[Ctrl + V]でペースト

実例

Bifrost にオブジェクトを読み込み『Dual Mesh』ノードを使用すると ⇑ 画像のようになります!

Dual Mesh とは

面の真ん中に新しい点を置いて、それをつなげて新しいメッシュを作る手法。

例えば ⇐ の場合。
青いフェイスの真ん中の黒点をつなぐと緑色のフェイスができる。
これをすべての面で行うと Dual Mesh になる。

また、「dual」は「対になる・もう一方の」という意味で、元のメッシュとペアになる構造だから「Dual Mesh」と呼ばれているみたいです。
「面と頂点の関係がひっくり返っている」

元のメッシュ → 「面」を持っている
デュアルメッシュ → その「面の中心」が「点(頂点)」になる

処理の全体像

triangulate_mesh

最初にメッシュのすべてのフェースを3角形にします。
これにより、その後の処理を簡素化できるうえ安全性を担保できます。

dual_mesh

メインの処理内容です。以降で詳しく解説します。

disconnect_mesh_faces

フェースごとに拡縮させています。

Dual_Mesh を形成

【dual_mesh の中身】

『construct_mesh』に必要な情報を入力し、 Dual mesh を形成します。
入力内容について解説します。

point_positoinメッシュの頂点位置
face_offset各フェースが face_vertex のどこから始まるか(最初は必ず “0”)
face_vertexフェースを構成する頂点番号の並び

face_offset と face_vertex の具体例

⇐のメッシュは

face_offset0, 3, 6
face_vertex0, 1, 3, 0, 3, 2

考え方としては…
face_offset = 3 = 最初の “3” つの face_vertex [0, 1, 3] の順番でフェースを作る。
face_offset = 6 = 次の “3(6 – 3)” つの face_vertex [0, 3, 2] の順番でフェースを作る。

point_positoin

『update_face_centers』で取得した各フェースの頂点座標

face_offcet

  1. 『get_new_face_vertex』で隣接するフェースの数を取得
  2. 『cumulative_sum_array』で 累積和 を計算
  3. 配列の最初に “0” を入れ込む

※ 累積和の具体例:[2, 6, 12, 20]
1個目 → 2
2個目 → (2+4)=6
3個目 → (2+4+6)=12
4個目 → (2+4+6+8)=20

face_vertex

  1. 『get_new_face_vertex』で隣接するフェース番号を取得
  2. これは 2次元配列 のため、『flatten_nested_array』で1次元に平坦化

新しい face vertex を取得

【get_new_face_vertex の中身】

  1. 『update_mesh_adjacency』でメッシュの隣接情報を取得
  2. 『get_mesh_structure』でメッシュの基礎情報を取得
  3. 『for_each 』で頂点番号ごとに処理を実行、”隣接するフェース番号” と “隣接するフェースの数” を取得

update_mesh_adjacency の具体例

face_vertex_adjacent_edge
[(x,x), (x,x), (f1,s0), (x,x), (f0,s2), (x,x), (x,x), (x,x)] 
※ (x,x) = 隣接なし
各フェイスの各辺ごとの隣接関係(面と辺)
point_face_adjacency
[(0,1), (0,3), (1,0), (1,3), (1,2), (0,2), (1,1), (0,1)]
各頂点の属するフェイスとコーナー番号
point_face_adjacency_index
[0, 1, 3, 4, 5, 7, 8]
point_face_adjacency 内の範囲

頂点番号ごとの計算

【for_each の中身】

  1. 『slice_array』と『access_offset_array』で頂点番号に対応した “point_face_adjacency” を取得
  2. 『slice_array』で配列の最初の要素を取り出す
  3. 『Value』の型を “FaceEdge” に変更し、「face」と「side」を分解
  4. 『do_while』で処理を実行

※ 3 に関して補足

すべてのフェースを処理

【do_while の中身】

  1. 『get_next_face』で次のフェースを取得
  2. 『build_array』で前回の結果と配列を作る
  3. 境界頂点の場合は空にする

以下は結果を次のイテレーションに継承しています。※ ステートポート
current_face :next_face
current_corner:next_corner

ループ終了処理

“start_face = next_face” and “start_corner = next_corner” となったら、ループを終了します。
※ フェースを一周したということになるため

フェースを移動

【get_next_face の中身】

  1. 『get_from_array』で current_face の配列位置を取得
  2. 『increment』と『modulo』で次のフェース頂点番号を取得
  3. 『face_vertex_adjacent_edge』の配列を取得
  4. 『Value』の型を “FaceEdge” に変更し、「face」と「side」を分解

UV ついて

UV をきれいに継承/変換する方法はわかりません。
Houdini で Dual を作成する処理[divide > Compute Dual]でも UV は継承できないようなので、複雑な処理が必要なのかもしれません。

まとめ

今回は Bifrost を使用して Dual Mesh を作成しましたが、同様の機能は Houdini や Blender の Geometry Nodes では標準搭載されています。
ただ、Dual Mesh に関してはBifrost に無かったからこそ自ら調べ、仕組みを理解するきっかけになりました。

皆様も「未実装の機能を自分で作る」ことに挑戦していただけますと幸いです!

VFX_Haku

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

投稿者記事

  1. READ MORE

    【Houdini】エフェクトテクスチャ作成にコペルニクスを使ってみよう

    2025-10-14

  2. READ MORE

    【Substance 3D Designer】Spline でライン状のテクスチャを作成しよう

    2025-09-08

  3. READ MORE

    【Substance 3D Designer】黒くにじまないブラーノードを自作

    2025-08-27

  4. READ MORE

    【Maya : Bifrost】頂点アニメーションを UV に格納し、ゲームエンジンで再生する方法

    2025-08-04

関連記事

  1. READ MORE

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

    2024-04-17

  2. READ MORE

    【Maya : Bifrost】オリジナルのデフォーム(Taper, Twist) 作成方法

    2025-01-08

  3. READ MORE

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

    2024-09-10

  4. READ MORE

    ピザで斬撃エフェクトは作れるのか?!

    2024-09-13

ページ上部へ戻る