2014年10月8日水曜日

WorldPosition(絶対ワールド位置)

AbsoluteWorldPositionノードについて勉強してみました。
日本語の名前にするとなんか… いや、いいんですけどね。


WorldPositionノードはその名前の通りワールドの位置を示してくれるノードです。
ワールドの位置とはどういうことなのかを確認してみます。





WorldPositionから取れる情報

WorldPositionノードからDivideで1024を割り、Emissiveに接続します。


シーンにデフォルトで入ってる球体もしくは、ボックスにマテリアルをセットし、
以下のように配置をしてみます。


すると、原点を中心に位置によって色が異なっているのがわかると思います。
これってVertexNormalWSでも同じようなものを見かけましたね。

コレ↓


VertexNormalWSでも同じような色がついていましたが、
ワールド空間でも同じように座標によって決められた色情報を取得することができるようです。

WorldPositionの場合、座標の値をそのまま受け取っているので、
値が非常に大きいです。

DebugFloat3Valuesノードをつないでそれぞれの座標にどのような値が入ってるか確認してみるとわかると思います。


(1000,1000,500)の位置に配置されてるメッシュの値は誤差はあれど
座標とほぼ同じ値が取得されているのがわかります。


なので、Divideで512など好みの数字を割ったり、
Multiplyで0.01など小数点以下の数字をかけることで、
データとして扱いやすい数字にすることができます。




WorldPositionを使って作るマテリアル例


WorldPostionノードを使うことで、ワールド空間の座標を取ることができることが分かりました。
また、ワールド空間に対して座標の向きの情報を取ることもできそうです。


マテリアルを以下のように組みます。
WroldPositionからDivideしか結果にComponentMaskでR,G情報だけとり、
TextureSampleに接続します。


今度は、シーンにBoxのFloorのメッシュを配置し、マテリアルを割り当てます。
BOX形であれば何でもOKです。

一見普通にテクスチャが貼られていますが、
メッシュをうごかしてみると、テクスチャの位置がメッシュについてこないのがわかると思います。


StaticMeshのUVに依存しないでタイリングするテクスチャを貼りたい場合、
この方法を使うことができます。

例えば、床や壁のように同じアセットを並べて配置する場合、
アセットのタイリングが目立つと思います。

それを緩和させるために、汚しをWorldPositionを使って貼ってあげることで、
アセットのトランスフォームに関係なく貼ることができます。


例えば、以下の様な感じでマテリアルを組みます。
芝のテクスチャを汚しのテクスチャだと思ってください。
(クリックで拡大表示)


























gifが小さくてわかりにくいですが、
複数のメッシュにわたってブレンドをした場合、
タイリング数によってUVの切れ目が出てしまうのを気にすることなく、
シームレスにブレンドすることが可能です。





NormalMapを使用する場合の注意事項(追記)

この投影の方法ですが、Normalを使用する場合注意する必要があります。
アセットの向きを回転させた場合、Normalの向きがアセットの向きに影響されます。

この問題はマテリアルプロパティのTangent Space Normalのチェックを外すことで解決します。


WorldNormalで表示してみるとこのような感じです。
中央のアセットだけ90度回転してありますが、
Normalの向きがあっていないのがわかると思います。


Trueとはチェックが入ってる状態。
Falseとは、チェックを外した状態のことです。



WorldPositionのノードは他にも色々な使い方をしているのを見かけます。
また機会があれば、紹介したいと思います。


0 コメント:

コメントを投稿