ゲーム開発
Unity
UnrealEngine
C++
ゲーム数学
ゲームAI
サウンド
アニメーション
GBDK
制作日記
3DCG
Houdini
Blender
USD
グラフィックス
テクノロジ
ツール開発
フロントエンド関連
サーバサイド関連
ソフトウェア設計
ハードウェア関連
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
その他
都会のエレキベア
ラーメン日記
四コマ漫画
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • ゲーム数学
    • ゲームAI
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • 3DCG
    • Houdini
    • Blender
    • USD
    • グラフィックス
  • テクノロジ
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • ソフトウェア設計
    • ハードウェア関連
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • その他
    • 都会のエレキベア
    • ラーメン日記
    • 四コマ漫画
    • おすすめアイテム
    • おもしろコラム
  1. ホーム
  2. 20250103_02_houdini_sop

【Houdini20.5】観覧車をプロシージャルに作ってみる【SOP・VEX】

HoudiniVEXプロシージャル地形制作
2025-01-03

マイケル
マイケル
みなさんこんにちは! マイケルです!
エレキベア
エレキベア
こんにちクマ~~
マイケル
マイケル
Houdiniばかり触っている今日この頃ですが、今日はなんと・・・
20240103_02_01

20240103_02_03
▲Houdiniで制作した観覧車

マイケル
マイケル
観覧車 を作ってみました!!
エレキベア
エレキベア
おお~~なんかそれっぽいクマ でもなんで観覧車クマ??
マイケル
マイケル
まずはSOP、VEXに慣れたいというところで何か作れないかなと考えていたところで プロシージャルに作れそうな観覧車に目を付けたというわけです!
エレキベア
エレキベア
なるほどクマ 確かに模様とかゴンドラの数とか規則的に作れそうクマね
マイケル
マイケル
今回はHDAとしてパラメータを外出ししてみたので、下記のように様々なバリエーションのものが作れます!
20240103_02_04
▲パラメータを変えることで様々な観覧車を作成することができる

エレキベア
エレキベア
大きさや模様、色が変えれる感じなのクマね 割といろんなものが作れそうクマ~~
マイケル
マイケル
今回作成したHDAやサンプルシーンについてはGitHubに上げているので、実際に手元で触りたい方はぜひご活用ください!

GitHub - houdini-ferris-wheel

20240103_02_58


エレキベア
エレキベア
HDAは気軽に配布できるのもいいクマね

参考書籍

マイケル
マイケル
SOP、VEXを学習するにあたり、下記書籍を参考にさせていただきました! 様々な作例がVEXコードとともに解説されていて、個人的に一推しの本です!

理論と実践で学ぶHoudini -SOP&VEX編-

マイケル
マイケル
ただし今は廃盤となっていて、中古で出回っているものを入手する必要があります・・・ 自分はメルカリで手に入れたので興味がある方は今のうちに入手しておきましょう

メルカリで検索! → 理論と実践で学ぶHoudini

エレキベア
エレキベア
まあまあ前に出た本なのクマね
マイケル
マイケル
また、最近はHoudini関連の書籍が3冊同時に出て、非常に学習しやすい環境になってきました! どれも異なる趣旨にはなっているので、一読しておくことをおすすめします。

SideFX公式 さつき先生と学ぶはじめてのHoudini

挫折させないHoudiniドリル

ひたすら実践!Houdiniエフェクト

マイケル
マイケル
私は全て購入しました・・・
エレキベア
エレキベア
Houdini大好きクマね

制作イメージ

マイケル
マイケル
それでは観覧車制作の話に戻りますが、まずは制作物のイメージについてです。

参考リファレンス

マイケル
マイケル
リファレンスとしては、地元・鹿児島の定番スポットである アミュプラザの観覧車「アミュラン」 を参考にさせていただきました! なるべくこちらに近しいものが作れる形で制作しています。
20240103_02_02

引用: 観覧車「アミュラン」のご案内 | アミュプラザ鹿児島

エレキベア
エレキベア
鹿児島といえばこれクマね

制作条件

