特定の位置にパターンを表示する方法

今回紹介するのは入力画像の特定条件にあるピクセルにのみ指定パターンを表示する方法です。

[Tile Sampler] ノードにはランダムに配置したパターンがグレースケールの白の部分にのみ表示されるようにする機能があります。

この記事ではその簡易バージョンを作る方法を提示します。

簡易バージョンなのでもう少しちゃんと作らないと実用的にはならないのですが、仕組みがわかっていれば [Tile Sampler] ノードから該当部分を抜き出すこともできるようになるんじゃないでしょうか?

まだ自分はできていませんが、そのうちやる予定。

この処理には [FX-Map] を使用します。

このノードはSDでは唯一ループ処理を行うことが出来るノードであり、今回のようにパターンを複数回散りばめるのには大変便利です。

特定パターンを複数表示するノードとしては先に紹介した [Tile Sampler] も含まれるタイル系やスプラッタ系がありますが、これらは内部で [FX-Map] を使用しています。

まずは準備をしましょう。以下のようにノードを作成します。

sd144.jpg

[Image Input 0] に入力された円が今回は散りばめるパターン、[Image Input 1]に入力された三角が表示位置を示す画像とします。

[FX-Map] ノードの [Color Mode] はグレースケールに変更しておきましょう。

次に入力パラメータを追加しておきます。以下のように作成します。

sd145.jpg

[tile_num_x/y] はXY座標のタイルの数で、この数値分画像が分割されます。

[gray_threshold] は [Image Input 1] の該当ピクセルがこの値以上の場合にパターンを表示するようにするためのしきい値です。

では、[FX-Map] を選択し、[Ctrl + E] で内部に入っていきましょう。

内部は以下のようにします。

sd146.jpg

最初から入っている [Quadrant] ノードの上に [Iterate] ノードを配置し、これをルートとします。

[Iterate] ノードがループ処理を行うノードで、このノードの [Iterations] パラメータで指定した回数だけ [Quadrant] ノードが実行されます。

[Iterate] ノードを複数繋げて多重ループも実現できるのですが、繰り返し回数を変数として取得できるのはその変数を使用したノードより手前直近の[Iterate]ノードのみです。

つまり、多重ループのそれぞれのループ回数は取得できません。

今回はそれでは困るので、1回のループで2重ループと同じ効果を出すようにします。

[Iterations] パラメータを空の関数とし、内部を以下のように作成します。

sd147.jpg

タイルのXYの整数を乗算して出力します。

例えばX=2、Y=2であれば4回ループとなります。タイル数分だけループするわけですね。

次に [Quadrant] ノードの処理を行います。

パラメータを変更するのは [Pattern] を [Input Image] に変更するだけです。

あとは各種パラメータの関数内部で処理を行うことにします。

まずはタイル上にパターンを配置しなければなりませんので、その処理を作成します。

[Branch Offset] のパラメータを関数化し、内部に入りましょう。

この関数は以下のように実装します。

sd148.jpg

(クリックで拡大)

ちょっと複雑でわかりにくいかもしれません。

まず左下のブロックはタイル1つ分の幅と高さを求めています。

タイルの分割数がXYともに2ならここで求められる値は(1/2, 1/2)=(0.5, 0.5)となります。

右下のブロックはパターンを左上ピッタリに配置する場合のオフセット値を求めています。

最後に上のブロックで繰り返し回数からXYのタイル座標を求め、それに見合った左上からのオフセット値を求めます。

これを右下のブロック(つまり左上のオフセット座標)に加算することで、繰り返し回数に依存したパターンのオフセット値を求めることが出来ます。

しかしこれだけでは大きなパターンが移動するだけです。サイズも適切なサイズに変更する必要があります。

この処理を [Pattern Size] パラメータ内に作成してもよいのですが、実はパターンサイズとして利用するパラメータは左下ブロックの結果と同等だったりします。

同じ計算を何度もやるのは面倒です。なので、この結果をローカル変数に設定します。

上の図の真ん中に [Set] ノードがあります。これは指定名(ここでは [pattern_size])のローカル変数を作成し、そこに値を格納しています。

