cg memo

備忘録をまとめるブログ

Procedural Random Agate - breakdown

Allegorithmic の Materialize というコンテストに応募したアセットについて、おこなったアプローチを紹介します。


リファレンス

今回作成したのは、アゲート(メノウ)という鉱石です。
カラーバンドの形状や、水晶の色に無限のバリエーションがあるので、ランダムシードのみでプロシージャル生成を楽しめるようにしました。

Agate - Smithsonian Institution
f:id:satyk:20171128000650j:plain:w300

グラフ

全体の構成は下図のようになっています。特徴的なノードや構成を紹介していきます。

f:id:satyk:20171128003856j:plain:w1000

回転だけをexposeする

f:id:satyk:20171128231940j:plain:w300

この [Transformation 2D] ノードで、後から使用する法線マップを回転させます。
ただ、 [Transformation 2D] ノードの [Transform matrix] をそのままexpose(パラメータ露出)してしまうと、4つの数字で調整する、アーティストにはなじみの無いパラメータになってしまいます。
そこで、回転の値だけを持つ Variables(変数)を、自分で作成して使います。

f:id:satyk:20171128233249j:plain:w300

エクスプローラーのグラフ部分か、グラフ内の何もないところでダブルクリックすると、このグラフ全体のパラメータやアトリビュートを確認することができます。
既にexposeしたパラメータがあれば、[Input Parameters] のところにリストアップされます。
新しく Variables を作成する際も、ここで[+]ボタンを押して作成します。
作成した Variables は、exposeした パラメータと同様に、sbsar になっても調整可能なパラメータになります。

f:id:satyk:20171128233911j:plain:w300

今回はデフォルトの [Float1] の数字を使います。[Identifier] (識別子)の部分に自由に名前をつけます。(このケースでは「rotate_distotion」とつけました)

次に、先ほどの [Transformation 2D] ノードに戻り、 [Transform matrix] に自作の関数を作成します。

f:id:satyk:20171128235249j:plain:w300

[Empty Function] を選択して、 [Transform matrix] を空にします。[Edit] で空の関数グラフに入り、自分で式を組んでいきます。
最初は空ですが、下図のようにしていきます。

f:id:satyk:20171128235918j:plain:w300

「Get Float] ノードを作成し、どの値をゲットするのか指定するため、先ほど作成した Variables をプルダウンから選びます。(このケースでは「rotate_distotion」)

f:id:satyk:20171128235933j:plain:w300

次に、[Rotation Matrix] ノードを作成して、繋ぎます。最初は黄色くありません。
このノードを右クリックし、画像ではちょっと見づらいですが、[Set as Output Node] を選ぶと、ノードが黄色くなり、このノードが関数の出力となります。
関数を作成した場合は、必ずどこかのノードを [Set as Output Node] にしないと、何も結果が返されないので、忘れないようにします。

f:id:satyk:20171129000712j:plain:w300

関数グラフから出て通常のグラフに戻る方法ですが、グラフ上部にタブが出来ているので、これを切り替えて戻ります。
(つい Uキー を押してしまいますが…)
以上で、回転だけのexposeができました。

f:id:satyk:20171129001044j:plain:w300

スケールだけをexposeする

このアセットでは、グラフの最後でスケールをかけ、それを expose しています。続いてそちらを紹介します。

f:id:satyk:20171129001927j:plain:w150

さきほどの回転値と同様に、スケールを表す Variables を先に作成します。
ここでは、下限を1.0、上限を2.0とする [Flort1] にしました。1倍~2倍の範囲で調整できるというイメージです。
スケール調整用の [Transformation 2D] ノードにおいて、同じように [Transform matrix] に空の関数を作成します。

f:id:satyk:20171129002909j:plain:w400

パーセンテージに対する調整になるので、Variables に 100 を掛けています。Variables が 1.5 の場合は、結果は150%になります。
出力ノードである [Scale Matrix] ノードは、XのスケールとYのスケールを要求しますので、このノードの入力は Float2 になっています。
[Vector Float 2] ノードを作成し、ここにVariables の影響をうけたXの値とYの値を入れるのですが、今回は均等スケールで良かったので、同じものを入力しました。

最後に [Scale Matrix] ノードを右クリックから [Set as Output Node] にしたら完了です。

Vector Morph

f:id:satyk:20171129020110j:plain:w300

新機能の [Vector Morph] ノードです。
ゆるめのノイズを適用することで、[Shape] の Cone にソリッドな歪みが加わりました。他にもいろいろな工夫が楽しめそうです。

Histogram Select でカーブを作成する

f:id:satyk:20171129005240j:plain:w400

[Vector Morph] の結果をマスク化して、わずかに [Blur] ノード(もしくは [Distance] ノード)でグラデーションを作り、
新機能の [Histogram Select] でグラデの部分だけ拾えば、カーブが取り出せます。

Tile Sampler

f:id:satyk:20171129010300j:plain:w300

さきほど取り出したカーブをマスクとして、Shapeを配置しています。
カーブ上に直接Shapeを散布したいと思いましたが、そういった方法は見つけられませんでした。
この手法では、グリッド上に大量に並べられたShapeのうち、カーブのマスク部分に重なっているShapeだけがピックアップされているイメージです。
Shapeはカーブの幅よりもサイズが大きく、ランダムでもあるので、このトリックはそれほど目立ちません。

Gradient Map

f:id:satyk:20171129011126j:plain:w300

Substance のグラデーションマップは最高に使いやすいです。Photoshopはこの点をもう少し頑張ってほしいと思います。
このカラーバンドもプロシージャル生成することも考えましたが、コストの割には感動が少なそうだったのでオミットにしました。

Random Color

f:id:satyk:20171129011455j:plain:w150

中央のカラーバンドと、鉱石外部に近いカラーバンドは、ランダムで毎回違う色になるようにしました。
この [Uniform Color] の [Output Color] にも、関数を作成します。

f:id:satyk:20171129011756j:plain:w300

ランダムな色を作るには、基本は下図のようになります。

f:id:satyk:20171129011955j:plain:w400

カラーを決めるには、R,G,B,A,の4つの値が必要になります。Alpha はひとまず 1.0(255)だとして、残り3つの数字にランダム関数を使います。
ランダム関数は、リファレンスには「0~Aの間の数」と書かれています。(https://support.allegorithmic.com/documentation/display/SDDOC/Function++nodes+recap
「A」はどうやって指定するのかを調べたところ、どうやら [Random] ノードのインプットが「A」にあたるようでした。
この場合、0~1の間でランダム値を出してほしいので、1 をインプットに繋ぎました。

グラフ内でランダムシードを意図的に変更するには、以下のパラメータを動かします。

f:id:satyk:20171129013549j:plain:w300

これで、ランダムな色ができました。

f:id:satyk:20171129014155j:plain:w300

ここで注意が必要なのですが、R,G,Bの値を完全にランダムにすると、場合によっては[1,1,1,]などの目が出て、色が白飛びしてしまいます。
また、R,G,Bの各値が近いものでそろってしまうと(0.5,0.5,0.5など)、グレーになるので彩度が下がってしまいます。
私のアセットでは、特定の色味が出やすいように、さらに手を加えています。

f:id:satyk:20171129014315j:plain

少し力技なので美しくないですが、赤を強くしたかったので、それ以外の色については[If...Else] ノードを使って、0.5よりも〇〇だった場合は…という形で調整しています。


以上になります。ありがとうございました。