前回は頂点のみのオレオレブレンドシェイプを作りました。
tm8r.hateblo.jp
今回は本題の法線を適用する部分をやっていきます!
- どのノードを使って適用するか考える
- get_point_positionの中身を見てみる
- face_vertex_normalを取得するグラフを組む
- Compoundにして使い回す
- face_vertex_normalをセットする
- 法線も適用するグラフを組む
- おわり
どのノードを使って適用するか考える
これまで通りBifrostグラフエディタで適切なノードを追加していきたいところですが、どのノードを使えばよいでしょうか。
normalで検索してみると、一番それっぽいのはset_point_normalですが、これでは期待する結果は得られません。
というわけでどのプロパティを操作すればよいかあたりをつけるため、ジオメトリのポートに対して前々回書いたWatchPointの追加をしてみます。
face_vertex_normalというそれっぽいプロパティがあります。
ではこれはどう取得、セットすればいいんでしょうか。
get_point_positionの中身を見てみる
特定のプロパティを取得する、というのは前回使ったget_point_positionノードが行っています。
これまた前々回書いたとおりですが、このノードはCompoundです。
ので、ダブルクリックで中身を見ることができます。
get_geo_property以外は見たことのある子ですね。
get_geo_propertyの使い方だけ覚えればなんとなかりそうです。
get_geo_propertyは標準で追加できるノードです。
名前の通りジオメトリのプロパティを取得できるノードなのですが、そのプロパティの種類と名前を指定してあげる必要があります。
get_geo_propertyノードをクリックしてみるとグラフエディタ右側のParameterタブがこんな表示になります。
枠で囲った部分がプロパティの名前で、ここでは「point_position」が入力されています。
プロパティの種類はtypeに適切な型が設定されたvalueノードを繋いであげるだけです。
というわけで、これと同じような感じでグラフを作って、get_geo_propertyに「face_vertex_normal」を設定、typeに適切なものを指定すれば求めるものが作れそうです。
face_vertex_normalを取得するグラフを組む
まずget_geo_propertyを追加し、propertyには「face_vertex_normal」と入力します。
次にvalueを追加しますが、typeはどのようにすればよいでしょうか。
改めてWatchPointで「face_vertex_normal」の「data」項目を見てみましょう。
「array <Math::float3>」と記載されていますね。
というわけでこのようしてあげればおっけーです。
こんな感じでget_geo_propertyとvalueを接続して完成です。
Compoundにして使い回す
さて、法線をブレンドするにはベースシェイプとターゲットシェイプの情報が必要です。
つまり、「face_vertex_normal」を取得する処理が2つ必要ということです。
しかしわざわざまたget_geo_propertyを作ったりvalueノードに繋いだりするのは面倒だし、この2つのノードをコピペするのもノードが増えて見づらくなりそうです。
というわけでgeo_propertyとvalueを選択してCompoundにしてやります。
そしてわかりやすいようにこのCompoundノードに「get_face_vertex_normal」という名前をつけてやりましょう。
あとはこのCompoundノードをコピペしてそれぞれベースメッシュとターゲットメッシュに繋いでやるだけです。
これでget_vertex_positionと同等の使い勝手が実現できました。やったぜ。
face_vertex_normalをセットする
get_point_positionを参考にface_vertex_normalを取得するグラフはできたので、次はset_point_positionを参考にセットするグラフを作ってみましょう。
get_point_positionの中身はこの通り。
get_geo_propertyがset_geo_propertyに変わり、inputとoutputに繋がっています。
そしてget_geo_propertyの各パラメーターはこの通り。
propertyは言わずもがな、Defaultもデフォルト値だろうなと想像がつきますが、targetという新しいやつが出てきます。
「point_component」という値がセットされていてなんだか分かりませんが、またWatchPointを見てみましょう。
「point_position」の項目には「point_component」、そして今回使用したい「face_vertex_normal」には「face_vertex_normal_index」と書かれています。
というわけで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で代用できそうです。
法線も適用するグラフを組む
最終的なグラフはこのようになります。
法線を適用するset_geo_property_dataのgeometryにset_point_positionのout_geometryを指定しているので、頂点移動が適用された結果に法線変更が適用される形になります。
weightは同じものを使いたいので、2つのlerpに接続しています。
結果はこの通り。頂点移動も法線変更も適用されていますね!
おわり
これでBifrost全く分からんどこから見ていけばいいか分からんサンプルグラフ見てもどこが何してるか全くわからん、という状態からは脱せたんじゃないかと思われます。
次はグラフの書き出しと読み込みを書く、かも、かきます。たぶん、きっと。