2014年10月31日金曜日

NormalMapをベイクする時の知識 その2

その1ではNormalをベイクするためのソフトエッジ、ハードエッジについて書きました。
今回はその結果を踏まえて新たに出てくる問題の解決方法について記述してあります。

(追記)
別の方法でも歪みを解決できる事がわかり、追記しました。
NormalMapをベイクする時の知識 その2(追記)


角付近にある形状が歪む問題の解決方法


ここではUDN-法線マップの加工の内容を実際にテストしてみたいと思います。
(わざわざ同じようなモデルを作成してみました…)

これは、角付近にある形状が歪んでしまう問題の解決方法です。


その1のEの方法を踏まえて、下図のようなHighModelのNormalをベイクしてみたいと思います。
LowModelの法線は複数のスムージンググループを使用しており、
それにあわせてUVを切り離してあります。
(実線はハードエッジ、点線はソフトエッジです)



NormalMapをベイクする時の知識 その1

いつまでたってもうまくNormalmapが作成できないので、
自分が勉強したNormalのベイクに関する情報を少しずつまとめてみたいと思います。

知識を得るたびに少しずつ更新して内容を充実させたいです…(^_^;)

ここで掲載するNormalMapはMayaのマップの転写を使用してベイクしたものになります。



情報収集は主に以下のサイトから。
Polycount Wiki NormalMap
UDN-法線マップの加工


ソフトエッジとハードエッジ


NormalMapをベイクする時の基本はローモデルを単一のスムージンググループ(全てソフトエッジ)にすることです。
しかしソフトエッジだけではきれいにベイクできない場合があります。

基本的なルールとしては

90度ほどの角度がつく場合その箇所はハードエッジにして、UVを切り離す
 それ以外はソフトエッジにする。

2014年10月15日水曜日

Object PositionとActor Position

ObjectPositionとActorPositionの違いについて調べました。

一見似たような機能になるのですが、異なるのは取得する座標位置が異なります。

ObjectPosition… アセットのバウンティングボックスの中心の座標位置を取得。
ActorPositon … アセットの基点の座標位置を取得。

マテリアルを使って違いを確認してみましょう。


2014年10月8日水曜日

WorldPosition(絶対ワールド位置)

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


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


2014年10月5日日曜日

PixelNormalWSとVertexNormalWS

PixelNormalWSとVertexNormalWSについて少し調べてみました。

pixelのNormal情報まで計算するか、VertexだけのNormal情報を計算するかが大きな違いかなと。


WorldSpaceについて

まず、この2つのノードの最後にはWSの表記があります。
これはWorldSpaceの略です。

VertexNormalWSをEmissiveに接続してみます。


ビューでは以下のように、球体を8方向に分割し、それぞれに色が割り当てられています。
(ちょっとgifが汚いですが…)


これはメッシュに対して、ワールド空間の座標を示しています。
ワールドの座標はgifの左下に出ているものです。

[Tips]NormalMapのGチャンネルが反転する問題の解決

先日Substanceテクスチャワークフローのセミナーに参加したところ、NormalMapの反転の解決方法について知ることができたので、追記をさせていただきます。

多分、これが一番正しい修正方法。
元の投稿も何かの役に立つと思うので残しておきます。

NormalMapが反転する原因はベイクした環境はOpenGLかDirectXかによって異なるそうです。
これを3DViewの設定で変更することができます。

Materials>Default>Edit で3DViewの設定画面を開きます。


デフォルトではDirectXがTrueで有効になっています。



2014年10月3日金曜日

sineについてお勉強

今回はSubstance Designerではなく、UE4のMaterialについてです。

UE4には様々なサンプルが付属されており、マーケットプレイスからダウンロードが可能です。


Materialの数学的なことに関するお勉強をしたい場合は、
Contents Exampleに入ってるMath_Hall.umapを使うと良いです。

このようにたくさんの数学処理のサンプルがあります。
また、ひとつずつノードの解説があるのと、
それを使ってMaterialでどのような表現ができるかのシンプルな例もあるのでわかりやすいです。



それで最近学んだ事を少し備忘録的に残しておきます。
(私はまだ半分ぐらいまでしかみてないですけども…)


sine

sine, cosine, tangentって昔この3つをセットで学んだ記憶がありますが、
このsineはMaterialでよく見かけます。


sineとは-1~1の間を反復している波形のグラフです。
Googleでsin(x)と入力して検索するとこのように波形グラフが表示されます。
(ありがたい機能!!)



このノードの組み方の場合、後ろにTimeノードがついてるので、一定速度で時間が進みます。
つまり、この波形グラフでいうと、x軸に動くということですね。



Time と Sine をつないで返される数値はYの値になるので、
これをそのままBaseColorやEmissiveにつなぐと白から黒に周期的に変わるようになります。



なぜ白黒に変わるのかというと、ここで得られるYの値というのは-1~1の間で動く数値になります。
ConstantノードをBaseColorにつないだ時に0は黒、白は1になりますよね。

-1~1の値が周期的に得ることができるため、
色でみた場合黒から白へ変化し続けるということです。



DebugScalarValues

余談ですが、これを数値的にもっとわかりやすくする事ができます。
MaterialFunctionに DebugScalarValue というのがあります。


このノードを接続し、プレビュー表示にする、
もしくはBaseColorにつなぐと現在取得できている値を確認することができます。


数値を見ていると -0.9~0.9ぐらい (それ以下の数値は早くて見えないです) 
で動いてるのがわかりますよね。

数値で確認したい場合はこのノードを使うと便利です。
Scalarだけではなく、2~4Vectorもあります。




abs

カラーで表示した時に黒の時間が長く感じると思います。
それは0より下の値はカラーの場合0(黒)とみなされてしまうからです。

ここでつないでいるabsノードについて解説します。

absの意味は絶対値。
-の値がついたものを+にします。

-0.9 は 0.9
-0.333333 は 0.33333 


0より下に動いてたものがすべて+の方向になるので波形グラフは以下のようになります。



カラーの表示見ると少し黒くなってすぐ白くなるような緩急のついた変化を見ることができます。



ConstantBiasScale


absの代わりにConstatBiasScaleをつないでみます。

ConstatBiasScaleは入力された値(sineからの値)に
バイアスの値を加算してそれにScaleの値を乗算してくれるとのこと。
Biasが1でScaleが0.5であれば、-1~1の値を0~1に変換してくれるそうです。


つまり、受け取る値は0の場合、
0+1)/0.5 = 0.5

受け取る値が-1の場合
-1+1)/0.5 = 0

という計算をしてくれているということですね。



なかなか感覚的にわかりにくいですが、
これを使った場合の結果はこのような感じ。



0~1の周期で動いてるのが確認できますね。



このように後ろにつなぐノードを変えることで異なる動きを表現することができます。
更に様々な要素をかけていけばより複雑な動きも可能です。




数学はもうほぼ忘れてしまっているので、
Materialの勉強をしながら感覚的に理解を深めていきたいところ。

ブログにアウトプットしてみると自分も更に理解することができるので、
時間はかかるけど継続していけば複雑なのも作れるようになるのかしらね。(遠い目)