この [Set] ノードで設定した値を使用するにはいくつかの条件が存在します。

1つ目の条件は、この値はこの関数を持ったパラメータが所属しているノード内でのみ有効です。

つまり、この場合は [Quadrant] ノードでのみ使用可能です。

使用する場合は [Get ~] ノードを使用しますが、同一関数内以外ではドロップダウンリストに表示されないのでて入力する必要があります。

2つ目の条件は [Set] ノードを利用したパラメータ以下のパラメータの関数内でしか使用できません。

今回の場合は [Branch Offset] 内部で使用しているため、この関数内部か、そこから下の [Quadrant] ノードのパラメータでしか利用できません。

つまり、[Color / Luminosity] パラメータの関数内では使用できないということです。

3つ目の条件としては [Set] ノードを有効にするには出力ノードとして設定したノードに対する処理の途中で挟む必要があるということです。

これについては後で説明します。

さて、ここで [pattern_size] というローカル変数にパターンサイズとして利用できる値が入力されましたので、[Pattern Size] パラメータの関数内でこれを使用しましょう。

[Pattern Size] パラメータを関数として、内部を以下のように設定します。

sd149.jpg

ここまで処理を作成すれば綺麗なタイル状に円が敷き詰められるはずです。

しかし、これからが本番。[Input Image 1] のイメージに従ってしきい値以上のグレーならパターンを表示するようにしましょう。

これを実現するにはタイル状に敷き詰められた各パターンの中心のピクセルを [Input Image 1] から取得し、この値がしきい値以上かどうかを確認、しきい値未満であれば [Pattern Size] を0にするという手法を取ります。

そのような加工をした結果が以下となります。

sd150.jpg

(クリックで拡大)

右上の部分がパターン中心のイメージのピクセルをサンプリングし、これがしきい値以上かどうかを調べている部分です。

しきい値以上であれば加工前の [pattern_size] 出力を選択し、しきい値未満であれば (0, 0) を選択します。

この選択結果を [pattern_size] に入力していますが、その後に [Sequence] ノードに繋げるようにしています。

なぜこのようにするのかというと、これまで通りに下部の加算部分を出力ノードとして選択してしまうと、その結果を求めるのに [pattern_size] への入力は通る必要がなく、SD内部で不要なノードとして無視されてしまうのです。

関数の出力には影響を与えないが処理されなければ困る、という今回のような場合には確実に処理が行われるようにするために [Sequence] ノードを使います。

このノードの入力ピンは上が [In]、下が [Last] となっていますが、出力されるのは [Last] ピンに入力された値です。

[In] に入力された値はこれ以降ではどこからも参照されませんが、処理だけは走ります。

これが [Set] ノードを使う条件の3つ目の回避方法です。活用していきましょう。

このようにノードを組み、[gray_threshold] を 0.5 に設定すると、三角形の形状で円が表示されるはずです。

円の数が少ないようでしたら [tile_num_x/y] の値を大きくしてあげましょう。

タイルの数がXYともに16の場合は以下のような結果となります。

sd151.jpg

最後に注意点を。

[Quadrant] ノードの [Pattern] はパラメータの関数化も出来ますし、関数内部で固定値 0 を出力すると [No Pattern] を選択されたように表示が消え、1 を出力すると [Input Image] が選択された状態となり円が表示されます。

パターンの表示/非表示はこちらでやるべきではないのか?

そう考えて [Pattern Size] を0にする方法でなく、[No Pattern] を利用した形で表示/非表示を切り替えられるようにしてみました。

しかし残念なことにこれはうまくいきませんでした。

なぜそうなっているのかはわからないのですが、どうやら [Pattern] の関数に対してはイメージのサンプリングが出来ないようです。

何か見落としてうまくいっていないだけなのかもしれませんが、私が試した際にはうまくいきませんでした。

注意しましょう。

Weighted Blended OITの実装

今回はWeighted Blended OITと呼ばれる技術をUE4のエンジンコードを改造して実装する話です。

エンジンコード改造となりますので文字多めです。

・OIT(Order Independent Transparency)とは?

OITとはOrder Independent Transparencyの略です。

順序に依存しない半透明、というような意味ですが、ほぼそのままの意味です。

