- Part 1. 拡張できるサウンドへ
- Part 2. Crowd Soundboxシステム
- Part 3. 追加レイヤ
PLANET COASTER - 群衆オーディオ: PART 2
Crowd Soundboxシステムの導入
プリプロダクションの段階で、パークのゲスト1人1人にエミッタ―を付けるようなソリューションでは、何千人ものゲストが来園すると効率が悪いことがはっきりしてきました。そのようなシステムでは、パークに立ち寄るゲストが増えれば増えるほど、CPU負荷が急激に拡大します。
ゲームプレイやシミュレーションコードでも、群衆管理で同じような問題が発生します。そこでプログラマーたちは、画面に随時現れるゲストの人数を完全にシミュレーションする方法として、パス探索するのではなく、流体力学的なソリューションに行きつきました。詳しくは、このトピックについてプリンシパルプログラマーのオーウェン・マッカーシー(Owen McCarthy)が書いた記事がGamasturaに掲載されているので、ここで読んでください。
During pre-production, Frontier’s audio programmers worked closely with Owen to align our work with his. This allowed audio to decouple the ‘amount of CPU work’ from the ‘amount of guests’. Rather than placing a single emitter on each member of the crowd and filtering through the list to see where they are, audio code performs this step using data Owen had made available through a park-wide crowd grid.
群衆シミュレーショングリッドは、大きさが固定され、セルに分割されています。全てのセルをスキャンしてゲストがどこにいるかを把握する時間の長さも、固定です。両方の数値が固定されているので、処理負荷を複数のフレームに分散させればシステムの稼働を予想でき、遅延がやや増えてしまいますが、これも許容範囲内でしょう
オーディオのコンテンツ用に、群衆音の録音内容や密度を変えて、実験を重ねました。固定されたループを使うのではなく、細粒のような要素を集めて群衆を再現することを目指しました。オーディオデザイナーのマイケル・メイドメントが、プログラマーのダン・ムレイ(Dan Murray)やジョン・アシュビーと大量のテストを実行して、その実験結果から、群衆は(カメラ周りで)磁石の東西南北の方向に4つのエミッタ―を配置することで表現できると、私たちは判断しました。5つ目のエミッタ―を、パーク全体の人混みを表現するために追加しました。
さらに、私達が見つけたパフォーマンス対クオリティの最高の比率として、3つのオーディオアセットを群衆の大きさ別(大中小)に用意して、それを分けて群衆の構成人員(大人の男女、十代の男女、子ども)によって組み合わせを変えました。さらに細かく分けたいと思いましたが(おひとり、カップル、4人グループなど)、あまり効果的では無い事が分かりました。
Soundboxが、以上を全て合体させて、オーディオコンテンツとエミッタ―を結びつけます。このシステムはデータを利用して、エミッタ―を置く場所や、その瞬間に何をエミッタ―から再生するのかを、情報に基づいて判断します。
Soundboxのサイクルは、データを収集することから始まり、それを分析して群衆の密度、大きさ、構成員の多様性、場所、行動などの利用できる情報を探します。Soundboxがパーク全体に散らばる群衆を「見える」ようになり、カメラ周りの大体「正しい」位置に、これらエミッタ―を作って配置しました。
Soundboxはデータから音を作りだすので、従来のようにゲームオブジェクトに事前に備え付けてあるエミッタ―からオーディオコンテンツを引き出すのと違い、負荷を複数のフレームに分散でき、エミッタ―も使い回せ、スケール拡大で陥りがちな落とし穴を避けることができます。
群衆シミュレーショングリッド(crowd simulation grid)からのデータを抽出。群衆シミュレーショングリッド(黄色の四角)に、ゲスト位置の情報が入る。ゲスト密度はオーディオコードが抽出して、デバグレンダーが白色円グラフとして表示。エミッタ―(‘Close 1’から‘Close 4’まで)のポジションは、群衆の平均的密度がある場所。‘Far 1’はバックグランドレイヤで、カメラ周りのゲストだけでなくグリッド全体を考慮。
Crowd Soundboxは常にこの3つの手順を繰り返し、作業負荷を複数のフレームに分散させます。抽出(Extract)と処理(Process)が詳細であればあるほど、サイクルを一周するのに時間がかかりますが、出てくる音の精度がかなり高くなります。品質と更新スピードのバランスを見つけるのに、ユーザーの動かすカメラのスピードが影響しました。 ループで、エミッタ―のフレームは全てアップデートされ、同じタイムフレームで群衆グリッドの1/30が抽出・処理されます。完全なリフレッシュは、30 fpsで1秒かかります。
Soundboxは、以下のように、いくつかの面白いオーディオ問題を解決してくれます:
- 今あるデータから背景情報を入手するための、フレームワークを提供してくれます。
- ルールセットを1つのインターフェースを通して適用して、必要な場所ではそれらをダイナミックに変更できます。
- 今までのように、オーディオコードがゲームコード内のトリガーに基づいて音をスタートさせることはありません(これだと、あとからフィルターにかける必要がある場合も)。
- 群衆サイズに関わらず、処理量を予想しながら管理できるようになります。
データを活用して、仮想サウンドスケープに情報を送る
Crowd Soundbox: ムードとサイズ
ゲームプレイとアニメーションの目標の1つが、プレイヤーが自分のパークの人気具合を測れるように分かりやすい群衆を作り出すことで、自然とオーディオチームもその行動を表現したいと考えました。Soundboxがエミッタ―を配置する(同時に群衆の場所、大きさ、構成員を理解する)時、群衆の行動も知る必要があります。このような行動を‘moods(ムード)’と呼んでいます。
ムードのことを考え始めた当初、細かい粒度でアプローチしようとしました。例えば吐き気、退屈、興奮、混雑、行列など、沢山の可能性をあげていきました。ただし、ビジュアルに音を追加する時によくあることですが、逆効果の場合があります。退屈している(不平を言う)群衆はすぐにうっとおしく聞こえ、実験でもこれが証明されました。
ムード音はやめることにして、区別の方法として、喜んでいる群衆は盛り上げる一方、問題が発生した時に群衆が静かになる傾向を導入して、プレイヤーが自分で見に行くことを促しました。混雑や行列はジェットコースターのテーマパークで一般的に予想されるもので、私達が調査のために複数のパークを訪れると、人は並んでいる時に声が大きくなりがちだと分かり、これは多くの場合、うるさいアトラクションの近くにいるからでした。
オーディオで直接ムードをシミュレーションしなかったのは、もう一つ理由がありました。どのムードタイプも、グリッドの1つのセルで60%以上となることが稀(つまり、グループのゲストが必ずしも同じムードStateを共有するわけではない)ので、決定的な1つのムードを読み取れないことが多かったのです。異なるアセットを何種類も作成するか、Blend Containerを使うこともできましたが、両方とも十分な見返りもなく負担の高いソリューションだと判断しました。代わりにスレッショルドを使って、人々の40%が行列に並んでいれば、そのエミッタ―のオーディオを‘queue(行列)’に切り替えることにしました。
Wwiseで見る、群衆ムード(crowd mood)のSwitchの設定。 群衆サイズにBlend Containersを使う代わりに、ムード毎の必要最小限のサイズ変化を利用して、品質とコストのバランスを調整。Planco(Planet Coaster専用ランゲージで、シニアオーディオデザイナーのジェームス・スタント(James Stant)が発明))で、群衆ループに変化を加える。カメラがゲストの近くにある時の細かい会話には、同じ会話を使う。
データを活用して、仮想サウンドスケープに情報を送る
Crowd Soundbox: ポジショニングのエミッタ―
カメラ周辺にいる群衆をある程度正確に表現する4つのエミッタ―と、全体の群衆を表現する5つめのエミッタ―があれば十分だと証明されると、あとはエミッタ―を正しい位置に配置することに力を入れました。
エミッタ―を正しい位置に置くために、Soundboxが、群衆サイズの重心と東西南北の点を計算します。計算式は以下の通りです:
計算結果を使い、エミッタ―が正しい場所に配置されます。ゲストがカメラの左側に集中しているようであれば、エミッタ―を左の方に配置します。もしカメラ周りにゲストがバランスよく散らばっていれば、エミッタ―は直上にきます。
データを活用して、仮想サウンドスケープに情報を送る
Crowd Soundbox: スプレッドの計算
群衆エミッタ―を群衆全体の位置ではなく、重心の上に置くと、当然、外周部の問題が発生します。例えば、重心がリスナーの左にあっても、群衆がリスナーより右に広がることもあります。幸運にも、WwiseはSpreadを使ってこれに対処します。残念ながらSpreadは減衰カーブに固定されているので、Spreadを変えられない分、エミッタ―を変えます。そこで役に立つのが、エミッタ―をどの場所に置くのかを管理しているSoundoxです!
最初にSpreadを取得するために、コードがカメラの位置から重心に向き、一番外側の左端と右端を見つけます。弧を描くように周り群衆の90%を見つけるうちに、弧は、群衆がどれだけ散らばっているかを表し、使用できる良いSpread値に変換します。
上から見たリスナー(青い点)の近くの群衆(灰色の円)の図
Soundboxがポジショニングをコントロールする(結局、Soundbox内のエミッタ―はワールドのオブジェクトに紐づけられない)ので、ワールドのどこで出現するかを操作できます。この機能を利用してエミッタ―をカメラの近くや遠くに置き、減衰カーブによるSpread値を得るためだけに、距離のシミュレーションを行います。減衰カーブはSpreadに情報を提供するだけなので、実際のボリュームや距離の減衰は入っていません。
Wwiseでダイナミックなスプレッドをつくる。 減衰カーブを別目的で利用して、エミッタ―のポジションを操作してダイナミックなスプレッドをつくり出す。一方、実際の減衰は、RTPCでコントロールする。
エミッタ―がカメラから離れて行く時も、引き続き重心が軸となるので、常に正しい3D位置を保てます。方向性は私達の調整作業によって左右されませんが、正確な距離フィルターのために、修正した‘distance to listener(リスナーまでの距離)’の RTPCも送信して、ここに群衆の「実際の」距離が入ります。
次回のブログでは、Soundboxシステムのコアにバックグランドやフォアグラウンドのレイヤを追加した時にどうなるのかを見みます。
コメント