【Maya】Bifrostで法線も適用するオレオレブレンドシェイプをつくる(後編)

前回は頂点のみのオレオレブレンドシェイプを作りました。
tm8r.hateblo.jp

今回は本題の法線を適用する部分をやっていきます!

どのノードを使って適用するか考える

これまで通りBifrostグラフエディタで適切なノードを追加していきたいところですが、どのノードを使えばよいでしょうか。
normalで検索してみると、一番それっぽいのはset_point_normalですが、これでは期待する結果は得られません。

というわけでどのプロパティを操作すればよいかあたりをつけるため、ジオメトリのポートに対して前々回書いたWatchPointの追加をしてみます。

f:id:tm8r:20190829094503p:plain
face_vertex_normalというそれっぽいプロパティがあります。
ではこれはどう取得、セットすればいいんでしょうか。

get_point_positionの中身を見てみる

特定のプロパティを取得する、というのは前回使ったget_point_positionノードが行っています。
これまた前々回書いたとおりですが、このノードはCompoundです。
ので、ダブルクリックで中身を見ることができます。

f:id:tm8r:20190829094956p:plain
get_geo_property以外は見たことのある子ですね。

get_geo_propertyの使い方だけ覚えればなんとなかりそうです。

get_geo_propertyは標準で追加できるノードです。
名前の通りジオメトリのプロパティを取得できるノードなのですが、そのプロパティの種類と名前を指定してあげる必要があります。

f:id:tm8r:20190829095337p:plain
get_geo_propertyノードをクリックしてみるとグラフエディタ右側のParameterタブがこんな表示になります。
枠で囲った部分がプロパティの名前で、ここでは「point_position」が入力されています。

f:id:tm8r:20190829095246p:plain
プロパティの種類はtypeに適切な型が設定されたvalueノードを繋いであげるだけです。

というわけで、これと同じような感じでグラフを作って、get_geo_propertyに「face_vertex_normal」を設定、typeに適切なものを指定すれば求めるものが作れそうです。

face_vertex_normalを取得するグラフを組む

f:id:tm8r:20190904094858p:plain
まずget_geo_propertyを追加し、propertyには「face_vertex_normal」と入力します。

次にvalueを追加しますが、typeはどのようにすればよいでしょうか。
改めてWatchPointで「face_vertex_normal」の「data」項目を見てみましょう。
f:id:tm8r:20190904095205p:plain
「array <Math::float3>」と記載されていますね。

f:id:tm8r:20190904094903p:plain
というわけでこのようしてあげればおっけーです。

f:id:tm8r:20190904094750p:plain
こんな感じでget_geo_propertyとvalueを接続して完成です。

Compoundにして使い回す

さて、法線をブレンドするにはベースシェイプとターゲットシェイプの情報が必要です。
つまり、「face_vertex_normal」を取得する処理が2つ必要ということです。

しかしわざわざまたget_geo_propertyを作ったりvalueノードに繋いだりするのは面倒だし、この2つのノードをコピペするのもノードが増えて見づらくなりそうです。

f:id:tm8r:20190904094633p:plain
というわけでgeo_propertyとvalueを選択してCompoundにしてやります。

f:id:tm8r:20190904095808p:plain
そしてわかりやすいようにこのCompoundノードに「get_face_vertex_normal」という名前をつけてやりましょう。
あとはこのCompoundノードをコピペしてそれぞれベースメッシュとターゲットメッシュに繋いでやるだけです。
これでget_vertex_positionと同等の使い勝手が実現できました。やったぜ。

face_vertex_normalをセットする

get_point_positionを参考にface_vertex_normalを取得するグラフはできたので、次はset_point_positionを参考にセットするグラフを作ってみましょう。

f:id:tm8r:20190905095059p:plain
get_point_positionの中身はこの通り。
get_geo_propertyがset_geo_propertyに変わり、inputとoutputに繋がっています。

f:id:tm8r:20190905095156p:plain
そしてget_geo_propertyの各パラメーターはこの通り。

propertyは言わずもがな、Defaultもデフォルト値だろうなと想像がつきますが、targetという新しいやつが出てきます。
「point_component」という値がセットされていてなんだか分かりませんが、またWatchPointを見てみましょう。

f:id:tm8r:20190905095424p:plain
「point_position」の項目には「point_component」、そして今回使用したい「face_vertex_normal」には「face_vertex_normal_index」と書かれています。

f:id:tm8r:20190905095607p:plain
というわけでset_geo_propertyノードを追加して、このように設定してやればおっけーです。

ちなみに、set_geo_propertyノードを作る際に候補に出てきて気付いたかもしれませんが、set_geo_property_dataというノードもあります。
こちらの説明を見てみると…

Sets the data values of a an existing geometric property. For example, if point_size exists on the input object, you can use this node to the sizes per point.
If the property does not exist, you should first use set_geo_property to create it.
http://help.autodesk.com/view/BIFROST/ENU/?guid=Bifrost_Common_reference_bif_set_geo_property_data_html

今回は既に存在する「face_vertex_normal」にセットすればよいので、このset_geo_propertyで代用できそうです。

法線も適用するグラフを組む

f:id:tm8r:20190905100505p:plain
最終的なグラフはこのようになります。

法線を適用するset_geo_property_dataのgeometryにset_point_positionのout_geometryを指定しているので、頂点移動が適用された結果に法線変更が適用される形になります。
weightは同じものを使いたいので、2つのlerpに接続しています。

f:id:tm8r:20190909130048g:plain
結果はこの通り。頂点移動も法線変更も適用されていますね!

おわり

これでBifrost全く分からんどこから見ていけばいいか分からんサンプルグラフ見てもどこが何してるか全くわからん、という状態からは脱せたんじゃないかと思われます。

次はグラフの書き出しと読み込みを書く、かも、かきます。たぶん、きっと。

スポンサーリンク