- 1. 参考書籍
- 2. 制作イメージ
- 1. 参考リファレンス
- 2. 制作条件
- 3. 制作したHDA
- 1. Ferris Wheel Generator
- 2. パラメータ(ホイール生成部分)
- 3. パラメータ(その他)
- 4. 観覧車の制作 - 全体構成
- 1. ノード構成
- 2. 大まかな流れ
- 1. 1. ホイールのエッジを作る
- 2. 2. エッジからポリゴンを作る
- 3. 3. ゴンドラを先端のポイントにコピーする
- 4. 4. スタンドをホイールにマージする
- 5. 観覧車の制作 - 詳細内容
- 1. ホイールのエッジを作る
- 1. ホイールエッジ作成HDAについて
- 2. ホイール形状のエッジ作成
- 3. エッジを手前に押し出す
- 2. エッジからポリゴンを作る
- 3. ゴンドラを先端のポイントにコピーする
- 1. ゴンドラポリゴンの生成
- 4. スタンドをホイールにマージする
- 1. スタンドポリゴンの生成
- 5. 最終調整
- 1. 足の位置を0に合わせる
- 2. 回転アニメーションを付ける
- 3. 完成!
- 6. おわりに

マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ~~

マイケル
Houdiniばかり触っている今日この頃ですが、今日はなんと・・・


▲Houdiniで制作した観覧車

マイケル
観覧車
を作ってみました!!

エレキベア
おお~~なんかそれっぽいクマ
でもなんで観覧車クマ??

マイケル
まずはSOP、VEXに慣れたいというところで何か作れないかなと考えていたところで
プロシージャルに作れそうな観覧車に目を付けたというわけです!

エレキベア
なるほどクマ
確かに模様とかゴンドラの数とか規則的に作れそうクマね

マイケル
今回はHDAとしてパラメータを外出ししてみたので、下記のように様々なバリエーションのものが作れます!

▲パラメータを変えることで様々な観覧車を作成することができる

エレキベア
大きさや模様、色が変えれる感じなのクマね
割といろんなものが作れそうクマ~~

マイケル
今回作成したHDAやサンプルシーンについてはGitHubに上げているので、実際に手元で触りたい方はぜひご活用ください!


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

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


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

エレキベア
まあまあ前に出た本なのクマね

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




マイケル
私は全て購入しました・・・

エレキベア
Houdini大好きクマね
制作イメージ

マイケル
それでは観覧車制作の話に戻りますが、まずは制作物のイメージについてです。
参考リファレンス

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

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

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

マイケル
アミュランを再現するために、制作条件としては下記を設けて進めました。
- ホイール部分の模様をパラメータから制御できる
- 円、ワイヤごとに色を付けることができる
- ワイヤの形状を複数パターンから選択できる

エレキベア
この辺りのパラメータが調整できればよさそうクマね
制作したHDA
Ferris Wheel Generator

マイケル
そんなこんなで制作したのがこちらの
Ferris Wheel Generator
というHDAです!

▲Ferris Wheel Generator という名称のHDAになっている

エレキベア
観覧車はFerris Wheelというのクマね
カッコいいクマ・・・

マイケル
HDA内では更にゴンドラ作成、スタンド作成などのHDAを作成して使用しています。
そしてパラメータを多数設定可能で、様々なバリエーションの観覧車を作成することができます。

▲内部では更にいくつかHDAを作成している

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


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

エレキベア
パラメータを変更するだけで観覧車が作れるのはすごいクマね
パラメータ(ホイール生成部分)

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

表示名 | パラメータ名 | 概要 |
---|---|---|
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)に指定すると、その下に要素を入れることでリスト構造にすることができます。

▲Folderとしてまとめることでリスト構造にできる

エレキベア
クラスのリストみたいな感じで設定できるから便利クマね

マイケル
ただこの方法だと要素数などのデフォルト値が設定できないみたいで、他にいい方法があるかもしれません・・・
パラメータ(その他)

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