知っての通り、半透明を描画する際には描画順序が重要になります。

大抵のシステムではメッシュ単位などでZソートを行い、画面の奥のメッシュから順番に描画していきます。

この手法はほとんどどんなシーンでも有効に働きますが、一部のシーンではうまくいきません。

わかりやすいのは半透明メッシュが入れ子構造になっている場合です。

半透明のグラスの中にやはり半透明のウィスキーが入っている、という場合、正しい描画順序はグラスの奥→ウィスキー→グラスの手前となります。

しかしメッシュ単位での描画となるとウィスキー→グラス、もしくはウィスキー入りグラス1回で描画、という事にもなります。

後者はどうしようもないとして、前者はグラスの奥側を正しく描画できないので、グラスの奥は描画しないなどの措置がとられるのではないかと思います。

ゲーム中のちょっとした小物くらいならそれでもいいかもしれません。

しかし、昨今のゲームは大変映像が綺麗になっていて、カットシーンなどでも高解像度です。

また、ゲームエンジンを利用した建築ビジュアライゼーションなども需要が出てきています。

このような状況で半透明の順番を正しく考えなければならない、そういうデザインを心がけなければならないというが難しくなってきているのは否定できません。

OITを実装しているゲームはほとんどないのが現状ですが、非常に高い優先度とはいえないまでもあったら欲しい機能と考えられているのではないでしょうか?

・Weighted Blended OITとは?

OITの実装としてはLinkListを利用したものが最も有名なのではないかと思います。

手前味噌ですが、私も以前実装したサンプルをアップしています。

DirectXの話 第110回

この手法は新生トゥームレイダーララ・クロフトの髪の毛の表現で使用されていましたが、やはり速度面で苦労していたようです。

正確に表現しようとするとこの手法は正確な半透明の順番を守ることが出来ます。また、トゥームレイダーでは順番を完全に正確に守らずに高速化を図っていたと記憶しています。

ある程度のスケーラビリティを持っていると言っても重いものは重い。

実装も比較的面倒ですし、このサンプルを作成した段階ではRadeonのドライバのバグで正常に描画されないこともありましたしね…

今回紹介するWeighted Blended OITは比較的軽く、実装も容易です。

Weighted Blended OITのペーパー

しかしかなり大胆に近似している手法であるため、正確な半透明表現はできませんし、使用の際には注意が必要です。

概要を簡単に説明してしまうと、半透明が重なった際に、その色が最終的な映像にどの程度影響を及ぼすかを重み付けして最後に正規化するという手法です。

と言ってもわかりにくいと思いますので、実例で解説します。

不透明メッシュ描画完了時、フレームバッファにはCsというカラーが描かれていたとします。

ここに(C1, A1)という半透明カラーが描画されたとしましょう。なお、Cはカラー、Aはアルファです。

それよりも手前に今度は(C2, A2)という半透明カラーが描画されます。

終結Cfは以下のような計算になります。

Cf = C2 * A2 + (C1 * A1 + Cs * (1-A1)) * (1 - A2) = C2 * A2 + C1 * A1 * (1 - A2) + Cs * (1 - A1) * (1 - A2)

アルファ値は0.0~1.0で、アルファ値同士の乗算(A1 * (1-A2)(1 - A1) * (1 - A2))は1.0を超えることはありません。

アルファ値に着目すると、最終結果により強い影響を与えるのはアルファの乗算結果が大きいカラーということになります。

つまり、A2が大きければC2の影響が大きくなり、A1が大きければC1の影響が大きくなります。

両方小さければCsの影響が大きくなります。

今度はA1 = 0.5A2 = 0.5とした場合の結果を計算してみましょう。

Cf = 0.5 * C2 + 0.25 * C1 + 0.25 * Cs

アルファ値が固定の場合、最後に描画されたC2の影響が大きくなります。

より一般的に考えると、深度が手前の半透明カラーの方が影響を与えやすいということです。

つまり、アルファ値が大きければ大きくなる、深度が近ければ大きくなる、という感じの関数 w(a, z) を作成し、これによって各半透明カラーの影響度を求める、というのがこの技術です。

