🐼

[UE5][Houdini][Tips] Houdiniで頂点に割り当てたUVが、UEへのインポート時にV値がOneMinusされる?

2025/02/08に公開

UVは通常テクスチャマッピングに使いますが、それ意外の用途では、頂点アニメーションさせるときの補助データとして使いたいときがあります。そういったときは、頂点のUVを値として用いることになるのですが、UEではどうやらそのUVのV値がOneMinus(1-x)された値になってしまうようです。

症状

例えば↓のように、Houdiniですべての頂点に uv2:(0.2, 0.3) を仕込んだとします。

それをFBXで書き出してUEにインポートして、↓のようにUV[1]の値をデバッグ表示してみると…、
(※Houdiniのuv2に対応するUE側のUVのインデックスは[1]になります。)

UVのU値の方は0.2でそのままですが、V値のほうは0.7になっています。
他にも値を変えて試してみたのですが、どうやらV値のほうだけ元の値からOneMinus(1-x)されているようでした。

検証

というわけで、HoudiniとUEのUVの原点位置軸方向が気になったので、少し調べてみました。
まず、HoudiniのUV Viewportをみると、原点は左下にあるようです。

BoxにUVを↓のようにマッピングして、UV値をそのままCdに入れてあげると、このようなカラーリングになります。(原点(0, 0) = 黒 = 左下)

このBoxをFBXで書き出してUEにインポートして、↓のようにUV[0]をそのままBaseColorに入れてあげると、このようなカラーリングになってしまいました。黒が左上にあり、先ほどと上下が反転している見た目になっています。

このことより、UEではUVのVの方向は上から下であるということがわかります。

また、↓のようにVertexColorをそのままBaseColorに入れてあげると、このようにHoudini側と同じカラーリングになりました。(黒が左下)

Houdini側では頂点カラーはUV値と同じにしていたので、UEへのインポート後にUVのV値が変わってしまった、ということになります。

しかし、テクスチャを貼ってみると正しく貼られます。「上下反転して貼られる」ということはありません。

ここから先は上記の結果からの推測になりますが、
UEではUVの原点が左上なので、左下原点で作られたFBXをインポートする際にV値にOneMinus(1-x)をして値を変更しているのだと思われます。それゆえ、値がもともと[0.0~1.0]の範囲で収まっているテクスチャマッピングにおいては特に問題ありません(上下反転はしない)が、UV値を補助データとして使う場合においては、V値が変わってしまっているので気をつけないといけない、ということになります。

結論

  • UVの原点は、Houdiniでは左下だが、UEでは左上にある。
  • Houdiniで作ったFBXをUEにインポートする際、UVのV値はOneMinus(1-x)される
  • これは値が[0.0~1.0]の範囲で収まっているテクスチャマッピング用途においては問題はない(上下反転はしない)が、UV値を補助データとして使う場合においては、V値が変わってしまっているので気をつける必要がある。
  • 対策としては、Houdini側で出力する前にV値をOneMinusしておくか、UEのマテリアル側でV値を取り出す際にOneMinusするか、のどちらか。(※あくまで補助データとして使う場合のみ。テクスチャマッピングで用いる場合は補正は不要。)

このようにV値のほうにOneMinusノードをつけてあげる

補足:UVスクロールの向きも異なるので気を付けよう

V軸の方向が違うので、当然スクロールさせたときに動く方向も異なります。U(左右)方向は同じですが、V(上下)方向が逆になります。

Houdiniの場合

UVそのぞれの値に時間を加算しています。

UV原点は左下

UEの場合

同じく、UVそのぞれの値に時間を加算しています。※通常はPannerノードを使います。

UV原点は左上

Discussion