5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UE4でオブジェクトスケールに依存しないマテリアルを作成する

Last updated at Posted at 2020-11-17

以下のように通常のマテリアルだとオブジェクトスケールによって表示されるテクスチャのサイズが異なってしまいます。

capNormalUV.PNG

これを以下のようにどんな大きさのオブジェクトに適用しても同じスケールのテクスチャで表示されるようにしてみたのでその内容をメモしておきます。
数学的な素養があまりないのでツッコミがあったらお願いします。
UE4.25.4で実装しています。

capWorldUV.PNG

既存の解決方法とその課題

以下のサイトにあるようにAbsolute World Positionを利用することでオブジェクトスケールと関係なく表示できるようになります。

【CG】テクスチャをオブジェクトスケール等を無視して、UV値のみに依存させる【UE4】 – 建築グラビア

ただし、上記に紹介されている方法だとXY平面、YZ平面、ZX平面から斜めになると表示がずれてしまいます。

capTamentaiBefore.PNG

オブジェクトスケールに依存しないマテリアル

面が斜めになっても大丈夫なようなマテリアルを作ってみました。

考え方

以下の図のように下記2つの交点が求まれば原点とあわせて距離を求めてU、Vの値が出せるのでその値を使ってみます。

  • 法線に対する平面とWorldPositionから法線のXY成分ベクトルとの交点
  • 法線に対する平面とXY平面の接線と上記交点との最短距離の交点

capImage.PNG

ちなみに法線がZ軸方向に完全に上向きと下向きの場合は上記の計算ができないのでWorldPositionのXY成分をUV値とします。

マテリアルファンクション - MF_IntersectionOfLineAndPlane

原点からの法線Normalで表される平面と位置LinePointからベクトルLineVectorで表される直線との交点を求める関数。
数式としてはこちらのサイトを参照。
MF_IntersectionOfLineAndPlane

マテリアルファンクション - MF_ShortestIntersectionOfVectorAndPoint

原点を通りベクトルVectorと地点Pointとの最短の交点を求める関数。
数式としてはこちらのサイトを参照。

capMF_ShortestIntersectionOfVectorAndPoint.PNG

マテリアルファンクション - MF_UVtoCM

与えられたNormalとAbsoluteNormalPositionからUVを計算する関数です。
後から気づきましたが無駄に三平方の定理を使わずに原点と交点の距離からUを出す方が良いですね。

capMF_UVtoCM.PNG

マテリアル

上記で作成した関数を利用したマテリアル。
NormalテクスチャについてはPixelNormalWSの値を用いるとエラーになります。
PixelNormalWSはNormalテクスチャで指定した値が加味された値なので定義がループして使えないということでしょうか。
Normalテクスチャの影響がないVertexNormalWSを使うとうまくいくようです。

capMaterial.PNG

マテリアルを用いた表示結果

面が斜めでも表示されます。

capTamentaiAfter.PNG

作ってみた所感

マテリアルファンクションをちゃんと使うとデバッグもしやすいし見やすくなるのでいいですね。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?