もんしょの巣穴blog

[SD] Substance Player

今日知った小ネタ。

Substance Playerというツールが有ります。
SubstanceマテリアルをViewingするためのツールなのですが、こちらから無料でDLすることが出来ます。

https://www.allegorithmic.com/download/download_free/6

このツールは.sbs, .sbsarを開くことが可能で、パラメータを変更することも可能です。
ただし保存はできません。パラメータを調整して保存する機能はありません。
もちろん、.sbsファイルのノードを変更することも出来ません。

しかし画像データとしてエクスポートは出来ます。
ライセンス的に問題がないSubstanceマテリアルであれば無料でテクスチャ画像が取得できるわけです。

さて、ここからが本題。
Substance DesignerではパラメータやPixel Processorの変数として時間を取得することが出来たりします。
[Get Float]ノードを関数内に配置し、プルダウンメニューから"$time"を選択するだけです。
しかしこの時間、SD上では確認する術はありません(少なくとも自分は見つけられませんでした)。
しかし、Substance Playerなら確認可能なのです。

そこで今回はいわゆるFlowMapを確認するためのSubstanceマテリアルを作成してみました。
以下からDLできるようにしています。

https://dl.dropboxusercontent.com/u/39588440/Substance/FlowMap.sbs

マテリアルの中身はこんな感じ。

sd140.jpg

下のPixelProcessorの中身はこんな感じです。

sd141.jpg

仕組みとしてはほんとに単純なFlowMapです。
入力画像とFlowMapは外部から与えることも可能ですが、デフォルトでは入力画像はチェッカー、FlowMapは回転するようにPixelProcessorで作成したものです。

では、これをSubstance Playerで読み込んでみます。

sd142.jpg

Substance Playerはこのようになっています。B2Mっぽい見た目ですね。
右側がパラメータで、入力画像とFlowMapは外部から読み込むことも出来ます。

下の方を見てください。
タイムラインと書かれている部分があるのがわかりますね?
この一番左の再生ボタンを押すと"$time"変数がタイムラインにそって変更されます。
これがPixelProcessorで使用されているので、FlowMapが正しく動くことになります。

また、テクスチャエクスポート時にタイムラインに沿って出力することが可能です。

sd143.jpg

[ビットマップでエクスポート]ボタンを押すとこのWindowが表示されます。
上の赤枠部分が時間に関するパラメータで、時間単位、開始・終了フレーム、FPSを指定することが出来ます。
これを利用することでプロシージャルなフリップブックアニメーションを作成することも出来るでしょう。

というわけで小ネタでした。
スポンサーサイト
  1. 2016/05/30(月) 23:31:58|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:0

[SD] 配置系ノードについて調べてみた

Substance Designerでは入力した画像を複数配置する系のノードがいくつかあります。
今回はそれらのノードについて調べてみたこと、自分なりの考えを徒然なるままに書いてみます。
間違っている部分、調査の足りない部分、自分はそう思わないという部分もあるかと思いますが、そのような場合はコメントなりTwitterなりで指摘していただけるとありがたいです。

・Splatter
sd135.jpg
Splatterとは水などの液体がはね飛ぶ様子を意味する動詞・名詞です。
多分配置系の中では最も軽いノードで、実装自体もかなり単純そうです。

名前からしてとにかくランダムに配置するようなノードと思われがちですが、かなり規則正しく配置されます。
また、他のノードとパラメータの単位が結構違うので戸惑いやすいですね。
個人的にはあまり使わないのですが、とにかく単純に配置したいだけなら十分に使用できます。

[Pattern Size Width/Height] は単位が%となっていて、100がデフォルトです。
パターンの位置をランダムにずらすには [Disorder] を使用しますが、X方向にランダムに移動するだけです。
全体にランダムに散らしたい場合は、[Disorder] と [Disorder Angle] を使用します。
[Disorder] が0の場合の中心位置が [Disorder Angle] のピボットポイントとなります。
つまり、均等に整列している場合の中心点を回転中心として [Disorder Angle] 分だけパターンの位置が動きます。

しかしこれだけでは配置に規則性が出てきてしまうので、そのような場合は [Disorder Random] を True にすると、各パターンごとに [Disorder Angle] の角度がランダムになります。

大きさのランダムは全体に対してしか行えません。Xのみ、Yのみの拡大はできないようになっています。

Tile~系のノードと違って、配置する数を指定することはなく、[Zoom] を使ってカメラとイメージの距離を変更します。
これによって配置されるパターンの数を調整します。
ただし、[Zoom] を行った場合はタイリングテクスチャを作成できなくなるおそれがあるので注意ですね。

単純故に処理速度も高速ですが、単純に配置するだけならこのノードが一番よいでしょう。

