メモヤス

アドカレ置き場

Houdiniならプログラミングでモデリングができる話

総コン Advent Calendar 2021 ならびに NCCアドベントカレンダー2021 の13日目の記事です。

僕が日頃お世話になっているHoudiniというスーパーにホットな3Dモデリングツールを使って、プログラミングでもってモデリングをしてみようや、という企画記事になっています。

とりあえずは見ながら手を動かせば大体できるんじゃないかな程度の記事の内容にしたつもりではあるので、是非やってみてくれるとうれしいですね。

やってみよう

本記事の環境は以下になります。Houdiniの導入についてはこちらからどうぞ

バージョン:Houdini Indie 19
OS:Windows 10
ikatnek.blogspot.com


余談ですが、Houdiniでは視点移動の際にマウスが無いと非常につらい思いをします。3ボタンの適当なやつでいいのでマウスは用意しましょう。


それではやっていきましょう。Houdiniを起動したら、早速ノードを出していきます。

f:id:illsqjn:20211212222340p:plain
Houdiniを起動しておそらく最初に目にするであろう画面

ネットワークビュー(画面右下のセクション)内にマウスを移動させ、その状態で右クリックまたはTabを押すとズラリとノードメニューが出てきます。Geometry > Geometryと選択し、ネットワークビュー内の適当なところでクリックしましょう。

f:id:illsqjn:20211212222917p:plain
生成されたGeometryノードのgeo1くん。こんにちは

Geometryノードは大雑把に言えばHoudini内でのモデルを内包するノードで、この中にまたノードを構築してお望みの形状を作っていくわけです。


ということで、実際にこのGeometryノードの中に入っていきます。Geometryノードをダブルクリックしましょう。

Geometryノードの内部ネットワークに来ましたが、Houdiniでは一般的にはここでポリゴンやボリュームの直接的な操作に関するノードの構築を行います。

では早速ノードを組み合わせて…と行きたいところですが、今回は「プログラミングで」モデリングをするんでした。察しの良い方はもうお気づきかもしれませんが、ひとまず操作を進めます。

先程同様ノードメニューを呼び出し、Attribute > Attribute Wrangleを配置しましょう。

f:id:illsqjn:20211212224453p:plain
attribwrangle1くん

ここで、ネットワークビューの上にある(はず)のパラメータタブを見てみましょう。何かテキストを書いていけるような欄が設けられていませんか?

f:id:illsqjn:20211212224632p:plain
パラメータタブ

なんとこのツール、このようにしてコードを書くことによって役割を果たすノードが存在します。これがHoudiniがスーパーにホットな3DCGツールたる所以なのです。

他の3DCGツールでもコードの記述自体はできるのかもしれませんが、これほどにユーザ側に近いレイヤでプログラミングを提供できる3DCGツールはなかなか無いと思います。

詳細は都合上省きますがこれがHoudiniでハチャメチャな力を発揮しており、慣れてくると気付いたらほとんどのプロジェクトでこのノードを使っていた、なんてことはかなりザラです。

コード記述1

では早速コードの記述に行きましょう。実行はCtrl+Enterでできますが、実行前にパラメータタブ内のRun OverをDetail(only once)に変更しておきましょう。

f:id:illsqjn:20211212232523p:plain
これだよ
float x = 0.0;
float y = 0.0;

for(int n = 0; n < 10; n += 1){
    vector pos = set(x, y, 0);
    addpoint(geoself(), pos);
    x += 1.0;
    y += 1.0;
    
    if(n > 0){
        addprim(geoself(), "polyline", n-1, n);
    }
}
f:id:illsqjn:20211212232401p:plain
実行結果

どうでしょう。みなさんのHoudiniでもこのようにして直線が現れていたらグッドです。

ただ直線が現れるだけじゃ面白くないので、曲線でも描いてみましょう。

float alpha = 1.0;
float theta = 0.0;
float r = 0.0;

for(int n = 0; n < 1000; n += 1){
    float x = r * cos(radians(theta));
    float y = r * sin(radians(theta));
    vector pos = set(x, y, 0);
    addpoint(geoself(), pos);
    theta += 1.0;
    r = alpha * radians(theta);
    
    if(n > 0){
        addprim(geoself(), "polyline", n-1, n);
    }
}
f:id:illsqjn:20211212233031p:plain
実行結果2

はい。当たり前にアルキメデスの螺旋も描けちゃいますね。

コード記述2(ツー)

ただ、これだけではせっかくのHoudiniの機能を活かしきれていません。コードを次のように差し替え、実行時に入力スペースの右にあるアイコンをクリックしてみましょう。

float alpha = ch("Alpha");
float theta = 0.0;
float r = 0.0;

int iter = chi("Iteration");

for(int n = 0; n < iter; n += 1){
    float x = r * cos(radians(theta));
    float y = r * sin(radians(theta));
    vector pos = set(x, y, 0);
    addpoint(geoself(), pos);
    theta += 1.0;
    r = alpha * radians(theta);
    
    if(n > 0){
        addprim(geoself(), "polyline", n-1, n);
    }
}
f:id:illsqjn:20211212234633p:plain
画像右端の▼の下にあるアイコンをクリック

ビューポートには何も映らなくなってしまったかもしれませんが安心してください。パラメータタブを下にスクロールすると、最初はなかったAlphaとIterationという2つのスライダーが現れているかと思います。

ここに好きなように数字を入力することで、プログラムの外部のインタフェースからパラメータを操作することができます。

f:id:illsqjn:20211212235040p:plain
Alpha=1.0, Iterarion=10000

結び

以上のようにして、Houdiniではプログラムを駆使してモデルの作成ができます。

これの非常に嬉しい点としては、人の手ではない数学の美しさに拠るモデルがプログラムを駆使することで非常に簡単に作れることにあると個人的には思っています。

頂点や辺を移動させて行うようなモデリング形式の所謂「破壊的モデリング」では、数式が根拠にあるような美しい配置や螺旋はなかなか難しいところがあるのではないでしょうか。

螺旋の長さや間隔を変えたい場合も、Houdiniであれば最後にやったようにスライダーでプログラム外に出すことで数式に基づいた調整も可能です。

また今回やった数式ベースのプログラムモデリングは、Wrangleノードの使い方の非常にごく一部に過ぎません。もっとテクい使い方をすると、頂点全体に並列処理をかけてごにょごにょ、なんてこともできます。

Houdiniがスーパーでホットなポイントは他にもあるのですが、あまりにも長くなってしまうのでそれはまたいつか。

何はともあれ、これで少しでもHoudiniに興味を持ってくれる人が増えたらいいですね。