マイケル
マイケル
アミュランを再現するために、制作条件としては下記を設けて進めました。
  • ホイール部分の模様をパラメータから制御できる
  • 円、ワイヤごとに色を付けることができる
  • ワイヤの形状を複数パターンから選択できる
エレキベア
エレキベア
この辺りのパラメータが調整できればよさそうクマね

制作したHDA

Ferris Wheel Generator

マイケル
マイケル
そんなこんなで制作したのがこちらの Ferris Wheel Generator というHDAです!
20240103_02_05
▲Ferris Wheel Generator という名称のHDAになっている

エレキベア
エレキベア
観覧車はFerris Wheelというのクマね カッコいいクマ・・・
マイケル
マイケル
HDA内では更にゴンドラ作成、スタンド作成などのHDAを作成して使用しています。 そしてパラメータを多数設定可能で、様々なバリエーションの観覧車を作成することができます。
20240103_02_10
▲内部では更にいくつかHDAを作成している

20240103_02_09
▲様々なパラメータを設定できる

20240103_02_08

20240103_02_11
▲HDAのパラメータを編集することで様々な観覧車を作成できる

エレキベア
エレキベア
パラメータを変更するだけで観覧車が作れるのはすごいクマね

パラメータ(ホイール生成部分)

マイケル
マイケル
設定できるパラメータとして、メインとなるホイール生成部分は下記のようになっています。 リスト形式になっていて、色合いや半径、ワイヤの繋ぎ方などを指定できます。
20240103_02_06

表示名
パラメータ名
概要
Radius
radius#
ホイールの半径
Wire Type
wire_type#
0:Strait:真っ直ぐ繋ぐ
1:Merge Outside:外側のワイヤをマージする
2:Merge Inside:内側のワイヤをマージする
Circle Color
circle_color#
円部分の色
Wire Color
wire_color#
ワイヤ部分の色
エレキベア
エレキベア
これで作成するホイールの数だけ要素を作成するクマね
マイケル
マイケル
リストに関しては、Folderを作成してFolderTypeをMultiparm Block (list)に指定すると、その下に要素を入れることでリスト構造にすることができます。
20240103_02_31
▲Folderとしてまとめることでリスト構造にできる

エレキベア
エレキベア
クラスのリストみたいな感じで設定できるから便利クマね
マイケル
マイケル
ただこの方法だと要素数などのデフォルト値が設定できないみたいで、他にいい方法があるかもしれません・・・

パラメータ(その他)

マイケル
マイケル
その他にも、分割数や厚みといった細かい調整についても行えるようにしています。
20240103_02_07

表示名
パラメータ名
概要
Circle Divisions
circle_divisions
円部分の分割数
Circle Thickness
circle_thickness
円部分の厚み
Circle Edge Thickness
circle_edge_thickness
円部分のエッジの太さ
Wire Count
wire_count
ワイヤの数
Wire Edge Thickness
wire_edge_thickness
ワイヤのエッジの太さ
Gondla Scale
gondla_scale
ゴンドラの大きさ
Gondla Color
gondla_color
ゴンドラの色
Stand Edge Thickness
stand_edge_thickness
スタンドのエッジの太さ
Stand Distance
stand_distance
スタンド同士の距離
Stand Scale
stand_scale
スタンドの大きさ
Stand Color
stand_color
スタンドの色
Rotate Speed
rotate_speed
ホイールを回転させる速度
エレキベア
エレキベア
これだけパラメータがあれば柔軟に作れそうクマね

観覧車の制作 - 全体構成

マイケル
マイケル
それではここから制作したHDAの内容について見ていきます。

ノード構成

マイケル
マイケル
全体の構成について、まずノード構成は下記のようになっています。
20240103_02_12
▲ノード構成

エレキベア
エレキベア
割とシンプルになっているクマね
マイケル
マイケル
まあここからそれぞれSubNetworkとして深くなってるけどね・・・

大まかな流れ

マイケル
マイケル
大まかにはnetwork boxで囲んである下記4つの流れとなっています。
1. ホイールのエッジを作る
20240103_02_13

2. エッジからポリゴンを作る
20240103_02_14

3. ゴンドラを先端のポイントにコピーする
20240103_02_15

