Zenn
🐼

[UE5][Houdini][習作] Houdiniで頂点に仕込んだ情報を元に、UEのマテリアルでポリゴンの部分回転アニメ(ファイル配布)

2025/02/11に公開

前回の習作に続き、Houdini側でモデルの頂点に情報を仕込んで、その情報を元に、UEのマテリアルでWorldPositionOffsetによってポリゴンの部分回転アニメをしてみました。

【前回の習作】
https://zenn.dev/h_sasaki/articles/79b0b415344b12

デモムービー

こちらが作成したもののデモムービーになります。
https://www.youtube.com/watch?v=jo83JZ0tR9c

【ポリゴン(Box)の部分回転の様子】

解説

[Houdini側] 基本形の作成

↓のような厚みを薄くしたBoxを、

↓のような極地(最上下点)を削除したShpereの面上に貼り付けるようにコピーします。

これには「Copy to Point」ノードを使います。
その際、コピー前にpscaleを上下端に向かうに連れ、小さくなるように設定しておきます。(そうしないとBoxが重なってしまうので。)
また、Boxが経緯線に沿って配置されるように、「up」ベクトルAttributeを作成しておきます。
青ベクトルがNormal、黄ベクトルがup
upベクトルの算出には、外積を使います。

vector worldUpVec = {0, 1, 0};
vector tangent = cross(@N, worldUpVec);
v@up= cross(tangent , @N);

想定通りコピーされると↓のようになります。

これを基本形として、頂点に必要な情報を仕込んでいきます。

[Houdini側] 仕込み情報:各Boxの重心点

各Boxは各々の重心点をピボットとして回転させますので、Boxの各頂点にその重心点の情報を仕込みます。
Boxの重心点は後から算出するより、コピー前に作っておくほうが楽です。Pivotを原点のままにしておけば重心点は当然(0,0,0)になります。ここでは「center」という名のAttributeで作成しています。
黄色い点がBoxの重心点

Copy to Point」ノードでコピーすれば、「center」Attributeにも自動的にTransformがかかり、欲しい情報が簡単に得られます。
黄色い点がBoxの重心点

注意点として、「center」AttributeにTransform(移動、回転、スケール)がかかるようにするには、metadataを"point"にしておく必要があります。

setattribtypeinfo(0, "point", "center", "point");

これについてはこちらのページで解説しておりますので、ぜひご覧ください。
https://zenn.dev/h_sasaki/articles/dca28824130d62

最後に、「Attribute Promote」ノードで、「center」AttributeをPointクラスからVertexクラスに移します。

[Houdini側] 仕込み情報をUVに割り当てる

仕込み情報(重心点)はUEのマテリアル側で参照したい情報になりますので、これをUVに割り当てます。重心点は[3-Float]ですので、今回はuv3, uv4の2つを使います。

  • 仕込み情報:重心点
    • uv3.x、uv3.y、uv4.x、 の3つを使用。

ここでも注意点があります。
Houdini側でUVに割り当てた値は、UE側ではそのUVのV値がOneMinus(1-x)された値になってしまうので、uv3.yのみあらかじめOneMinus(1-x)した上でに格納しておきます。

@uv3.x = @center.x;
@uv3.y = 1.0 - @center.y;
@uv4.x = @center.z;

このことについては↓のページで解説しておりますので、ぜひご覧ください。
https://zenn.dev/h_sasaki/articles/cfe48215166be6


Houdini側の作業はここまでで、以上のモデルをFBXで書き出します。

[UE側] FBXをインポートする

書き出したFBXをUEにインポートします。
その際、UniformScaleは100にしておきます。

[UE側] マテリアルを作成する

重要なポイントは、Houdini側でUVに仕込んだ情報を取り出すところになります。

「重心点」の情報

こちらはuv3.x、uv3.y、uv4.xに割り当てたので、UEマテリアルではそれぞれ [2].R、[2].G、[3].R に該当します。(ややこしいですが、インデックス番号のズレに注意します。)
[2].R、[2].G、[3].Rの3つをAppendして、「重心点」を復元してあげます。
注意点として、HoudiniとUEの座標系の違いから、YとZを入れ替えてあげる必要があります。なのでここでは [2].GをZに、[3].RをYに しています。
また、インポート時にUniformScaleを100にしたので、重心点にも100をかけてあげます。

BoxのLocal座標系の算出

「重心点」はLocal空間の値であり、オブジェクトの中心はSphereの中心と一致していますので、「重心点」の値がそのままBoxのLocal空間でのNormalベクトルとなります。それとUpベクトル(0,0,1)を補助ベクトルとして、BoxのLocal座標系たるカスタム直交座標を算出してあげます。この直交座標のY軸(Rightベクトル)がBoxの回転軸となります。

なお、↑で登場した「MF_MakeCoordSystemFromXZ」ノードは、「基準となるX軸と、補助となるZ軸を引数にして、両者が直交する座標軸を作成する」ノードです。
「MF_MakeCoordSystemFromXZ」ノードの中身
【返り値の説明】

  • 「X」:入力の「BaseX」のまま正規ベクトルとして返ってきます。
  • 「Y」:入力の「BaseX」と「OptionalZ」に直交する正規ベクトルとして返ってきます。
  • 「Z」:「X」と「Y」に直交する正規ベクトルとして返ってきます。

頂点と頂点Normalの回転

前述の回転軸で頂点を回転させます。留意点として、ここでやっていることはLocal空間での計算です。なので、「RotateAboutAxis」ノードの「Position」ピンにつなぐのは「LocalPosition」になります。算出した回転の差分はLocal空間のものですので、これを「TransformVector」ノードによってWorld空間に変換してメインマテリアルノードにつなぎます。

同様に、頂点Normalも回転させます。
回転軸がLocal空間のものですので、VertexNormalWSも一旦Local空間に変換したうえで、Local空間上で回転計算します。算出した新しいNormalは、頂点同様、World空間に変換してメインマテリアルノードにつなぎます。


なお、「RotateAboutAxis」ノードを使った頂点と頂点Normalの回転については↓のページで解説しておりますので、詳しく知りたい方はぜひご覧ください。
https://zenn.dev/h_sasaki/articles/9d408b31371d74

マテリアル全体図と部分拡大図

上記の仕込み情報と操作したいパラメータを絡めて表現したいロジックを組んでいきます。こちらは全体図と部分拡大図を載せておきます。

習作の本質部分ではないけど、ここが一番苦労した…

ファイル配布:Files Distribution

↓のリンクから「MirrorBallAssets_UE5_5_Houdini20_5.zip」をダウンロードしてください。

Download “MirrorBallAssets_UE5_5_Houdini20_5.zip” from the link below.

https://drive.google.com/file/d/18o0M7YngEW46YtOgxkaRM_ex70OzZm1r/view?usp=sharing

「UE Content」フォルダにはUEのアセットが入っています。その中にある「MirrorBall」フォルダを、導入したいプロジェクトのContentフォルダ下にコピーしてください。

The “UE Content” folder contains UE assets. Copy the “MirrorBall” folder in it under the Content folder of the project you wish to install.

Discussion

ログインするとコメントできます