みなさんはNature of codeという書籍をご存知ですか?
こちらはHoudiniの本ではないのですが、自然現象をプログラムで再現するための多くのコードとその説明が載っています。発売は2014年ですが、現在も参考になるものが非常に多く掲載されています。
プロシージャルで何かやりたいと思ったときに、パラパラとみてみると面白いと思います。
その中で今回は渦巻を作ってみたいと思います。
参照にしたのはChapter 3です。この章では三角法に関して説明があります。
その前のベクトルに関しては、Chapter1に説明されているのでぜひご一読ください。
角度を計算する、2点間の距離を求める、円、弧、線分を処理するには、三角法の基本を理解しておくと便利です。
上記からベクトルを基にして直角を作る方法がわかります。
ベクトルの矢印が三角形の斜辺(v)、ベクトルの成分(xとy)が辺となります。
三角法の基礎を復習したら、次に座標です。
- デカルト座標 : X座標とY座標で構成
- 極座標 : ベクトルの大きさ(長さ)と方向(角度)
ギリシャ文字θ(シータ)は、角度を表す記号としてよく使用されます。極座標は(r,θ)で表されるので、角度を参照する変数名をthetaとします。
sin(theta) = y / r → y = r * sin(theta)
cos(theta) = x / r → x = r * cos(theta)
円弧に沿って、何かを配置したり、動かしたい場合に極座標を使用すると簡単に行うことができます。
Houdiniで再現してみます。
Attribute Wrangleノードを作成します。
Run OverをDetailにします。
#include "math.h"
float r = 75 ;
float theta = 0 ;
int point = 500 ;
vector pos ;
for (int i=0; i<point; ++i) {
pos.x = r * cos(theta);
pos.y= 0 ;
pos.z = r * sin(theta);
addpoint(0, pos);
theta += 2 * PI / 500 ;
}
この例では半径を75、ポイントを500個作成しています。それを円弧にそって配置していきます。そのため、ポイントを配置するための角度を計算する必要があります。しかし、このような三角関数で使用する角度はラジアンである必要があります。
度数という概念はみなさんにも慣れ親しんでいると思います。1回転は0度から360度まで1周することです。
ラジアンは円の半径と円の弧の長さの比率よって定義される角度の単位です。1ラジアンは、半径と弧の長さの比率が1である角度です。180度 = 1ラジアン、360度 = 2*PIラジアンです。
度数からラジアンに変換する式は以下となります。
ラジアン = 2 * PI * (度数 / 360)
今回は360度必要なので、360 / 360 は1.0ということで省略しています。
360度1周をポイントで割った値で配置する場所を指定することができます。
この結果は以下のようになります。
次に渦巻にしていきましょう。
#include "math.h"
float r = 0 ;
float theta = 0 ;
int point = 1000 ;
vector pos ;
for (int i=0; i<point; ++i) {
pos.x = r * cos(theta);
pos.y= 0 ;
pos.z = r * sin(theta);
addpoint(0, pos);
theta += 2*PI / 500;
r += 2*PI / 500;
}
開始の半径は0にします。 そして、半径を増やしていきます。結果は以下のようになります。
ポイントを10000に増やすと、きれいな渦巻ができました。
あとはポイント数、半径、必要があれば高さを変数としてコントロールできるようになれば完成です。
知っていればすぐにできることも、その知識がないととても遠回りしてしまいますよね!
ということでNature of Codeお勧めです!
ちなみにこちらはさらに発展させてフィボナッチ数で作った渦巻です。
どのような絵が作りたいのかによって、どちらの結果が欲しいのか変わってきますね。
Nature of Codeは、Houdiniの本ではないため、文法が異なります。
VEXをより勉強するには「理論と実践で学ぶHoudini -SOP&VEX編-」をお忘れなく!