ゲーム開発
Unity
UnrealEngine
C++
Blender
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • 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