🐯

[Houdini][習作]「BPMに合わせて伸縮するゲージ」を作ってみました(解説&VEXコードあり)

2025/01/12に公開

Houdiniの練習の一環で、「BPM(テンポ)に合わせて伸縮するゲージのギミック」を作成してみました。
https://youtu.be/KAGBYbVFol0

解説

ノードは、Grid, Wrangle, PolyExtrude の3つです。

Gridノード

ここはRowsを変えたらColumnsが連動するようにしておきます。

Wrangleノード

パラメータとロジックの大半はVEXで書いています。
ここではRunOverをPrimitiveにし、振幅の高さのAttributeとなるzscaleを作成し算出しています。(zscaleは後述のPolyExtrudeノードで使います。)
工夫した点として、

  • BPMパラメータを変えると、振幅のスピードが変わります。
  • 振幅の高さの倍率(Height Multiple)や、基準となる高さ(Base Height)のパラメータによって、ゲージの高さを色々と調整できます。
  • Gridの分割数が変わっても、マス目のサイズと振幅の高さのバランスが変わらないようにしています。

int rows = chi("Grid_Rows"); // Gridの分割数が変わっても、マス目の大きさと振幅の高さのバランスが変わらないように。
int bpm = chi("BPM"); // テンポの速さ
float strokeWidth_Min = chf("Stroke_Width_Min"); // 振幅の最小値
float strokeWidth_Max = chf("Stroke_Width_Max"); // 振幅の最大値
float baseHeight = chf("Base_Height"); // 基準となる高さ
float height_Multiple = chf("Height_Multiple"); // 最終的にかける高さへの倍率

float randPrimnum = rand(@primnum);

float strokeSpeedRate = (float)bpm / 60.0f;
float startAngle = randPrimnum * 360.0f;
float radian = radians(@Time * 360.0f * strokeSpeedRate + startAngle);

float strokeValue = sin(radian) * 0.5f + 0.5f; // [0~1]

float strokeWidth = randPrimnum * (strokeWidth_Max - strokeWidth_Min) + strokeWidth_Min;

f@zscale = (strokeValue * strokeWidth + baseHeight) / rows * height_Multiple;

PolyExtrudeノード

LocalControlによって振幅の高さ(DistanceScaleのzscale)をAttributeから取得しています。(zscaleは前述にWrangleノードで作成しました。)
DivideIntoを「IndividualElements」にするのも忘れずに。(しないと、すべてのマスが一様に振幅してしまいます。)

Discussion