風など、普段は視覚的に見ることができないカの流れの1つに、磁力によ
って生まれる磁場があります。磁場とは、空間における各点において磁力
の大きさと向きを表すべクトル場のことで、通常はN極からS極へ流れる
線としてよく表現されます。磁場は、よく本などでは2次元で表琴されて
いるため、2次元の力場であると讙解されることもあります。しかし、実際
は3次元に存在していて、それを可視化するととても面白い形状を見るこ
とができます。
この章では、3次元に存在している磁場を可視化する方法を解説します。
\section*{Magnetic Fieldのアルゴリズム}
\section*{磁場と磁力線}
磁場とは、磁気の力がおよぶ空間のことを言います。磁場の大きさは通常ベクトルとして表現され、 その大きさと向きは磁気量 (1 W b) (ウェーバ)の (N) 極を置いたときに受ける力とその向きとして定義 されます。
このベクトルは、空間に置かれた磁極の大きさに応じて変化することになります。それぞれの磁極 は正か負の磁気量を持っていて、正の場合は (N) 極、負の場合は (S) 極となり、磁場は (N) 極から (S) 極に 流れるような形でベクトル場として形成されます。まずはよく見る例として、N 極と (\mathrm{S}) 極の 2 つの 磁極が空間に置かれている状況下で磁場を見てみましょう。
空間上の任意の点における磁場 (H) のベクトルの大きさは、磁極との距離に反比例します。つまり、点 が磁極から近ければ近いほどその磁極の影響を受けやすいということになります。また磁場 (H) のべ クトルの向きは、各磁極から点に向かう方向ベクトルに磁場 (H) の大きさを掛け、それを磁極分足し 合わせることで得ることができます。 (\mathrm{N}) 極(磁気量 (c_{2}=1) とした場合)から任意の点に向かうべクト ルを (v_{1} 、 \mathrm{~S}) 極(磁気量 (=-1) とした場合)から任意の点に向かうベクトルを (v_{2}) としたとき、磁場 (H) は 次のような式で表すことができます(ネ1)。
[
\begin{aligned}
& H=\frac{v_{1}}{\left|v_{1}\right|^{2}} c_{1}+\frac{v_{2}}{\left|v_{2}\right|^{2}} c_{2} \
& c_{1}=1 \
& c_{2}=-1
\end{aligned}
]
空間上に無数の点をプロットして、各点においてこの式を使って磁場 (H) を計算すると、次のような (\mathrm{N}) 極から (\mathrm{S}) 極に向かうようなべクトル場を得ることができます。
このベクトル場の流れから、次のような特徴を見ることができます。
流れは正極から負極に向かっている
流れが途中で途切れたり、急に始まったりしない
流れは交わったり枝分かれしたりしない
このような特徴を持ったものに磁力線と呼ばれるものがあり、たいていは次のような図で表現され ます。
では、磁極の数が2つより多いとき、また各磁極の磁気量が異なるときの磁場 (H) は、どのように計算できるでしょうか。例えば、次の図のような磁極が複数ある場合を見てみます。
この場合も、計算式自体は磁極が2つのときとあまり変わらず、次のように数列の足し合わせとし て考えることで磁場 (H) を求めることができます(*2)。
[
\begin{aligned}
& H=\frac{v_{1}}{\left|v_{1}\right|^{2}} c_{1}+\frac{v_{2}}{\left|v_{2}\right|^{2}} c_{2}+\frac{v_{3}}{\left|v_{3}\right|^{2}} c_{3}+\frac{v_{4}}{\left|v_{4}\right|^{2}} c_{4}+\cdots+\frac{v_{m}}{\left|v_{m}\right|^{2}} c_{m} \
& H=\sum_{n=1}^{m} \frac{v_{n}}{\left|v_{n}\right|^{2}} c_{n}
\end{aligned}
]
Houdini を使ったレシピでは、この計算式をベースに磁場を計算し、その情報を利用してビジュアル を生成したいと思います。
\section*{Magnetic Field のレシピ}
このレシピでは、プラスとマイナスにチャージされたポイントを複数空間に置くことで、磁場の流れと、空間上の磁力の分布を両方可視化したいと思います。アルゴリズムの項で説明した計算式を利用すれば、ボリュームの密度をプラスからマイナスにかけて層状に可視化することができます。
\section*{ネットワーク図}
メインパラメータ
\begin{tabular}{llrrl}
\hline 名前 & タイプ & 範囲 & デフォルト値 & 説明 \
\hline box_size & Float & (0-400) & 400 & 境界ボックスのサイズ \
\hline pt_num & Integer & (0-10) & 6 & チャージされたポイントの数 \
\hline spiral_step_size & Float & (0-100) & 30 & スパイラルのステップサイズ \
\hline spiral_step_angle & Float & (0-180) & 137.5 & スパイラルのステップ角度 \
\hline spiral_step_charge & Float & (0-1) & 2 & スパイラルのステップチャージ量 \
\hline charge_dist_ratio & Float & (0-1) & 0.1 & 距離に応じた影響チャージ量の係数 \
\hline vector_field_num & Float & (0-1000) & 200 & ベクトル場(磁場)のポイントの数 \
\hline layer_num & Integer & (0-50) & 20 & 可視化する磁カ層の数 \
\hline vector_field_rad & Float & (0-20) & 20 & ベクトル場(磁場)の半径 \
\hline
\end{tabular}
\section*{(1-1) 磁場と磁力の境界を作る}
まず、磁場と磁力が計算・描写される空間を立方体を使って作ります。
Boxノート Uniform Scale のパラメータに、先に登録したパラメータとリン クするためにエクスプレッションを設定します。また、作った立方体は「BASE」 という名前で作ったNull ノードにつなげておきます。
Uniform Scale: ch("…/CONTROLLER/box_size")
Boxノードのパラメータ
Transformノートこのノードでは、後ほど磁場と磁力の断面を切るために、今作ったボックスの Z軸に半分 のサイズのジオメトリを作り、ボックスを切り取れる位置に移動しておきます。また断面を切り取ったときに 境界の切り残しがないように、すべての軸に対してscale の値を原寸よりわずかに小さくしておきます。こち らのジオメトリは「HALF_BASE」という名前をつけたNull ノードにつなげておきます。
Translate(Z): $SIZEZ/2*ch(“sz”)
Transform ノードのパラメータ
\section*{1-2 磁場と磁力の境界を作る}
立方体を作ったら、そこからボリュームを作ります。今回のように空間 のすべての箇所において計算を行いたい場合は、ボリュームを使えば 計算が速く、便利な関数も用意されているので何かと便利です。
Volumeノート このノードを2つ配置し、それぞれのインプットに「BASE」 という名前の Null ノードのアウトプットをつなげて、それぞれのボリューム のパラメータを設定していきます。
1つ目のボリュームは磁力用に作ります。プラスやマイナスにチャージされ たポイントに影響された磁力の情報を格納するボリュームになるので、タイ プ (Rank) はScalar で、名前は「density」としておきます。
Volumeノード(density) のパラメータ
2つ目のボリュームは磁場用に作ります。磁場はプラス(N 極)からマイナス(S 極)へ向かう方向を示すも のなので、こちらのボリュームのタイプ (Rank) は「Vector」にしておき、名前は「vel」としておきます。
Volumeノード(vel) のパラメータ
細かく描写するためには解像度を比較的高めに設定しておく必要があります。なので、どちらの Volume / ードの Uniform Sampling Divs も 100 に設定しています。2つ目のVolumeノードは、Mergeノードでまとめ ておきます。
\section*{2-1 チャージされたポイントを作る}
次に、空間に磁場と磁力の層を発生させるために、プラスとマイナス にチャージされたポイントを作ります。マニュアルで好きな位置に配置するという方法も考えられますが、ここではプロシージャルに、プラ スとマイナスにチャージされたポイントを交互に任意の数だけスパイ ラル状に配置したいと思います。ここでは Attribute Wrangle を使って、必要なアトリビュートが格納されたポイントを 1 から作ります。
Attribute Wrangle ノート Run Over のパラメータを「Detail (only once)」にして、VEXコードを記述していき ます。
Attribute Wrangle ノードのパラメータ
まずはchf 関数で定義している変数をプロモートし、エクスプレッションでメインパラメータとリンクします。