表示名 | パラメータ名 | 概要 |
---|---|---|
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の内容について見ていきます。
ノード構成

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

▲ノード構成

エレキベア
割とシンプルになっているクマね

マイケル
まあここからそれぞれSubNetworkとして深くなってるけどね・・・
大まかな流れ

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

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

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

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


マイケル
まずはホイール形状のエッジを作って、そこからポリゴンを作成します。
最後にゴンドラ、スタンドをマージして完成させるといったフローです。

エレキベア
エッジからポリゴンを作成するのはpolywireとかで出来たと思うクマから
一つ一つ考えていけばやりやすそうクマね

マイケル
ホイール形状のエッジをどのように作るか がキモになりそうだね
それではそれぞれの細かい内容について見ていきましょう!
観覧車の制作 - 詳細内容
ホイールのエッジを作る

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

▲エッジが繋がっている状態で色も付いている

エレキベア
これはどう作るか悩みどころクマね
ホイールエッジ作成HDAについて

マイケル
該当処理の部分は下記のようになっていて、ホイール生成情報をforループで回しながら作成しています。
ここで一旦は2Dとして考えて、生成情報一つ分のエッジを作成する処理としてWheel EdgeというHDAを作成しました。

▲Wheel EdgeというHDAで生成情報1つ分のエッジを作成している

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

表示名 | パラメータ名 | 概要 |
---|---|---|
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 | ワイヤ部分の色 |

▲GenerateTypeによる違い(All、Circle Only、Wire Only)

マイケル
このGenerateTypeにより、
・最初の生成は円のみ
・間の生成は円とワイヤ両方
・最後の生成はワイヤのみ
としてマージすることでホイールの形状を作成しています。

エレキベア
なるほどクマ
forループで回しながら何を生成するかを決めているクマね

マイケル
また、WireTypeについては ワイヤの接続をどのようにするか のパラメータになっていて、
下記のように模様を変更するのに使用できます。

▲WireTypeによる違い(Strait、Merge Outside、Merge Inside)

エレキベア
これでアミュランのような形状を作れるクマね
ホイール形状のエッジ作成

マイケル
エッジ作成HDAの内容については、大まかに下記のようになっています。
内側、外側の円を元にエッジを作成して調整する流れです。
- 円のエッジを作成する
- ワイヤ部分のエッジを作成する
- 内側の円を削除する
- 色を付ける
- 生成種類に合わせてフィルタする

▲Wheel Edge HDAの内容

マイケル
まずはconvertlineで下記のように円をエッジに変更した後、
Attribute Wrangleでワイヤ部分のエッジ情報を生成するVEXを定義します。

▲元となる円を二つ重ねてエッジにする
▲内側、外側の円のポイントを元にワイヤ部分のエッジを作成する

エレキベア
おお~~~ここでVEXが出てきたクマか

マイケル
円のPoint上にVertexを生成し、それらを繋いでEdgeとしています。
癖がある点として、HoudiniではEdgeというエレメントは存在しないため、polyline(開いたポリゴン)指定したPrimitiveとして表現する必要があります。
また、後続処理で処理が行いやすいよう「wireedge」という名称でAttributeも付与しています。
そこだけ押さえていればコードも単純に見えてくると思います。
参考:
プリミティブ | Houdini
addprim VEX function | Houdini

エレキベア
Houdiniでのプリミティブの扱いを心得ておくクマね

マイケル
これにより下記のようなエッジが作成されるため、不要な内側の円は削除します。
あとはパラメータに応じて色や生成対象を調整すれば処理は完了です。

▲内側、外側の円を繋いだエッジが出来る


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

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

▲上記のHDAを定義されたホイール生成情報分ループして作成する

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

▲各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形状のエッジの押し出しです。
下記のように手前に押し出してこちらもワイヤを繋げる必要があります。

▲3D形状にするため手前方向に押し出す必要がある

エレキベア
まだこれも残ってたクマか・・・

マイケル
こちらについてもAttributeWrangleでVEXを書いて対処することにしました。
処理内容は下記のようになっています。

