【UE4】サウンドビジュアライザを作るPart4最終回
続きです。
今回が最終回になります。
サンプルプロジェクトを公開することにしたので細かいノードの配置などは省き、どんな処理をしているのかをざっくりと書いていくことにしました。(ノードがスパゲッティ化してしまったので順を追って解説するのは難しいです)
サンプルプロジェクトを公開しました。
スプライン
始めにスプラインに沿って棒を配置するものを作ります。
コンポーネントを追加からスプラインを追加し、Get Spline Lengthでスプラインの長さを取得し現在の長さをかけて棒をスプラインに割り当てていきます。次にGet Location at Distance Along SplineノードとGet Rotation at Distance Along Splineノードで位置と回転と取得します。この時インスタンスメッシュにスケールが入っていると正しい位置が得られないのでスケールが1になるようにしています。
後はこの値をAdd InstanceのTransformに入れるだけです。(ここでは棒のタイプでスイッチしています。)
これでスプライン上に棒を配置できるようになったと思うのでレベル上で確認してみます。
スプラインの各ポイントを選択した状態で詳細タブから直線にしたり曲線にしたりすることができます。
一番上の遅れて落ちてくるやつ
こんなやつです。
(音が出ます)
まずは上の棒を追加します。
コンストラクションスクリプトのFor Loopが終了した後にもう一度For Loopさせて棒の数だけ増やします。この際に元の棒から直線の場合、円形の場合、グリッド状の場合それぞれにオフセットを取ります。
これで棒を追加する処理は完成した。次はこの棒を動かす処理を追加します。まずは上の棒を追加するときにループ回数を上の棒の数分多くなるように変更しました。
次にこの棒を更新する処理を書きます。
処理は下の棒が上の棒より高い時には早く動き、低い時には一定の速度で降下してくるというものになります。
上の棒の位置は取得できますが下の棒はスケールしか変わらないのでスケールから大体の位置を推定します。スケールの値を大体90~100倍くらいすると上の棒の位置に近い値になりました。
後はこの値を使って分岐させます。上の棒の位置より下の棒の位置が高い時はAlphaを高めに設定したLerpを下の棒の位置が低い時は一定の速度で降下してほしいのでLerpではなくInterp Toを使用しました。
これで完成ですがこのままでは円形で向きを変えても上のやつは向きが変わらないので追加で処理を書いていく必要がありますが非常に煩雑になってしまったので省略させてもらいます。
ステップ更新
最後にこのようなものを作って終わりにしたいと思います。
左が補間なしで右が補間ありです。
まずは棒の配置をします。
基本的には一番上の棒を追加する処理と同じでループ回数をステップの分割数だけ増やしているだけです。
次は棒の更新です。
こちらも一番上の棒の時と基本的には同じでループ回数を増やしただけですが棒に周波数を割り当てる際に少し工夫が必要です。
インスタンスメッシュに割り振られているIDは下の段から順に割り振られているので現在の段は棒の数で割ることで求まります。
あとは現在の段をIndexから引くことで同じ周波数の棒を指定します。
同じ周波数の棒は現在の段に応じて影響力を決めます。
現在の段をステップの分割数で割り影響力を設定してこの値をNormalize化したスペクトラムの強さが超えたらスケールを1それ以外は0という処理で動かしています。
後は一番上のやつの時と同じです。
グリッド状と組み合わせてみるとなかなか面白い動きになります。
(音が出ます)
ステップ更新は棒一つ一つスケールを更新しているのですが負荷が高いのでワールドスペースのマスクドマテリアルで再現した方が良いかもしれません。
今回はかなり雑になってしまって申し訳ありません。
今後はもっとわかりやすくできるように精進していきたいと思います。
ここまで読んでくださってありがとうございます。
サンプルプロジェクトは後日公開予定です。