もんしょの巣穴blog

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

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

今回紹介するのは入力画像の特定条件にあるピクセルにのみ指定パターンを表示する方法です。
[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] の関数に対してはイメージのサンプリングが出来ないようです。
何か見落としてうまくいっていないだけなのかもしれませんが、私が試した際にはうまくいきませんでした。
注意しましょう。
スポンサーサイト
  1. 2016/07/18(月) 01:04:06|
  2. Substance Designer
  3. | トラックバック:0
  4. | コメント:1

[UE4] 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) を作成し、これによって各半透明カラーの影響度を求める、というのがこの技術です。

弱点としてはあくまでも各カラー単体でのブレンドウェイトしか求められないため、前後関係などを正確に表現できるというわけではない点です。
そのため、画像処理ソフトで求められたブレンドの結果はこの技術で再現することはほぼ不可能です。
また、ウェイト関数によってはカメラの移動に対して結果が安定しません。
安定させようとすると今度は小さな距離の差がほとんど無視される結果になります。
入れ子構造の半透明ではまともな結果が得られないでしょう。

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

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

[[UE4] Weighted Blended OITの実装]の続きを読む
  1. 2016/06/11(土) 12:42:57|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[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
次のページ

プロフィール

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

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。