【UE4】サウンドビジュアライザーを作るpart2

前回の続きです。 

yeczrtu.hatenablog.com

f:id:yeczrtu:20191205234638j:plain

まずは直線形の調整をしてから円形を作っていきます。

 

前回作ったものはスペクトラムの強さをそのままスケールの値にしていましたが、そのままでは低周波帯に対応している棒のスケールが大きすぎるのでスケールを調整していきます。

 

前回作成したブループリントFor Each Loop からトランスフォームのZスケールに値を入れている部分に対数を追加します。しかしこれだけでは値が小さくなりすぎるので適当な数値をかけてやります。

この数値は後でいじれるように変数化してインスタンス編集可能にします。

f:id:yeczrtu:20191204210846j:plain

対数の底にネイピア数を入れていますが底は何でもいいです。

Logの前にMax 1 を入れてオーバフローを防ぐ処理を忘れずに追加してください。

 

Logの代わりにClampを使うのもありだと思います。この辺は好みの問題もあると思うのでどれがいいが自分で試して決めてみてください。

(音が出ます)


そのまま、Logあり、Clampあり

Clampを使う場合の処理です。

f:id:yeczrtu:20191204213121j:plain

Clamp

 

これで直線形の処理は終わりなので確認用のブループリントを張っておきます。(コピペもできます。)

イベントグラフ

コンストラクションスクリプト

  次にマテリアルの設定をしていきます。

コンテンツブラウザの適当な場所で右クリックからマテリアルを作成してダブルクリックで開いてください。

簡単なグラデーションをする処理を書いていきます。

始めにTime、Sine、ConstantBiasScaleを追加します。

f:id:yeczrtu:20191204231457j:plain

Timeで受け取った時間をSineで-1~1の正弦波に変えて、ConstantBiasScaleで0~1の値にしています。

 このConstantBiasScaleというノードは入力値に1を加算して割る2を返すノードです。(つい最近までこのノードを知らず、毎回+1してから0.5を掛けるという処理を書いていました。)

 

 この値でLerpしてグラデーションをするので次に3ベクターとLerpを追加します。

3ベクターはキーボードの3を押しながら左クリックで出せます。LerpはLと左クリックで出せます。

 

f:id:yeczrtu:20191204232715j:plain

 次にこの3ベクターインスタンスで編集できるようにパラメータ化しておきます。(右クリックからパラメータに変換)

 それっぽい色を選んだらMakeFloat3を使ってグラデーションする色を作っていき、Lerpにつなぎます。

f:id:yeczrtu:20191204233212j:plain

次に光る強さを設定します。 Sキーと左クリックでパラメータを出してLerpとMultiply

 してエミッシブカラーにつなぎます。

f:id:yeczrtu:20191204233936j:plain

 

 これで光ったと思いますがグラデーション速度が速いのでSineをクリックして左下の詳細タブから周期を変更しておきます。

f:id:yeczrtu:20191204234213j:plain

これでいい感じになったと思います。

ついでにもう一色追加してみました。

f:id:yeczrtu:20191204234544j:plain

マテリアルはできたので適用を押してからコンテンツブラウザに戻りこのマテリアルを右クリックしてマテリアルインスタンスを作っておきます。

マテリアルインスタンスができたらサウンドビジュアライザーのブループリントを開き

InstancedStaticMeshのマテリアルに設定します。

f:id:yeczrtu:20191204235036j:plain

これで直線形は完成です。

早速レベルで確認してみましょう。

 (音が出ます)


レベル上で確認

後はパラメータをいろいろいじって自分好みにしてください。

 

それではここから円形を作っていきます。

(音が出ます)


円形

まずは動画の左側のものを作っていきます。

 作ると言っても棒を動かすロジックは直線形と同じですのでコンストラクションスクリプトを変えるだけです。

新たにブループリントを作ってもいいのですが、私は1つにまとめたいのでそのための下準備をしていきます。(コピペしてコンストラクションスクリプトだけ書き換えるという人は読み飛ばしてください。)

 

 棒のタイプを選択できるように列挙型(Enum)を作っていきます。

コンテンツブラウザから右クリック、ブループリントから列挙型を作ります。

 ダブルクリックで開いたら右上の新規を押して名前を定義していきます。

(直線と円を追加しました。)

f:id:yeczrtu:20191205190248j:plain

 名前を付けたらサウンドビジュアライザのブループリントのコンストラクションスクリプトに戻ってSelectノードを追加します。Indexには先ほど作った列挙型を選択します。(作った列挙型の名前 で検索すると出てきます。)

f:id:yeczrtu:20191205190703j:plain


あとはIndexを変数に昇格してインスタンス編集可能にすることで詳細タブから棒のタイプを選択できるようになっていると思います。

 f:id:yeczrtu:20191205193218j:plain

 これからここを切り替えると形も変わるようにしていきます。

SelectノードをMake TransformとAdd Instanceの間につなぎます。

f:id:yeczrtu:20191205193525j:plain

これで直線形を選択したとき直線形に配置されるようになりました。

 

下準備が終わったのでここから円形に配置する処理を書いていきます。

円形

 円形に配置する処理は高校で習う円の媒介変数表示を使います。

半径rの円の媒介変数表示はx=rcosθ、y=rsinθ なのでこれをそのまま使います。

f:id:yeczrtu:20191205194748j:plain

三角関数はradiansとdegreesがありますが今回はdegreesを使います。半径になる変数は新たに作っておいてください。

次に棒がどの角度にあるのかを指定します。

Indexと棒の数で除してそれに360をかけてsinとcosにつなぎます。

この時Float型にしてからでないと正しい値にならないので注意してください。

f:id:yeczrtu:20191205200459j:plain

見づらくてすみません

これで円形に配置することはできますがこのままでは縦方向に棒が伸びるのでRotationの値をいじります。

Rotationのところで右クリックして構造体ピンを分割してPitchを変数化します。この値が伸びる方向になります。ついでに中心を向くようにしておきます。

 

最後にMake TransformのピンをSelectノードの円につなげば完成ですが、

f:id:yeczrtu:20191205223702j:plain

とりあえずこの状態でレベル上で確認してみると

 (音が出ます)


何故かおかしな方向に棒が向いている

 

方向を90度に設定したはずが何故かおかしな方向を向いてしまうのでこれを修正していきます。

イベントグラフに移ってUpdate Instance TransformにつながっているZスケールとLerpの間にMaxを追加してスケールが0になることを回避します。

f:id:yeczrtu:20191205230857j:plain

Maxには0.001を入れました。

これで再度確認してみると

(音が出ます)


スケールが0になるのを回避した様子

 

うまくいきました!

パラメータをいい感じに調整すると最初の動画の左側のと同じものを作れます。

 

円形のコンストラクションスクリプトを載せておきます。

 円形の配置ができたので今回はここまでにします。

 

次回は最初の動画右側のような片方だけに伸びるものとグリッド状のものを作っていく予定です。

次回もよろしくお願いします。

 

続き

 

yeczrtu.hatenablog.com