4. スタンドをホイールにマージする
20240103_02_16


マイケル
マイケル
まずはホイール形状のエッジを作って、そこからポリゴンを作成します。 最後にゴンドラ、スタンドをマージして完成させるといったフローです。
エレキベア
エレキベア
エッジからポリゴンを作成するのはpolywireとかで出来たと思うクマから 一つ一つ考えていけばやりやすそうクマね
マイケル
マイケル
ホイール形状のエッジをどのように作るか がキモになりそうだね それではそれぞれの細かい内容について見ていきましょう!

観覧車の制作 - 詳細内容

ホイールのエッジを作る

マイケル
マイケル
まずはホイールのエッジ作成から見ていきます! 最終的には下記のようにホイールの形状がエッジで繋がっている状態としたいです。
20240103_02_13
▲エッジが繋がっている状態で色も付いている

エレキベア
エレキベア
これはどう作るか悩みどころクマね
ホイールエッジ作成HDAについて
マイケル
マイケル
該当処理の部分は下記のようになっていて、ホイール生成情報をforループで回しながら作成しています。 ここで一旦は2Dとして考えて、生成情報一つ分のエッジを作成する処理としてWheel EdgeというHDAを作成しました。
20240103_02_17
▲Wheel EdgeというHDAで生成情報1つ分のエッジを作成している

マイケル
マイケル
このHDAのパラメータは下記のようになっています。 ホイール生成情報がベースになっていますが、円、ワイヤどちらを生成するか(GenerateType)についても指定できるようにしています。
20240103_02_18

表示名
パラメータ名
概要
Inside Radius
inside_radius
内側の円の半径
Inside Divisions
inside_divisions
内側の円の分割数
Outside Radius
outside_radius
外側の円の半径
Outside Divisions
outside_divisions
外側の円の分割数
Generate Type
generate_type
ホイールの生成種類
0: All: 円、ワイヤ両方
1: Circle Only: 円のみ
2: Wire Only: ワイヤのみ
Wire Type
wire_type
ワイヤの生成種類
0:Strait:真っ直ぐ繋ぐ
1:Merge Outside:外側のワイヤをマージする
2:Merge Inside:内側のワイヤをマージする
Wire Count
wire_count
ワイヤの本数
Circle Color
circle_color
円部分の色
Wire Color
wire_color
ワイヤ部分の色
20240103_02_21
▲GenerateTypeによる違い(All、Circle Only、Wire Only)

マイケル
マイケル
このGenerateTypeにより、 ・最初の生成は円のみ ・間の生成は円とワイヤ両方 ・最後の生成はワイヤのみ としてマージすることでホイールの形状を作成しています。
エレキベア
エレキベア
なるほどクマ forループで回しながら何を生成するかを決めているクマね
マイケル
マイケル
また、WireTypeについては ワイヤの接続をどのようにするか のパラメータになっていて、 下記のように模様を変更するのに使用できます。
20240103_02_22
▲WireTypeによる違い(Strait、Merge Outside、Merge Inside)

エレキベア
エレキベア
これでアミュランのような形状を作れるクマね
ホイール形状のエッジ作成
マイケル
マイケル
エッジ作成HDAの内容については、大まかに下記のようになっています。 内側、外側の円を元にエッジを作成して調整する流れです。
  1. 円のエッジを作成する
  2. ワイヤ部分のエッジを作成する
  3. 内側の円を削除する
  4. 色を付ける
  5. 生成種類に合わせてフィルタする
20240103_02_19
▲Wheel Edge HDAの内容

マイケル
マイケル
まずはconvertlineで下記のように円をエッジに変更した後、 Attribute Wrangleでワイヤ部分のエッジ情報を生成するVEXを定義します。
20240103_02_20
▲元となる円を二つ重ねてエッジにする


// ワイヤの種類
int WIRE_TYPE_STANDARD = 0;
int WIRE_TYPE_MERGE_OUTSIDE = 1;
int WIRE_TYPE_MERGE_INSIDE = 2;
int wireType = chi("../wire_type");