弱点としてはあくまでも各カラー単体でのブレンドウェイトしか求められないため、前後関係などを正確に表現できるというわけではない点です。

そのため、画像処理ソフトで求められたブレンドの結果はこの技術で再現することはほぼ不可能です。

また、ウェイト関数によってはカメラの移動に対して結果が安定しません。

安定させようとすると今度は小さな距離の差がほとんど無視される結果になります。

入れ子構造の半透明ではまともな結果が得られないでしょう。

と、このように制約も大きな技術ではありますが、限定的な使用方法なら用途もあるんじゃないでしょうか?

…あるかなぁ?

それはともかく、続きからでソースコードの改変を行っていきます。

続きを読む

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を指定することが出来ます。

これを利用することでプロシージャルなフリップブックアニメーションを作成することも出来るでしょう。

というわけで小ネタでした。

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

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つの指針でしかありません。

この作り方でやらなければいけないというわけでもないので、従う必要はありません。

ただ、なんとなく迷った時にこういう方針を掲げてる人がいたな、と思って参考にしていただければ幸いです。

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

個人的な覚書。

HTC Vive(に限らないと思うのですが)、プレイヤーの顔の位置、つまりヘッドセットの位置を取得したい場合があるはずです。

キャラがこっちを向くとか、敵がこちらを攻撃してくるとか。

UE4にはHMD関連の命令として [Get Orientation and Position] という命令があります。

これで取得できるPositionを使えばいいんだよね?と思っていたらそうじゃなかった。

どうの座標が正確に何なのかはわからないのですが、どうも焦点位置っぽい。

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

ue409.jpg

これで正常にプレイヤーの顔の位置めがけて弾丸を発射してくれましたとさ。

やったね!

SciFi Shape Makerの使い方

Substance Painter 2がリリースされ、Substance Liveの形態が微妙に変わったりしましたが、今度はSubstance Storeが出来ました。

それを記念してなのかどうかわかりませんが、MoodpackのフリークーポンがAllegorithmicから届きました。

MoodpackはSubstance StoreにAllegorithmic自らが出品しているもので、あるテーマに沿ったマテリアルやメッシュ、フィルタ類をまとめたものです。

現在はMilitary Soldier、Fantasy Knight、Sci-Fi Alienの3つが存在します。すべて49ドルです。

Militaryは迷彩服関連のスマートマテリアル中心のパックで、迷彩服以外ではボタンとリボンを生成するツールがあります。

イマイチ面白みには欠けますが、軍隊系のゲームを作りたいのであれば重宝するはずです。

Knightは中世の騎士の装備に関するパックで、6つの武器・防具メッシュと金属に穴や切り傷を与えるツールが便利そうです。

金属系のマテリアルが中心ですが、一部布関係も存在します。

AlienMass Effectにでも出てきそうな人型異星人VelaさんのFBXメッシュが付属したSF系パックです。

異星人の肌のマテリアルや未来的な金属っぽいような布っぽいような服、赤・青・緑の血を表現したツールが付属しています。

Knightと迷ったのですが、今回はこちらを頂きました。

ちなみに、Velaさんは追加のテクスチャ(AOとか)も付属していますが、骨は入っていません。

実際にゲームで使いたい場合は自分で骨を入れる必要があります。

ポリゴン数は10.4万トライアングル。今時なら標準的でしょうかね?

で、今回の記事はこのパックに含まれるSciFi Shape Makerの使い方についてです。

・SciFi Shape Makerとは?

SciFi Shape MakerはSF系のマシンや装備によくあるベンチレーション、ネジなどの各種形状を比較的簡単に作成する事ができるツールです。

もちろんポリゴンではなくテクスチャとして作成します。

どういうものなのかは実際の画像を見てもらう方がわかりやすいと思いますが、こんな感じのやつです。

sp104.jpg

これ、全部テクスチャです。モデリングされているわけではありません。

特に斜めにボルトが打ち付けてあるような下のやつはパッと見、テクスチャには見えませんよね。

SciFi Shape Makerはこのようなちょっとした小物を簡単に追加できるのが魅力です。

もちろん、モデリングが可能であればそちらの方が良いでしょう。

