🟠

第25回 Houdiniゆるゆる会備忘録

に公開

header

第25回Houdiniゆるゆる会」の振り返りと発表資料の紹介です。

https://houdini-teaparty.connpass.com/event/364583/

今月もマジ忙しかったですが、なんとか発表できました。いやあ、危険が危ない。では振り返りから行ってみましょう。

今回のお題

「自然」

今回のテーマは「自然」をテーマとしました。かなり幅が広いテーマなので、様々なアイデア・表現が集結しました。

僕の発表

今回僕は自然界にしばしば見られるフィボナッチ数列とそのあらわれであるフィボナッチスパイラルについて発表しました。

フィボナッチ数列の連続する2つの数を割ると黄金比に限りなく近づくという性質があり、単純にカタチとしても美しいですね。自己相似なので無限ズームが実現できるのも興味深いテーマです。

loop

フィボナッチ数列の実装

まずは簡単にVEXを用いてフィボナッチ数列をアトリビュートとして持つ点群を作成してみましょう。RunOverDetailです。

フィボナッチ数列

attribwrangle_fibonacci
int a = 0;
int b = 1;
int temp = 0;
int max = chi('max');
for (int i = 0; i < max; i++) {
  // printf('%d,',b);
  int pt = addpoint(0, 0);
  addpointattrib(0, 'pid', '');
  setpointattrib(0, 'pid', i, itoa(b));
  temp = b;
  b = a + temp;
  a = temp;
}

とくに難しいことはありませんね。数列をFontSOPに渡す部分はレガシーな仕組みですがCopy StampSOPを使用しています。

ちなみに多くのプログラム言語では変数動詞の値の入れ替えはtempなどの変数を用意して実行しますが、Pythonだともっとシンプルに書けますね。ここはPythonの美点のひとつかと思います。

python_fibonacci
a, b = 0, 1
while b < 150:
    print(b, end=' ')
    a, b = b, a+b

For-Eachでの実装

For-Each

上記フィボナッチ数列の実装を試したあと、先に作成した作例がこちらになります。紙面の関係上解説は割愛し、ネットワークの紹介のみにとどめます。

Wrangleでの実装

Wrangle

最初に実装したVEXによるフィボナッチ数列の実装を利用したものです。簡単に解説すると以下が実装のポイントとなります。

  • while文でプリミティブを作成します。円弧ごとにプリミティブを分割することにより、のちのBoundingBox作成に利用します。
  • 続くforループで円弧を描画します。

本ノードもRunOverDetailです。

attribwrangle_spiral
int fibo0 = 0;
int fibo1 = 1;
int fibo2 = 1;
int count = 0;
int spiral_polyline = -1;

vector center = 0;
vector direction = {1, 0, 0};
float theta = radians(270);
vector opposite = center + qrotate(quaternion(theta - radians(45.0), {0,0,1}), direction * sqrt(2.0) * fibo1);

while(fibo1 < chi("max"))
{
    int arc_pts = 24;
    float r = float(fibo1);
    float start_angle = theta - radians(90.0);
    float end_angle = theta;
    spiral_polyline = addprim(0, "polyline");
    for(int i=0; i<=arc_pts; i++)
    {
        float t = float(i)/float(arc_pts);
        float ang = lerp(start_angle, end_angle, t);
        vector p = center + set(cos(ang), sin(ang), 0) * r;
        addvertex(0, spiral_polyline, addpoint(0, p));
    }

    // 中心位置を更新
    vector move = qrotate(quaternion(theta + radians(90.0), {0,0,1}), direction * float(fibo0));
    center += move;

    // フィボナッチ数列を更新
    fibo0 = fibo1;
    fibo1 = fibo2;
    fibo2 = fibo0 + fibo1;

    // 移動方向の更新
    count++;
    theta = radians(270.0) - radians(90.0) * (count%4);
    opposite = center + qrotate(quaternion(theta - radians(45.0), {0,0,1}), direction * sqrt(2.0) * fibo1);
}

まとめ

他の発表も素晴らしく、各々の学習結果や得意分野について熱く語っていただけました。

C4Dとの比較やCOPを用いた地形操作、ゲームエンジンとの連携、MLの利用例、Solarisのシーンなど今回も幅広い発表が多く刺激がもらえました。

この勉強会はクローズドな勉強会なので、参加希望の方は僕のアカウントめんたいこ(@kickbase) / Xまでお声がけください。

Discussion