// ワイヤの生成数
int wireGenerateCount = chi("../wire_count");

// 内側、外側の円の頂点数を取得
int insideCiclePointCount = npoints(1);
int outsideCiclePointCount = npoints(2);

// ワイヤ生成数に対する頂点ステップ数
int insideCircleStepPoint = int(insideCiclePointCount / wireGenerateCount);
int outsideCircleStepPoint = int(outsideCiclePointCount / wireGenerateCount);

// 外側の円のPoint開始数
int outsideCircleStartPoint = insideCiclePointCount;

// 頂点を結んでワイヤ用のEdgeを作成
for (int i = 0; i < wireGenerateCount; i++) {
    int insideEdgePoint = insideCircleStepPoint * i;
    int outsideEdgePoint = outsideCircleStepPoint * i + outsideCircleStartPoint;
    
    // 基本となるワイヤを生成する
    int wireEdge = addprim(geoself(), "polyline", insideEdgePoint, outsideEdgePoint);
    addvertex(geoself(), wireEdge, insideEdgePoint);
    addvertex(geoself(), wireEdge, outsideEdgePoint);
    setprimattrib(geoself(), "wireedge", wireEdge, 1.0, "set");
    
    // ワイヤの種類によって生成方法を変更する
    if (wireType == WIRE_TYPE_MERGE_INSIDE) {
        // 内側のワイヤをマージ
        int halfInsideCircleStepPoint = int(insideCircleStepPoint / 2);
        int insideEdgePoint1 = insideEdgePoint + halfInsideCircleStepPoint;
        int insideEdgePoint2 = insideEdgePoint - halfInsideCircleStepPoint;
        if (insideEdgePoint2 < 0) {
            insideEdgePoint2 = insideEdgePoint2 + insideCiclePointCount;
        }
        int wireEdge1 = addprim(geoself(), "polyline", insideEdgePoint1, outsideEdgePoint);
        addvertex(geoself(), wireEdge1, insideEdgePoint1);
        addvertex(geoself(), wireEdge1, outsideEdgePoint);
        setprimattrib(geoself(), "wireedge", wireEdge1, 1.0, "set");
        int wireEdge2 = addprim(geoself(), "polyline", insideEdgePoint2, outsideEdgePoint);
        addvertex(geoself(), wireEdge2, insideEdgePoint2);
        addvertex(geoself(), wireEdge2, outsideEdgePoint);
        setprimattrib(geoself(), "wireedge", wireEdge2, 1.0, "set");
        
    } else if (wireType == WIRE_TYPE_MERGE_OUTSIDE) {
        // 外側のワイヤをマージ
        int halfOutsideCircleStepPoint = int(outsideCircleStepPoint / 2);
        int outsideEdgePoint1 = outsideEdgePoint + halfOutsideCircleStepPoint;
        int outsideEdgePoint2 = outsideEdgePoint - halfOutsideCircleStepPoint;
        if (outsideEdgePoint2 < outsideCircleStartPoint) {
            outsideEdgePoint2 = outsideEdgePoint2 + outsideCiclePointCount;
        }
        int wireEdge1 = addprim(geoself(), "polyline", insideEdgePoint, outsideEdgePoint1);
        addvertex(geoself(), wireEdge1, insideEdgePoint);
        addvertex(geoself(), wireEdge1, outsideEdgePoint1);
        setprimattrib(geoself(), "wireedge", wireEdge1, 1.0, "set");
        int wireEdge2 = addprim(geoself(), "polyline", insideEdgePoint, outsideEdgePoint2);
        addvertex(geoself(), wireEdge2, insideEdgePoint);
        addvertex(geoself(), wireEdge2, outsideEdgePoint2);
        setprimattrib(geoself(), "wireedge", wireEdge2, 1.0, "set");
        
    }
}

▲内側、外側の円のポイントを元にワイヤ部分のエッジを作成する
エレキベア
エレキベア
おお~~~ここでVEXが出てきたクマか
マイケル
マイケル
円のPoint上にVertexを生成し、それらを繋いでEdgeとしています。 癖がある点として、HoudiniではEdgeというエレメントは存在しないため、polyline(開いたポリゴン)指定したPrimitiveとして表現する必要があります。 また、後続処理で処理が行いやすいよう「wireedge」という名称でAttributeも付与しています。 そこだけ押さえていればコードも単純に見えてくると思います。