また、ハイポリモデルに作成しておいてベイクする方法も有効です。

しかし、作ってしまったモデルにちょっとアクセントとしてネジを打っておきたい、などの場合には重宝する機能でしょう。

・SciFi Shape Maker単体での使用

SciFi Shape Makerを単体で使用する場合は簡単です。

金属もののマテリアルを設定したオブジェクトを用意し、レイヤーを1つ作成、シェルフの[Tools]タブから[SciFi Shape Maker]を選択するだけです。

sp105.jpg

このツールで追加できるのは基本的にHeightのみです。BaseColorなどは設定できるようになっていません。

そのため、単体で使用するとベースとなるマテリアルのBaseColor、ラフネス、メタリックが使用されます。

例えば木のマテリアルに適用するとこんな感じになります。

sp106.jpg

Height以外としてはAOも描き込みができますが、AOチャンネルを追加してもあまり効果は高くない印象です。

この方法の欠点はネジなどの形状に応じて汚したりすることが出来ない点です。

しかし、以下の方法を使うことである程度の汚れを付加することが出来るようになります。

・SciFi Shape Filterと一緒に使う

SciFi Shape FilterはSciFi Shape Makerと一緒に使うこと前提のフィルタで、それ以外のツールと組み合わせてもあまり意味はありません。

このフィルタはSciFi Shape Makerで書き込まれた情報を元にしてある種のフィルタリングを行ってくれるもので、これを利用することで汚れや、ネジ部分のマテリアルだけ変更、といった処理を行います。

ただし普通にフィルタを追加しただけではうまくいきません。追加のチャンネルとしてUser0チャンネルが必要となります。

このMoodpackには説明書的なものは存在せず、とりあえず触ってみる、というだけでは何をどうすればいいのかわからないと思います。

幸い、ある場所に説明が少しだけありました。

それはウィンドウ下部のステータスバー。フィルタの一部パラメータをマウスオーバーするとここに情報が記述されていました。

sp107.jpg

エッジダメージを利用するにはUser0チャンネルとSciFiブラシツール(SciFi Shape Makerのこと)が必要と書かれています。

残念なことに、これだけではまだ情報が足りなかったりしますが、ここまでくれば察しのいい人はわかるかもしれません。

というわけでUser0チャンネルを追加します。

sp108.jpg

追加した段階ではUser0チャンネルのフォーマットはL32Fとなっているはずです。

実はこれではダメなので、RGB8に変更します。

sp109.jpg

あとは単体で使う時のようにレイヤーを追加し、ブラシをSciFi Shape Makerに変更、フィルタを追加してSciFi Shape Filterを設定しましょう。

sp110.jpg

これで準備は完了です。

とりあえず、現時点で何かを描いてみましょう。

わかりやすいところで、ベントとネジを描き込んでみます。

sp111.jpg

これだけでも結構いい感じですが、フィルタの本領はここから発揮されます。

SciFi Shape Filterを選択し、プロパティを見てみましょう。

幾つかのカテゴリの中に[Vent material]と[Screws and bolts material]というカテゴリがあります。

これを開いてみます。

sp112.jpg

それぞれ[Material]、[Roughness]、[Glossiness]、[Metallic]の4つがあります。

ラフネスとメタリックのシェーダを使っている場合、[Glossiness]は無意味になりますので無視しますが、他のパラメータをとりあえず変更してみましょう。

ベントのマテリアルを[Gold]に、ネジのマテリアルを[Copper]にしてみます。

sp113.jpg

見ての通り、ベント部分が金に、ボルト部分が銅に変更されました。

SciFi Shape MakerはUser0チャンネルにフィルタリング時に必要な情報を書き込むため、フォーマットがRGBでなければいけないのです。

[Weathered edge material]の項目はエッジ部分のダメージ表現で、ダメージを受けて内側が見えるという状態を示します。

設定されるマテリアルは内側の金属マテリアルですね。

[Wear Level]を0にするとエッジダメージは完全に消えます。

エッジダメージの有無を比較するとこんな感じ。

sp114.jpg

上がダメージ無し、下が有りです。

ベースのマテリアルがこのようなペイントされた金属であると効果は絶大ですね。