・Tile Generator
sd136.jpg
比較的規則正しくパターンを配置したい場合に使用するノードという印象です。
配置するパターン数を [Number X/Y] で指定することができますし、Splatterノードと違ってタイリングテクスチャ作成は容易です。

パターンの各方向のサイズは直接的に変更することは出来ませんが、先の[Number X/Y]をそれぞれ別の値に変更することで縦横比を変更することが出来ますが、一律にしかなりません。
[Scale] や [Scale Variation] は入力パターンの全体の大きさを変更するだけです。
[Interstice] の項目は本来パターン同士の間隔を指定するパラメータなのですが、実はこの値を利用してXY方向それぞれのスケーリングも行えます。
正の値で間隔が開く、つまりパターンが小さくなるのですが、負の値を指定することで逆に大きくすることが出来ます。
ランダム設定もできます。

いくつかのパラメータは行、もしくは列に対して1つ飛ばしで処理されるようになっています。
[Offset] は水平方向のオフセットですが、[Vertical Offset] を True にすると垂直方向のオフセットに変化します。
水平・垂直方向に同時にオフセットを設定する手段はありません。
[Middle Size] の項目は水平・垂直方向に交互にスケーリングするパラメータです。
[Horizontal/Vertical Mask] も行・列の1つ飛ばしでマスクします。

回転は [Free Rotation] と [Fixed Rotation] があり、Freeの方はアナログな角度単位で指定できるのに対して、Fixedの方は90°固定で回転させます。
[Fixed Rotation Random] はパターンごとに回転角度を0と180のどちらかが選択されます。
この状態では90°単位の回転が出来ないのですが、[Quincunx Flip] を True にするとパターンごとランダムに90°ずつの回転が割り当てられます。
多分このパラメータはよく使うことになると思います。

[Position Random] を利用することで空間中のランダム配置も可能です。
比較的整列した配置に使われるものですが、ランダム配置にも十分使えるノードです。
Splatterノードより処理速度はかかる事が多いですが、速度と実装のバランスが良いノードとも言えるかと思います。

・Tile Random
sd137.jpg
Tile Generatorよりランダムに偏ったノードです。
Tile Generatorは配置されるパターンが行列に対して一定で配置されるのに対して、こちらのノードは各ブロックごとにサイズがランダムになり、パターン配置のスプリットが行われる特徴があります。
下の図はデフォルト設定のTile Randomですが、一部のブロックがスプリットされているのがわかるかと思います。

sd138.jpg

この設定は [Split] カテゴリのパラメータで行います。
[Mode] を [none] にするとスプリットが行われませんが、[auto] にすると縦・横にスプリットが行われます。
[auto horizontal/vertical] は水平・垂直方向のみのスプリットになります。
[random h+v] はイマイチ [auto] との違いがわかりません…

[Threshold] によってスプリットされるブロック数を増減できます。
0 の場合は一切スプリットが行われなくなり、1に近づくとスプリットされるブロック数が増えます。
[Multiplier] はスプリット回数です。

[Rotation Random] は [Pattern] カテゴリと [Shape] カテゴリの双方にありますが、前者は90単位の回転、後者はフリー回転となっています。

その他の部分は割とTile Generatorに似ていますが、[Interstice] に負の値を入れることは出来ません。
また、X/Y方向それぞれの指定もできないので、一定方向に伸ばすといった処理は [X/Y Amount] で対応する必要があります。

速度は前述2つより重くなる傾向にあります。
どういう使い分けをすべきかイマイチわかっていないノードですが、みなさんはどういう感じで使い分けてるんでしょうか?

・Tile Sampler
sd139.jpg
これまでのノードと比べて大量の入力を持っているノードです。
入力される画像を利用することで移動、スケール、マスクなどの処理が行えるのが特徴で、かなり汎用的に使用することが出来ます。
また、ランダムをある程度自分が思ったような形で制御することが出来るという利点もります。
その分処理速度が他のノードよりかなり重めですので注意してください。

入力されるマップはパターン以外に、Scale、Displacement、Rotation、Vector、Color、Maskがあります。
Scaleはスケール値、Displacementは位置、Rotationは回転が、それぞれ入力されたマップに依存します。
マップを有効にしたい場合は [~ Map Multipllier] の数値を上げていきましょう。
1に近づけばその分マップの影響を大きく受けるようになります。

Mask Mapは [Mask Map Threshold] で指定された範囲にのみパターンを配置するように出来るすぐれものです。
例えば、敷石の隙間に砂利を配置したい、という場合に砂利の画像に敷石をマスクとして使ったマップとの間で積算し、敷石がない部分の砂利だけ有効にするという方法が一般的です。
この方法は砂利が十分に小さい場合は有効ですが、それなりの大きさの丸石を配置したいとなると不自然に切られてしまいます。
Mask Mapはそもそもマスクされている部分には配置しないという形を取るので、このような切断は発生しなくなります。
ただし、より正確に配置したい場合は [Mask Map Sampling Technique] を [Pattern Bounding Box] にすることになるのですが、こちらはデフォルトの [Pattern Center] より重いです。

