/**/

チュートリアル 50:
手続き的テクスチャリングとモデリング

このチュートリアルでは、テクスチャ、および何らかの幾何学的なデータの手続き型モデルを構築するために使用することができる、様々な操作を調べていきます。

手続き的なテクニックは、アルゴリズムや数学関数によってコンピュータが生成するモデルのあらゆる状況を定義するパワフルな手段となります。静止画や写真などのような既存のデータを使用することとは対照的に、手続き型モデルでは、任意の決定方法と無限のヴァリエーションによって、ビジュアルな複雑性を生じさせることができます。パラメータのコントロールとあわせて、このようなモデルは、複雑な動作をコントロールしたり、特殊な効果を取り入れたりするための柔軟なインターフェイスの構築に使用することができます。

Jitter は、広範囲にわたる、基本的な関数やジェネレータのセットを提供しますが、これは jit.bfg オブジェクトを介して用いることができます。各々の関数は、各点ごとの操作を n 次元の空間で行ないますが、それぞれの次元での関数の評価は、隣接した次元の結果とは独立に行なわれます。このことは、これらの操作が、任意の次元数で、任意の座標で行なうことができ、それが実行済みの計算を参照する必要性を持たないということを意味します。加えて、これらは共通のインターフェイスを持つため、複数の jit.bfgオブジェクトを相互に参照し合うことによって、これらのオブジェクトを結合させることができ、関数グラフを評価することができます。

関数にはいくつかのカテゴリがあり、それぞれに異なった用途によって特徴づけられています。カテゴリとして、フラクタル、ノイズ、フィルタ、伝達関数、および距離演算があります。これらのフォルダに含まれる関数は、その名前で jit.bfg に渡されます。この名前は完全な記法(カテゴリ.クラス名 : category.classname)、あるいは、省略した形(クラス名のみ : classname)のどちらを使用してもかまいません。

これらのカテゴリを詳しく見る前に、まず jit.bfg の全体的なインターフェイスを調べ、様々なタイプの手続き的関数が作られる方法や、その結果として jit.matrix に値を満たす方法について調べてみましょう。

jit.bfg オブジェクト

・Jitter Tutorial フォルダの中のチュートリアルパッチ、50jProcedural.pat を開いて下さい。

パッチをロードしたら、そこで使われている様々なオブジェクトを見て下さい。jit.bfg オブジェクトに metro オブジェクトが接続されているのに注目して下さい。アクティベートされると、bang メッセージは、多くの他のオブジェクトと同じように、jit.bfg オブジェクトに対し式の評価をし、Jitter マトリックスを出力するように通告します。この例では、jit.bfg は1つのプレーンを持ち、float32型で 128 x 128 の大きさのマトリックスを生成するよう設定されています。

metroオブジェクトに接続された toggle ボックスをクリックし、jit.bfgに bangメッセージの送信を開始させて下さい。

jit.pwindowオブジェクトが黒一色のままであることに注目してください! jit.bfgは、どの基底関数を評価するかをまだ命じられていないため、マトリックスを出力せず、jit.pwindow も変更されていません。

ubumenuオブジェクトのリストから、noise.cellという基底関数を選択して下さい。


評価された基底関数

jit.bfg はこれで評価する関数を与えられ、jit.pwindow でその演算結果を見ることができます。内部的には、jit.bfg は評価している間、指示された基底関数に渡す一連のデカルト座標を生成し続けます。必要であれば、この座標を調整することによって、jit.bfg に違う領域で評価を実行させることができます。

scale メッセージボックスに接続されたナンバーボックスの値を変更して下さい。

領域を変更するに従って、jit.bfg の出力する結果が変わる点に注目して下さい。

ubumenuオブジェクトのリストから distance.euclideanという基底関数を選んで下さい。

scaleメッセージボックスに接続されたナンバーボックスの値を再び変更して下さい。

scale のナンバーボックスの正の値が jit.pwindow に表示される結果にほとんど影響を与えないのに対し、負の値が表示される画像を白から黒に反転させる点に注意して下さい。何が起こっているのでしょうか?距離は常に正でなければならず、原点から外側に増加しているはず、そうでしょうか?

jit.normalize オブジェクト

