回転に対応し+不均一スケーリングでもテクスチャタイリングさせる方法

おはようございます.

現在”家”の制作をしておりアドバイスをお願いします.

ユニークな静的/動的メッシュのスケール変更は基本的にXYZ等倍で行うと思いますが,

モジュール式,組み立て式に壁や床を配置するときは均等にスケール変更しない場合があります.

比率を変えてスケーリングするとマテリアル,テクスチャがストレッチしてしまいます.(伸びてしまいます)

いくつか調べて試しましたが,どれも難点があり困っています.


■TexCoord + ObjectScale

スケールに応じてタイリング回数を増減させればよいのであれば,TexCoord + ObjectScaleで実現できそうです.

メッシュは3軸,UVは2軸ですから,メッシュの3軸すべてのスケールには対応しませんが,

X,Y各軸一方のみであれば拡縮できるようになりました.

Xを拡縮しても,XZ平面が歪まずタイリングするのに成功しましたが,

YZ軸はスケールが変わらないにも関わらず,タイリングしてしまいます.

Q1:YZ平面もタイリングしてしまうのをマスクする方法はありませんか?

また,

Xを拡縮すると,XZ平面とXY平面は正しくタイリングしていますが,

Yを拡縮すると,YZ平面だけしか正しくタイリングしないのはなぜでしょうか?


■WorldAlignedTexture

WorldAlignedTextureとWorldAlignedNormalを組み合わせることで

比率を考慮せずスケールしてもテクスチャが無事にタイリングしてくれるようになりました.

しかし,XYZともに30度や60度に回転させると下画像のようになります.

Q2:この問題はなぜ起こるのでしょうか?また,解決方法などありますでしょうか?

メッシュが移動してもテクスチャは追随しないことから,3D空間のXYZ方向からプロジェクターのように投影しているのだと認識しています.

メッシュを回転させると(45度で最大)若干ながら歪むのもそのためだと思いますが,なぜ30度,60度で参考画像のようになるのでしょうか?

Q3:WorldAlignedTextureの”TextureSize(V3)”は見当で値を決めるのでしょうか?

手元にあるチェッカーパターンを目視で確認したところコンスタント”256”でテクスチャ全部を表示しました.


■追記(1)

実際のプロジェクトでTexCoord + ObjectScaleの手法を試したところうまくいきませんでした.
シンプルな正方形メッシュを自作してもうまくいきませんでした.
UE4のスターターキットに入っている[Shape_Cube]でしかうまくいきませんでした.
TexCoordを利用しているということはUV形状に依存ということだと思います.
[Shape_Cube]のUVは十字展開でも全面めいいっぱいでも無い形ですから,この手法実験はたまたま成功したということでしょうか?

TextureCoordinateを使用すると、マッピングがオブジェクトのUVに依存してしまうため、プロシージャルな拡縮には不向きです

WorldAlignedTextureの実装を見るとわかるかと思いますが、WorldAlignedTextureはWorld軸をもとにTextureを投影し、中間(斜めになる面)に関してはLinearInterporateで補完しています
ですので、World各軸に対して垂直でない面は、各軸の結果が混ざる結果になります

MaterialFunctionの中身を参照したい場合は、そのノードをダブルクリックすれば開きます

TextureSizeに関しては、表示したいTextureSizeを入力してください
例えば、1m幅でTextureをTilingしたい場合は100を指定します


過去に類似の質問がありましたので参考にしてください
https://answers.unrealengine.com/questions/801228/view.html

また、上記の質問の回答内容をサンプルにした記事もあります
こちらも参考になれば幸いです

回答ありがとうございます.
Triplanarという手法,用語があることなど勉強になりました.
"AbsoluteWorldPosition"ノードを応用するのは想像が付きませんでした.
まだまだTriplanar実装部でわからないところだらけですが,スケール処理部分については
なんとなく理解を深めることができました.

ところで,なぜテクスチャが鏡写しになってしまうのでしょうか?
チェッカーパータンで試したので気がついたのですが.
±X
±Y
-Zが鏡写しになっています
-X,-Y,-Zが鏡写しになっているのは想像がつくのですが…

UVに-1をかけることで半分鏡写しを修正できました.
今回,直接課題ではありませんが,よろしければ教えて下さい

単に座標系の問題です

UVの座標系は左上を(0, 0)としてU軸(X軸)が右方向、V軸(Y軸)が下方向を向いているのがTextureとしての正の向きです
TextureのPreviewでもこの向きで表示されています
おそらくこの状態の向きを期待しているのだろうと思います

ですが今回のようなWorldPositionをUV値の代わりにするようなものだと、+X側(正面)から見た場合、はYが左方向、Zが上方向を向いています
なのでUV値に従ってTextureをマッピングすると、+方向では上下左右が反転する形になります
Y軸から見た場合も同様の理屈で上下が反転します
Z軸に関しては軸方向が合っているため+方向の反転は起こりません

サンプルはあくまでもLocalSpaceでのTriplanarを実装するためのものであり、左右反転して問題があるTextureのサポートはしていません
そのあたりは実際の要件に合わせて各々でサンプルを改造するべきである、と考えています

本題から派生した問題に答えてくださりありがとうございます.

WorldPositionをUV値の代わりに使う場合,"投影"とは呼べないと思いますが,投影に近い用途,目的で使えそうな気がしました.
タイリング模様そのものや,タイリングに変化をつけるために重ねて表示する汚れなどに使えそうに感じられました.(ほかは思いつかない)
この用途であれば反転も気になりません.

ご指摘の通り,左右反転して問題がある場合はサンプルを改善することにします.

お時間いただきありがとうございました.