▲こちらもAttributeWrangleで対応する
▲ホイールのエッジを手前方向に押し出すVEXスクリプト

マイケル
押し出した先にポイントを作成し、元のポイントと繋げてEdgeにしています。
あとは元となるEdgeを参照しながら、該当する押し出し先ポイントを探して同じように繋げることで実装しています。

▲いい感じに押し出すことができた

エレキベア
これでホイール部分のエッジが出来たクマね
エッジからポリゴンを作る

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

▲エッジ情報を受け取りpolywireでポリゴンにする

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

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

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

エレキベア
だいぶ観覧車になったクマ~~~
ゴンドラを先端のポイントにコピーする

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

▲先端にゴンドラを生成したい
▲先端のポイントにゴンドラ生成用のAttributeを付与する

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

▲お馴染みのcopytopoints

エレキベア
とてもシンプルクマね
ゴンドラポリゴンの生成

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

▲最終的に出来るポリゴン

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

エレキベア
結構地道そうクマね・・・

マイケル
通常のモデリングと同じような流れではあるのですが、下記のようにベースとなるポリゴンを作成し
booleanで不要な部分をカットすることで作成しています。

▲ベースとなるポリゴン

▲boolean用ポリゴン1

▲boolean用ポリゴン2

▲booleanした結果

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

エレキベア
簡易的なものクマね
まあそれっぽくなればいいクマ
スタンドをホイールにマージする

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

▲やはり足はほしい

▲ポリゴン生成HDA

エレキベア
このポリゴンも作らないといけないのクマね
スタンドポリゴンの生成

マイケル
最終的な見た目とノード構成は下記のようになります。

▲最終的なポリゴン

▲ノード構成

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

▲ベースとなるポリゴン

▲boolean用のポリゴン

▲booleanした結果

▲OperationはShatterに指定する

▲convertlineでEdgeを抽出

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

▲polywireすれば完成!

エレキベア
おお~~
なかなかそれっぽい感じに出来たクマね

マイケル
あとは先端位置を(0, 0)位置に持ってきたり大きさ調整などすれば完成です!
最終調整

マイケル
最後の仕上げとして何点か調整していきます!
足の位置を0に合わせる

マイケル
制作した観覧車の足を地面位置と合わせるため位置調整します。
こちらはmatchsizeノードを使用することで簡単に調整できます。


▲JustifyYをMinに変更

エレキベア
よく使うノードクマね
回転アニメーションを付ける

マイケル
あとはおまけとして、フレームが進むごとに少しずつ回転するように設定してみます。
ホイールの元エッジを作成した直後辺りにtransformノードを挿入してRotateに値を設定します。


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

エレキベア
観覧車だとアニメーションも簡単クマね
完成!

マイケル
長かったですが、以上で全ての実装の完了です!
パラメータをいじると無事アミュランのような見た目の観覧車が作成できました!!

▲いい感じの観覧車だ!

エレキベア
やったクマ~~~~!!
おわりに

マイケル
というわけで今回はHoudiniでの観覧車制作についてでした!
どうだったかな??

エレキベア
規則を見つけながら一つ一つ作っていくのは楽しかったクマ~~
VEXで割と自由にいじれるのも楽しいクマね

マイケル
プロシージャルにするにはどうすればいいか考えながら作るのがHoudiniの面白いところだね
今回の制作でSOP、VEXには少しは慣れてきた気もします!

マイケル
今回よく多用したEdgeからpolywireでポリゴン生成する手法は、うまく使えば他にも面白そうなものが出来そうですね
これをコードで一から書こうとすると中々大変なんですよね・・・

エレキベア
ノードを繋げるだけで自由にモデリング出来るのはさすがHoudiniクマね

マイケル
それでは今日はこの辺で!
今後もHoudiniはガシガシ触っていくのでお楽しみに!!

エレキベア
クマ~~~~~~
【Houdini20.5】観覧車をプロシージャルに作ってみる【SOP・VEX】~完~