jit.bfg の出力は、jit.pwindow に接続された jit.normalize オブジェクトに入力されます。このオブジェクトは入力されたマトリックスを調べ、その最小値と最大値が0 - 1. のノーマライズ(正規化)された範囲に収まるようにスケールします。

jit.bfgdistance. euclidean 関数を評価するために送信される scale の値を、正の値から負の値に変更した場合、jit.bfg から出力される最大値と最小値は、原点を通過すると入れ替わります。jit.normalize は常に入力マトリックスの最大値が1、最小値が0になるようにスケールするため、表示される色は反転します。

jit.bfg の出力範囲は、結果として非常に大きな値になってしまう可能性があるため、特にフラクタルのような非有界関数を評価する場合には、その結果を表示用にマップするために、あらかじめ出力をノーマライズしておく必要があります。

基底のカテゴリ

これまでで、jit.bfg をセットアップするための基本的なインターフェイスや評価する基底関数の指定について理解できたことと思います。これから、個々の関数カテゴリの内容について調べてみましょう。

距離関数(Distance

distance カテゴリの関数は、それぞれ、与えられた点とグローバル座標の原点との位置の差を決定するために、個別な計算基準を定義します。

下記のリストでは、これらの関数各々について説明しています。

chebychev: 2点の差の絶対最大値(チェビシェフ距離)。
(Absolute maximum difference between two points.)

euclidean: ユークリッド空間での、実際の直線距離。
(True straight line distance in Euclidean space.)

euclidean.squared: ユークリッド空間の距離の2乗。
(Squared Euclidean distance.)

manhattan: 直交する軸に沿う方向で測られる直線の距離(マンハッタン距離)。
(Rectilinear distance measured along axes at right angles.)

minkovsky: べき乗距離(ミンコフスキー距離)。
(Exponentially controlled distance.)

noise.voronoi オブジェクトでは、その評価の一部として、これらの distanceオブジェクトのうちの1つを指定する必要があります。

フィルタ関数(Fillter

filter カテゴリには、シグナル処理フィルタが含まれます。これらは画像のサンプリングと復元、あるいは一般的なコンボリューション(畳み込み演算)のための事前演算カーネルの作成を実行するために使用できます。

下記のリストでは、これらの関数各々について説明しています。

box: フィルタ範囲の全てのサンプルに等しい重みを加算します。
(Sums all samples in the filter area with equal weight.)

gaussian: フィルタ領域のサンプルにベル状のカーブによる重み付けを行ないます。
(Weights samples in the filter area using a bell curve.)

lanczossinc: 急峻な窓関数を適用されたサインカーブを使って重み付けを行ないます。
(Weights samples using a steep windowed sinc curve.)

mitchell: 制御可能な3次式を使ってサンプルに重み付けを行ないます。
(Weights samples using a controllable cubic polynomial.)

disk: フィルタの半径内のすべてのサンプルに同じ重みを加算します。
(Sums all samples inside the filter's radius with equal weight.)

sinc: 窓関数を適用しないサインカーブを使ってサンプルに重み付けを行ないます。
(Weights samples using an un-windowed sinc curve.)

catmullrom: Catmull-Rom 3次式を使ってサンプルに重み付けを行ないます。
(Weights samples using a Catmull-Rom cubic polynomial.)

bessel: 線形位相特性によってサンプルに重み付けを行ないます。
(Weights samples with a linear phase response.)

triangle: フィルタ領域にピラミッド型を使い、サンプルに重み付けを行ないます。
(Weights samples in the filter area using a pyramid.)

これらのオブジェクトは、noise.value.convolution および noise.sparse.covolution の2つのオブジェクトのパラメータとして使われます。この2つのオブジェクトは、評価の一部として fillter オブジェクトを与えられることを前提としています。

伝達関数(Transfer)

入力を様々な出力にマップする関数は、transfer カテゴリに含まれます。これらの関数のほとんどは、1次元で、ユニット区間 0 〜 1.内でのみ作用します。

下記のリストでは、これらの関数についての簡単な説明を行なっています。

step:値が閾値より小さい場合、常に 1 になります。
(Always 1 if given value is less than threshold.)

smoothstep: Step 境界上で3乗によるスムージング(平滑化)を行なう関数
(Step function with cubic smoothing at boundaries.)

bias: ガンマ(Γ)と同様な式ですが、ユニット区間に再マップされています。
(Polynomial similar to gamma but remapped to unit interval.)

cubic: 係数の制御が可能な一般の3次多項式
(Generic 3rd order polynomial with controllable coefficients.)

saw: 周期的な三角波パルス列
(Periodic triangle pulse train.)

quintic:係数の制御が可能な一般の5次多項式
(Generic 5th order polynomial with controllable coefficients.)

gain: ユニット区間内で評価されるS型多項式。注:初期設定による結果ではS型曲線ではなく、線形曲線になっています。
(S-Shaped polynomial evaluated inside unit interval. Note: the default settings will result in a linear curve instead of the descriptive S-curve shape.).

pulse: 周期的なステップ関数
(Periodic step function.)

smoothpulse: 境界領域で3乗によるスムージング(平滑化)が行なわれる周期的なステップ関数
(Periodic step function with cubic smoothing at boundaries.)

sine: 周期的なサインカーブ
(Periodic sinusoidal curve.)

linear:ユニット区間を横切る線形関数。

solarize:閾値を超えた場合に与えらえる値をスケールします。

これらのtransfer(伝達)関数は、いくつかの noise オブジェクトの中で使用され、スムージング(平滑化)関数の変更や、その出力を変える働きを持ちます。

ノイズ関数(Noise

決定論的な確率パターン(別名、疑似乱数コヒーレント雑音関数)は、ほとんど全ての手続きモデルの基礎となるものです。これらは、視覚的な詳細を追加することによって、制御可能な複雑さの総体を作り出すことを可能します。

下記のリストでは、これらの関数についての簡単な説明を行なっています。

cellnoise: コヒーレント・ブロックノイズ。
(Coherent blocky noise.)

checker: 周期的なチェッカー状の正方形
(Periodic checker squares.)

value.cubicspline: 多項式によってスムージング(平滑化)された疑似乱数の値。
(Polynomial smoothed pseudo-random values.)

value.convolution: コンボリューション(畳み込み)フィルタを施された疑似乱数の値
(Convolution filtered pseudo-random values.)

sparse.convolution: コンボリューションフィルタを施された疑似乱数機能点
(Convolution filtered pseudo-random feature points.)

gradient: 方向による重み付けをされ、多項式による補間が行なわれた値
(Directionally weighted polynomially interpolated values)

simplex: 単純な重み付けをされた疑似乱数の値
(Simplex weighted pseudo-random values.)

voronoi: 距離による重み付けをされた疑似乱数機能点
(Distance weighted pseudo-random feature points)

distorted: 領域を歪めらえたノイズの組み合わせ。
(Domain distorted combinational noise.)

フラクタル関数(Fractal

fractal(フラクタル)は、複数のスケールや、他の基底関数のオクターブの結合による、生成の特殊な形を提供します。この処理によって、すべてのフラクタルに見られる特徴的な自己相似性を作ります。

下記のリストでは、これらの関数についての簡単な説明を行なっています。

mono:全体的な類似度のスケーリングによる加法フラクタル
(Additive fractal with global simularity across scales.)

multi:様々な類似度のスケーリングによる乗法フラクタル。
(Multiplicative fractal with varying simularity across scales.)

multi.hybrid: 加法と乗法の複合型フラクタル
(A hybrid additive and multiplicative fractal.)

multi.hetero: 異種の乗法フラクタル。
(Heterogenous multiplicative fractal.)

multi.ridged: 隆線型の乗法フラクタル。
(Multiplicative fractal with sharp ridges.)

turbulence: 隆線型の加法モノフラクタル。
(Additive mono-fractal with sharp ridges.)

その他のアトリビュートとメッセージ

ubumenu から noise.checkerという基底関数を選択して下さい。

前に使用した scale メッセージに加え、回転(rotation)、平行移動(offset)、あるいは原点の移動(origin)などによって、評価される座標を変換することができる点に注目して下さい。

origin に接続された1番目と2番目のナンバーボックスを変更して、x および y の原点を変更して下さい。

offset に接続された1番目と2番目のナンバーボックスを変更して、x および y のオフセット位置を変更して下さい。

rotation に接続された1番目のナンバーボックスを変更して、x 軸に対する回転角を変更して下さい。

座標の変換による効果に注意して下さい。また、回転が行なわれた場合にパフォーマンスが低下し、それぞれのマトリックスの次元で rotation アトリビュートが 0 のままである場合に、常により良好なフレームレートが得られる点にも注意して下さい。

技術的な詳細:すでに述べた内部的な座標の生成に加え、jit.bfg は、評価の対象となる座標のマトリックスによる入力も受け入れます(XYZ はプレーン 0 - 2にマップされ、入力されるマトリックスは jit.bfg の出力マトリックスと同じサイズでなければなりません)。

rotation に接続された第1のナンバーボックスを 0 に変更して、回転を起こさないようにして下さい。

autocenter に接続された toggle ボックスをクリックし、自動センタリングを使用可にして下さい。

autosenter アトリビュートが 1 に設定された場合、出力マトリックスの中心に原点を置くために、現在のマトリックスの dim サイズが使用され、すでに原点として設定されている値を上書きします。

autocenter に接続されている toggle ボックスを再びクリックして、自動センタリングを解除して下さい。

ubumenu オブジェクトから noise.gradient という基底関数を選択して下さい。

dim 128 128 1 というメッセージボックスをクリックして下さい。

前に述べたように、Jitter が提供する全ての基底関数は任意の次元の数値を評価することができます。このメッセージは、出力マトリックスを 3D に変え、それに対応して、3次元空間で実行される関数評価をセットしました。ディスプレイは 2D スクリーンのままなので、3D における1つのスライスを評価する必要があるだけです。そのため、このように 3 番目の次元は 1 にセットしています。

offset に接続された3番目のナンバーボックスを変更し、z が評価される位置を変更して下さい。

どのように出力される結果が変化するかに注意して下さい。まるでスクリーンに沿って並べられた多くの画面を前進/後退するように、z 軸に沿って移動しています。

precision メッセージに接続された ubumenuから float64 を選択して下さい。

precision メッセージは、jit.bfg オブジェクトの内部的な評価の精度を変更するために使うことができます。これは、出力マトリックスの型を変更することなく、多少でも正確な値を必要とするような場合には、望ましい結果を生むでしょう。

offset に接続された3番目のナンバーボックスを変更して、z の評価の位置を変更して下さい。

高い精度が jit.fpsgui オブジェクトによって報告されるフレームレートにどのような影響を与えるがに注意して下さい。必要な場合にのみ float64 精度を使用するよう注意しなければなりません。

precision メッセージに接続された ubumenuから float32 を選んで下さい。

jit.bfgplanecontを 1 から 3 に変更して、RGB 出力ができるようにして下さい。

n次元の評価に加え、jit.bfg は、次元(ディメンション)ごとに 32 プレーンまでを生成することができます。個々のプレーンは、align アトリビュートによってコントロールされる疑似乱数の僅かな量によってオフセットされます。

jit.bfgalign に接続されたナンバーボックスを変更して下さい。

align の量が大きくなるにつれて、どのようにプレーンが分離し、それが目に見えるようになっていくかに注目して下さい。

・さらに、より具体的な、様々な基底関数の組み合わせの例を見るためには、jit.bfg オブジェクトのヘルプパッチを開き、個々の関数カテゴリのためのサブパッチの中を調べてみて下さい。

技術的な詳細:jit.bfg の出力は、実際に他の jit.bfg の入力として用いることによって、noise.distorted 演算子と同様な方法による領域のディストーションを実行することができます。jitexamples/other/jit.bfg.distorter.pat というサンプルパッチをチェックして下さい。

まとめ

jit.bfg オブジェクトは、手続き型の基底関数とジェネレータのライブラリへのアクセスを提供します。これを使って、テクスチャの生成やジオメトリの修正を行なうための手続き型モデルを定義することができます。jit.bfg は内部的に、グリッドに沿ったデカルト座標値を生成します。これらの座標値は、originoffsetrotation アトリビュートを使って対応する変換を行ったり、あるいは、評価される座標を持つ入力マトリックスによって完全に上書きすることもできます。