参考:
プリミティブ | Houdini
addprim VEX function | Houdini

エレキベア
エレキベア
Houdiniでのプリミティブの扱いを心得ておくクマね
マイケル
マイケル
これにより下記のようなエッジが作成されるため、不要な内側の円は削除します。 あとはパラメータに応じて色や生成対象を調整すれば処理は完了です。
20240103_02_23
▲内側、外側の円を繋いだエッジが出来る

20240103_02_24

20240103_02_25
▲内側の円を削除して色付け、フィルタする

マイケル
マイケル
あとはこの処理を定義されたホイール生成情報分回せば、元となる2Dエッジの完成です! 渡すパラメータに関してはループ回数に対応するものを渡す必要がありますが、こちらは detail("../repeat_metadata1", "iteration", 0) の形式で取得できるIterationを駆使して渡すようにします。
20240103_02_29
▲上記のHDAを定義されたホイール生成情報分ループして作成する

20240103_02_26
▲これぞ求めていた形状である

screenshot_2025_01_12_214230
▲各Iterationに応じた値を参照する

パラメータ例
Inside Radius
if(detail("../repeat_metadata1", "iteration", 0) == 0, 0, ch("../radius" + (detail("../repeat_metadata1", "iteration", 0))))
Generate Type
if(detail("../repeat_metadata1", "iteration", 0) == 0, 0, if(detail("../repeat_metadata1", "iteration", 0) == ch("../generate_wheel_list") - 1, 2, 0))
Circle Color (R)
ch("../circle_color" + (detail("../repeat_metadata1", "iteration", 0) + 1) + "r")
エレキベア
エレキベア
もうこれでほとんど出来たようなもんクマね
エッジを手前に押し出す
マイケル
マイケル
エッジ生成でもう一つ考えないといけないのは、2D形状のエッジの押し出しです。 下記のように手前に押し出してこちらもワイヤを繋げる必要があります。
20240103_02_59
▲3D形状にするため手前方向に押し出す必要がある

エレキベア
エレキベア
まだこれも残ってたクマか・・・
マイケル
マイケル
こちらについてもAttributeWrangleでVEXを書いて対処することにしました。 処理内容は下記のようになっています。
20240103_02_28
▲こちらもAttributeWrangleで対応する


// ホイールの厚み
float thickness = chf("../circle_thickness");
if (thickness < 0.001)
{
    return;
}

// ホイールの厚みによって動かす量
vector offsetPointPosition = {0, 0, 0};
offsetPointPosition.z = thickness;

int originalNumPoints = npoints(0);
int originalNumPrims = nprimitives(0);

// 押し出してポイントを作成
for (int i = 0; i < originalNumPoints; i++)
{
    vector pointPosition = point(0, "P", i);
    int newPoint = addpoint(0, pointPosition + offsetPointPosition);
    int newWireEdge = addprim(0, "polyline", i, newPoint);
    setprimattrib(geoself(), "wireedge", newWireEdge, 1.0);
    
    // Attributeのコピー
    int prims[] = pointprims(0, i);
    vector colorAttr = prim(0, "Cd", prims[0]);
    setprimattrib(0, "Cd", newWireEdge, colorAttr);
}

// 元のEdge情報から押し出し先のポイントを繋げる
for (int i = 0; i < originalNumPrims; i++)
{
    int points[] = primpoints(0, i);
    int newPoints[];
    foreach (int p; points)
    {
        append(newPoints, p + originalNumPoints);
    }
    int newEdge = addprim(0, "polyline", newPoints);
    
    // Attributeのコピー
    float wireEdgeAttr = prim(0, "wireedge", i);
    setprimattrib(0, "wireedge", newEdge, wireEdgeAttr);
    float circleEdgeAttr = prim(0, "circleedge", i);
    setprimattrib(0, "circleedge", newEdge, circleEdgeAttr);
    vector colorAttr = prim(0, "Cd", i);
    setprimattrib(0, "Cd", newEdge, colorAttr);
}