[Dirt material]カテゴリは埃による汚れを表現することが出来ます。

AOの暗い部分、つまり窪みになっている部分に汚れが溜まりやすくなっています。

sp115.jpg

[Technical parameters]カテゴリのAOイコライザを調整することでベントの奥の部分は汚れているけど網の部分はそうでもない、というような表現も可能です。

sp116.jpg

上の画像と見比べると違いがわかりますね。

このツールで作成できる形状はかなり多いので、ちょっとした装飾に使用するならかなり重宝するツールだと思います。

もしこのMoodpackを手に入れるようなことがあったら、色々試してみてください。

Substance Painter 2.0の新機能紹介

つい先週、Substance Painterのメジャーバージョンアップが行われました。

こちらにAllegorithmic公式の新機能紹介動画がありますので、英語がわかる方はこちらを見ていただくのが早いでしょう。

https://www.youtube.com/watch?v=vVzISplKUzk&list=PLB0wXHrWAmCzkaCwt_dE6YS8ifttRTqNS

英語なので、簡単に日本語にまとめたものをここに記述していきます。

まずはビューポート周りのアップデートから。

これまではF1キーで3D/2Dビューポート、F2キーで3Dビューポートのみ、F3キーで2Dビューポートのみに変更ができました。

SP2.0ではこれに加え、F4キーでIrayレンダリングビューポートへの切り替えが可能になりました。

こちらはペイントは出来ませんが、Undo/Redo機能は使用できます。

IrayレンダリングはDCCツール上でのオフラインレンダリングの品質チェックに使用するのが主な目的となるでしょう。

 sp093.jpg

また、F5/F6キーで透視投影と正射影の切り替えができるようになりました。F5で透視投影、F6で正射影です。

正射影の方がペイントしやすい場面もあるかとは思いますが、品質チェックは透視投影でやるようにしましょう。

下の画像は同じカメラから撮影したもので、左が透視投影、右が正射影です。

sp094.jpg

 

Tabキーを押すと現在のビューポートがウィンドウいっぱいに表示され、ブラシなどのUIが隠されます。

もう一度Tabキーを押せば元に戻せます。

広い画面でペイントをしたい場合に重宝しますね。

次はCloneブラシとSmudgeブラシです。

これはSP2.0で追加された特殊なブラシで、Cloneブラシは特定の場所をクローニングするもので、Smudgeは指で擦ったような影響を与えるブラシです。

この2つのブラシもSubstanceらしい非破壊性を持っているので使い方によっては重宝するはずです。

まずはCloneブラシの紹介と使い方から。

Cloneブラシは[Clone Tool]ボタンを押して有効にします。数字キーの[6]にショートカットが割り当てられていますので、こちらでもOKです。

sp095.jpg

有効にする前に適当なレイヤーに模様を書いておきましょう。

Cloneブラシを有効にしたら[V]キーを押しながら書いた模様の適当な位置を左クリックしてください。

四角い枠が出てくるのですが、これがクローンの元の位置になります。

sp096.jpg

クローン元の位置を設定したらクローン先の位置をブラシで塗り始めます。

すると簡単にクローン出来ます。めでたしめでたし。

sp097.jpg 

まあ、待って。これだとただコピーしただけで非破壊性もあったもんじゃありません。

より良い使い方は別のレイヤーを利用する方法です。

模様が書かれた[レイヤ1]の上に新しい[レイヤ2]を追加します。

この状態では[レイヤ2]には何も描かれていないため、クローニングが出来ません。

そこで、必要なチャンネルをパススルーします。

少々面倒ですが、クローニングするチャンネルのブレンドをすべて[Passthrough]に変更します。

sp098.jpg

この状態で[レイヤ2]に対して先ほどと同じようにCloneブラシを使用しましょう。

結果は変わらないはずですが、データ構造的には変わっています。

[レイヤ2]を削除すればクローンした分は削除されます。当たり前ですが。

面白いのは[レイヤ1]のクローン部分を変更した場合です。クローン元部分になにか描き込んでみましょう。

sp099.jpg

このようにクローン先にも同じ映像が出てきました。