Vector Mapもちょっと特殊です。
このマップはScale、Position、Rotationの3箇所で参照することが出来るのですが、どうやらMask Mapによるマスキングが行われた後に処理が適用されるようです。
そのため、マスクが意味を成さなくなることがあります。使用の際には十分気をつけてください。

他のノードが入力パターンを1つしか受け入れていないのに対し、このノードは複数のパターンを入力することが出来ます。
[Pattern Input Number] を増やすことで入力パターンを増やせます。最大6つまでです。
複数のパターンを配置したい場合、それぞれで配置→[Blend]で合わせるという方法もあるのですが、その場合は重なってほしくないのに重なってしまうということもありえます。
入力パターンを増やすことでこの問題にある程度対応ができるので、大変使い勝手がいいです。

通常なら制御しにくいランダム配置を制御しやすくしてくれる大変ありがたいノードです。
速度面を気にする必要が無いのであれば積極的に使っていきたいノードです。

・何を選択すべきか?

自分が今やりたいことに合ったノードを選択することが重要ですが、どのような状況でどのノードを選択すべきでしょうか?
これについては感覚で覚えるのが一番早いのでしょうが、プログラマらしくある程度理屈で攻めてみます。

まず、画像を元にして配置に変化を与えたい場合は [Tile Sampler] 一択です。
マスクされた範囲にだけ配置したい、という場合は特にそうです。
非常に小さなパターンを大量に配置するのであれば [Splatter] で配置、マスクとMultiplyブレンドでも良いと思います。
しかし、ある程度形状のはっきりしたもの(小石など)の場合は切断されてしまって現実味が薄れます。
この場合は [Tile Sampler] の力を思う存分発揮してもらうのがいいと思います。

レンガやタイルなど規則正しく整列して欲しい場合は [Tile Random] 以外を選択しましょう。
オススメは [Tile Generator] ですが、速度が遅くても問題ないなら [Tile Sampler] もありです。
[Splatter] でも可能ですが、あえて選択する理由はないと考えます。
大きさもほぼ一定、並び方も規則正しい場合は [Tile Random] は使用できません。

ある程度形状がはっきりしているものをとりあえず配置したい場合はどれを選んでも構いません。
しかし、速度面の問題から [Tile Sampler] は避けたほうが良いと思います。
高度なことをしないのであれば速度的に速いものを選択すべきです。

この場合で、パターン同士が重なっては困る場合は [Tile Random] を使用しましょう。
このノードの [Random Constraints] が True の場合は位置のランダムを有効にしてもそれぞれのブロックからはみ出ることはなく、パターン同士の重なりが発生しません。
数が少ない場合は配置のパターンが見えてしまいますが、十分な数を配置すればパッと見で配置パターンはわかりません。

重なっても構わない場合は [Splatter] か [Tile Generator] が良いでしょう。
個人的には形状がはっきりしている場合は [Tile Generator] の方が使い勝手がいいと思います。
パラメータ的に狙った形を作りやすいんじゃないかと思いますが、それほどパラメータ調整をしないのであれば [Splatter] でも良いでしょう。

とにかく小さなものを大量に、形状もそこまではっきりしないという場合は [Splatter] をオススメします。
パッと見はランダムにボリュームのある点が大量に集まっているだけだが、よく見るとその点はある程度の形状を有している、というようなノイズ画像を作る際には速度面で考えても有効です。

これらの使用用途は個人的な見解であり、1つの指針でしかありません。
この作り方でやらなければいけないというわけでもないので、従う必要はありません。
ただ、なんとなく迷った時にこういう方針を掲げてる人がいたな、と思って参考にしていただければ幸いです。
  1. 2016/05/24(火) 00:24:52|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:0

[UE4] HTC Viveでプレイヤーの顔の位置を取得する方法

個人的な覚書。

HTC Vive(に限らないと思うのですが)、プレイヤーの顔の位置、つまりヘッドセットの位置を取得したい場合があるはずです。
キャラがこっちを向くとか、敵がこちらを攻撃してくるとか。

UE4にはHMD関連の命令として [Get Orientation and Position] という命令があります。
これで取得できるPositionを使えばいいんだよね?と思っていたらそうじゃなかった。
どうの座標が正確に何なのかはわからないのですが、どうも焦点位置っぽい。

ではどうすればいいのかというとこういう感じにノードを組む。

ue409.jpg

これで正常にプレイヤーの顔の位置めがけて弾丸を発射してくれましたとさ。
やったね!
  1. 2016/05/08(日) 18:34:24|
  2. UE4
  3. | トラックバック:0
  4. | コメント:1

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する