▲ホイールのエッジを手前方向に押し出すVEXスクリプト
マイケル
マイケル
押し出した先にポイントを作成し、元のポイントと繋げてEdgeにしています。 あとは元となるEdgeを参照しながら、該当する押し出し先ポイントを探して同じように繋げることで実装しています。
20240103_02_27
▲いい感じに押し出すことができた

エレキベア
エレキベア
これでホイール部分のエッジが出来たクマね

エッジからポリゴンを作る

マイケル
マイケル
ここまで来ればあとは簡単で、エッジに対してpolywireでポリゴンに変換するだけです! 太さを細かく調整できるよう、circleedge、wireedgeそれぞれで厚さを指定できるようにしています。 また、必要となるAttribute情報については元のEdgeから移しておきましょう。
20240103_02_32
▲エッジ情報を受け取りpolywireでポリゴンにする

20240103_02_33
▲ciricleedge、wireedgeにそれぞれフィルタして調整可能にしている

20240103_02_34
▲Attribute情報はEdgeから移しておく

20240103_02_14
▲綺麗にポリゴン変換された!

エレキベア
エレキベア
だいぶ観覧車になったクマ~~~

ゴンドラを先端のポイントにコピーする

マイケル
マイケル
次は下記のように先端部分にゴンドラを付けていきたいですが、この生成ポイントの設定についてもVEXを使用しています。 下記のように最も大きな半径に近いポイントに対してAttributeを付与することで簡単に実現できます。
20240103_02_15
▲先端にゴンドラを生成したい


float lastOutsideRadius = chf("../radius" + itoa((chi("../generate_wheel_list"))));

// 最後の半径の距離に近いポイントにゴンドラ生成ポイントを設定
float distanceCenter = distance({0, 0, 0}, @P);
if (distanceCenter > lastOutsideRadius - 0.01)
{
    setpointattrib(0, "gondlapoint", @ptnum, 1.0);
}

▲先端のポイントにゴンドラ生成用のAttributeを付与する
マイケル
マイケル
Attributeが付与できたら、あとはお馴染みのcopytopointsノードでゴンドラを生成するだけです。
20240103_02_35
▲お馴染みのcopytopoints

エレキベア
エレキベア
とてもシンプルクマね
ゴンドラポリゴンの生成
マイケル
マイケル
ゴンドラのポリゴン生成についてはそこまでプロシージャルではないですが、一応軽く紹介しておきます。 最終的な見た目とノード構成は下記のようになっています。
20240103_02_36
▲最終的に出来るポリゴン

20240103_02_37
▲ゴンドラポリゴン生成処理

エレキベア
エレキベア
結構地道そうクマね・・・
マイケル
マイケル
通常のモデリングと同じような流れではあるのですが、下記のようにベースとなるポリゴンを作成し booleanで不要な部分をカットすることで作成しています。
20240103_02_38
▲ベースとなるポリゴン

20240103_02_39
▲boolean用ポリゴン1

20240103_02_40
▲boolean用ポリゴン2

20240103_02_41
▲booleanした結果

20240103_02_42
▲最後に頭の三角部分を乗せれば大方完了!

エレキベア
エレキベア
簡易的なものクマね まあそれっぽくなればいいクマ

スタンドをホイールにマージする

マイケル
マイケル
あともう一息です! スタンドを作成してホイールにマージします。 こちらもゴンドラと同様、ポリゴンを作成します。
20240103_02_16
▲やはり足はほしい

20240103_02_43
▲ポリゴン生成HDA

エレキベア
エレキベア
このポリゴンも作らないといけないのクマね
スタンドポリゴンの生成
マイケル
マイケル
最終的な見た目とノード構成は下記のようになります。
20240103_02_44
▲最終的なポリゴン

20240103_02_45
▲ノード構成

マイケル
マイケル
どのように作るか悩んだのですが、今回は下記のようにbooleanのShatterを用いて縦方向に分割することで実現してみました。 分割したポリゴンをエッジに変換してpolywireすることでそれらしい形状が作成できます。
20240103_02_46
▲ベースとなるポリゴン