Fillレイヤーを元にしたクローンの場合は色も簡単に変更できますが、これももちろんクローン先の色も変更されます。

逆に、クローン先だけ色を変えたい、とかは出来ないみたいです。この場合は別の方法を用いる必要がありそうですね。

Smudgeブラシは指で擦ったような影響を与える特殊なブラシです。

指のマークのアイコンをクリックするか、数字キー[5]で有効にできます。

sp101.jpg

有効にしたら擦りたいところを擦るだけですが、このブラシもCloneブラシと同様の方法で元画像を変更せずに効果を与えることが出来ます。

すべてのチャンネルを[Passthrough]に設定するのは面倒ですが、効果は絶大なので是非活用しましょう。

もちろん、クローニング先をSmudgeして、クローン元を変更するというのも可能です。

sp100.jpg

Allegorithmicの動画ではテクスチャ境界などでラインが入ってしまっている部分をCloneブラシで綺麗に埋める方法も紹介していますので、是非チェックしてみてください。

次はマスクに関する追加機能です。

SP1.0にもスマートマテリアルという、幾つかのレイヤーを組み合わせたテンプレート的なマテリアルが存在しました。

SP2.0ではこれと似たようなものとしてスマートマスクというものが追加されています。

このマスクは複数レイヤーではなく、複数のエフェクトを施したマスクをテンプレート的に保存しておくことが可能です。

作成したマスクをスマートマスクとして保存したい場合はレイヤーのマスクを右クリックし、[Create smart mask]を選択しましょう。

sp102.jpg

作成されたマスクはShelfに[new_mask]という名前で追加されるので、リネームするなりして保存しておきましょう。

あと、これはSP1.0にもあった機能なのですが、レイヤーのマスクをAltキーを押しながらクリックするとビューポートがマスクモードとなり、マスクのグレースケール表示になります。便利なので活用しましょう。

SP2.0ではSP1.0にあった[MG Mask Builder]というマスクジェネレータとは別に、[MG Mask Editor]というものが追加されています。

こちらはBuilderより簡単な設定でわかりやすくなっているような印象ですが、何がどう違うのかははっきりと言いづらいですね。

設定が簡単、というのも使ってみた感想なので…

入力となるテクスチャはベイクされたテクスチャ(ポジションバッファなど)なのですが、それ以外のテクスチャやプロシージャルテクスチャ、マテリアルなんかも設定できます。

これらの影響度なども設定できますが、Builderもできるんですよね…

まあ、でも、Builderよりいじりやすいのは確かなので、これを使っていい感じのスマートマスクが作成できたらどんどん公開してもいいのよ?

さて、最後になりましたが、Finishフィルタについて簡単に説明しましょう。

Finishフィルタは名前の通りフィルタの一種ですが、現在は主に金属系マテリアルの最終調整用として設定することが出来ます。

金属のヘアライン加工や板金っぽさを後付することが出来ます。

使い方は簡単で、加工したい金属マテリアルを選択、[Add filter]でフィルタを追加し、フィルタとして[Finish ~]を選択するだけです。

例えば、プレートメイル的なハンマーで打たれた加工をする[Finish Hammered]だとこうなります。

sp103.jpg

現状ではFinishフィルタは金属のみ、8種類程度ですが、今後増えていくかもしれません。期待しましょう。

Finishフィルタを使用する場合の注意としてですが、Normalチャンネルは追加しておきましょう。

SP2.0からNormalチャンネルはMetalRoughテンプレートではデフォルトで追加されるようになりましたが、AlphaTestテンプレートでは追加されません。

このチャンネルがないとどうやら正常に設定されないようなので、全く効果ないぞ?と困ることになると思います。

というか、なりましたw

というわけでSP2.0の新機能について紹介しましたが、Irayについてはほとんど端折りました。

一応Irayの設定方法なども紹介したAllegorithmic公式チャンネルに存在するので、気になる人はチェックしてみてください。

全体的にSP1.0~1.7のバージョンアップがすごすぎて、2.0になったのにそんなに大きく変わってる気分はないのですが、それでも追加された各種機能は大変便利です。

SPを活用している方でも、これから勉強する方でもバージョンアップしておいて損はないと思います。