20240103_02_47
▲boolean用のポリゴン

20240103_02_48
▲booleanした結果

20240103_02_49
▲OperationはShatterに指定する

20240103_02_50
▲convertlineでEdgeを抽出

20240103_02_51
▲2つ組み合わせて・・・

20240103_02_52
▲polywireすれば完成!

エレキベア
エレキベア
おお~~ なかなかそれっぽい感じに出来たクマね
マイケル
マイケル
あとは先端位置を(0, 0)位置に持ってきたり大きさ調整などすれば完成です!

最終調整

マイケル
マイケル
最後の仕上げとして何点か調整していきます!
足の位置を0に合わせる
マイケル
マイケル
制作した観覧車の足を地面位置と合わせるため位置調整します。 こちらはmatchsizeノードを使用することで簡単に調整できます。
20240103_02_54

20240103_02_55
▲JustifyYをMinに変更

エレキベア
エレキベア
よく使うノードクマね
回転アニメーションを付ける
マイケル
マイケル
あとはおまけとして、フレームが進むごとに少しずつ回転するように設定してみます。 ホイールの元エッジを作成した直後辺りにtransformノードを挿入してRotateに値を設定します。
20240103_02_56

20240103_02_53
▲フレーム数にスピードをかけるように設定する(-$F*ch("../rotate_speed"))


エレキベア
エレキベア
観覧車だとアニメーションも簡単クマね
完成!
マイケル
マイケル
長かったですが、以上で全ての実装の完了です! パラメータをいじると無事アミュランのような見た目の観覧車が作成できました!!
20240103_02_16
▲いい感じの観覧車だ!

エレキベア
エレキベア
やったクマ~~~~!!

おわりに

マイケル
マイケル
というわけで今回はHoudiniでの観覧車制作についてでした! どうだったかな??
エレキベア
エレキベア
規則を見つけながら一つ一つ作っていくのは楽しかったクマ~~ VEXで割と自由にいじれるのも楽しいクマね
マイケル
マイケル
プロシージャルにするにはどうすればいいか考えながら作るのがHoudiniの面白いところだね 今回の制作でSOP、VEXには少しは慣れてきた気もします!
マイケル
マイケル
今回よく多用したEdgeからpolywireでポリゴン生成する手法は、うまく使えば他にも面白そうなものが出来そうですね これをコードで一から書こうとすると中々大変なんですよね・・・
エレキベア
エレキベア
ノードを繋げるだけで自由にモデリング出来るのはさすがHoudiniクマね
マイケル
マイケル
それでは今日はこの辺で! 今後もHoudiniはガシガシ触っていくのでお楽しみに!!
エレキベア
エレキベア
クマ~~~~~~

【Houdini20.5】観覧車をプロシージャルに作ってみる【SOP・VEX】~完~


HoudiniVEXプロシージャル地形制作
2025-01-03
記事をSNSで共有する
X
Facebook
LINE
はてなブックマーク
Pocket
LinkedIn
Reddit

著者の各種アカウント
フォローいただけると大変励みになります!
X
GitHub

関連記事
【Houdini21.0】Heightfield VisualizeでレイヤーをWeightBlend(順不同)で表示する
2026-01-12
【Houdini21.0】3Dビル群っぽいブログヘッダー画像を作成する
2026-01-10
【Houdini21.0】Solaris徹底入門:USD構成を意識した基本的な作業フローについてまとめる
2025-12-31
【Houdini21.0】Otisによる筋肉シミュレーションと筋肉情報転送機能の使い方【Otis Muscle and Tissue Simulation】
2025-11-29
【Houdini】Mardini2025の振り返りと制作物解説
2025-11-24
【Houdini Indie】通常版とSteam版の挙動の違いをまとめる【2025年版】
2025-11-03
【ゲーム数学】第十回 p5.js(+α)で学ぶゲーム数学「複素数とフラクタル」
2025-11-02
【プロシージャル】Pythonで学ぶ波動関数崩壊アルゴリズム(Wave Function Collapse)
2025-06-22