3.9K Views
November 27, 23
スライド概要
■概要
タイトルでよく使用されるキャラクターの作りに合わせた揺れもの(チェイン、クロス)共通のコリジョンシステムについて紹介します。
背景としてタイトルにおけるキャラクターの構造や揺れものの使い分けなどについて簡単に説明した後、本システムの導入によるワークフローの改善やコリジョンのフィルタリングシステムの工夫について紹介します。
※CAPCOM Open Conference Professional RE:2023 で公開された動画を一部改変してスライド化しております。
■想定スキル
特になし
詳細は下記公式サイトをご確認ください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CAPCOM Open Conference Professional RE:2023
https://www.capcom-games.com/coc/2023/
カプコンR&Dの最新情報は公式Twitterをチェック!
https://twitter.com/capcom_randd
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Copyright (c) .NET Foundation and Contributors
Released under the MIT License: https://opensource.org/license/mit/
株式会社カプコンが誇るゲームエンジン「RE ENGINE」を開発している技術研究統括によるカプコン公式アカウントです。 これまでの技術カンファレンスなどで行った講演資料を公開しています。 【CAPCOM オープンカンファレンス プロフェッショナル RE:2023】 https://www.capcom-games.com/coc/2023/ 【CAPCOM オープンカンファレンス RE:2022】 https://www.capcom.co.jp/RE2022/ 【CAPCOM オープンカンファレンス RE:2019】 http://www.capcom.co.jp/RE2019/
揺れもの共通 キャラクターコリジョンシステム 揺れもの共通キャラクターコリジョンシステムのセッションを始めさせていただきます。 -------Copyright (c) .NET Foundation and Contributors Released under the MIT License: https://opensource.org/license/mit/ ©CAPCOM 1
アジェンダ 揺れもの キャラクターの構造 揺れもの共通コリジョンシステム 装備の重複コリジョン問題と解決策 まとめ アジェンダです。 このセッションではまずキャラクターで使用される揺れものと、その問題点について説明します。 次にその解決策として導入した共通コリジョンシステムについて紹介します。 ©CAPCOM 2 2
揺れもの まずは「揺れもの」についてお話しします。 3 ©CAPCOM 3
揺れものとは 物理シミュレーションで動くソフトボディ(ひも、布など) RE ENGINEではChain、Clothの2種類 一般的に揺れものとは、物理シミュレーションによって動くソフトボディのことを指すことが多いかと思われます。 RE ENGINEでは内製の揺れものとして2種類のパターンが用意されています。 主にひも状の物体に使われる”Chain”と布状の物体に使われる”Cloth”です。 4 Chain、Clothが使われる場面は幅広く、衣服はもちろんのこと、 カーテンや天井からぶら下がった鎖などインタラクトできる背景に使われることも多いです。 今回はその中でも特に装備や髪などキャラクターで使用される揺れものを対象にお話しします。 ©CAPCOM 4
揺れものの使い分け 実行時パフォーマンス …Chain > Cloth 挙動のそれらしさ …Cloth > Chain Chain Cloth 髪、装備の 小物など ローブ、 スカート など 次にRE ENGINEにおける揺れもの同士の使い分けについてお話しします。 Chainは1次元の形状に絞ってシミュレーションすることで処理を高速化しています。 疑似的に2次元形状のシミュレーションもできますが、やや簡易的なものになります。 5 Clothは2次元形状のシミュレーションを行いChainよりリッチな表現が可能ですが、その分処理負荷は高いです。 実際のタイトルでは、Chainは主にキャラクターの髪や装備の小物に使用されています。 Clothはキャラクターの装備のうち、より布っぽい挙動が重要なもの、例えばスカートやローブなどに使用されています。 このように弊社のゲーム開発では、両者のメリットデメリットを考え組み合わせて使われています。 ©CAPCOM 5
揺れものとコリジョン 従来は揺れものアセットごとにコリジョンを設定 コリジョンを設定 次に揺れものとコリジョンの関係についてお話しします。 装備などに揺れものを使用する場合、揺れものアセットごとにコリジョンを設定する必要があります。 6 パフォーマンス上の理由で、一般的な当たり判定用のコリジョンとは別に専用のコリジョンを用意しています。 例えば左の画像はワンピースの装備のClothアセットですが、 キャラクターにめり込まないように脚のコリジョンを設定しています。 実際にClothを動作させてみると、揺れものがコリジョンと衝突していることが分かります。 従来はこのようにそれぞれのアセット毎にコリジョンを設定していました。 ©CAPCOM 6
コリジョン重複問題 ChainアセットとClothアセットでコリジョンが重複 Chain Cloth ここで問題となっていたのが、Chain、Clothアセットで同じコリジョンを設定するケースが多発したことです。 単純に無駄な手間が発生していただけではありません。 7 例えばキャラクターの体型を後から変更することになった際に、 片方のコリジョンしか編集しないミスが発生するリスクもありました。 このように揺れもののコリジョンには、避けられないワークフロー上の問題が存在していました。 ©CAPCOM 7
キャラクターの構造 また、揺れもののコリジョンには重複以外にも問題がありました。 弊社でよく利用されるキャラクターの構造に由来する問題です。 8 次はこのキャラクター構造について説明します。 ©CAPCOM 8
カプコンにおけるキャラクターの構造 ゲームオブジェクトの親子構造 ※一例 Base Head Hair Helm Topsを入れ変えて 装備を切り替える Tops Pants Mantle Sword 弊社ではキャラクターのゲームオブジェクトの構造として、左の図のような親子構造を採用していることが多いです。 ベースとなるようなゲームオブジェクトの子として各部位の装備や武器などのゲームオブジェクトが設定される構造になっています。 9 このような構造になっている理由としては、装備切り替えへの対応が大きいです。 ゲームオブジェクトの組み合わせで装備を表現することで、簡単に装備切り替え処理を実現できます。 ©CAPCOM 9
アセット内コリジョンの問題点 Base Tops 脚コリジョンの形状は 揺れものアセット作成段階では不確定 Pants … この構造を利用する上で問題となるのが、装備の組み合わせによってコリジョンを変更する必要があるということです。 例えばこの画像のTopsのように前垂れがついている装備のことを考えます。 10 前垂れの部分は揺れものになっています。 この前垂れはキャラクターの脚と接触する可能性があるため、揺れものアセットには脚のコリジョンを設定する必要があります。 ここで脚のコリジョン形状は脚装備によって変化することにお気づきになるかと思います。 しかしアセット作成時にはどの脚装備と組み合わせられるか不明なため、コリジョンを設定できないという問題が発生します。 従来はこの問題に対して、脚装備の見た目をある程度揃えておき、同じコリジョン形状を使用することで解決していました。 しかしこの方法ではどうしても脚装備の見た目に制約が発生してしまいます。 ©CAPCOM 10
揺れもの問題まとめ 問題点 1. Chain、Clothでコリジョンが重複 2. 他の装備のコリジョンを利用できない ここでキャラクターの揺れものの問題点をまとめます。 まずChain、Clothアセット内でコリジョンの重複が発生しやすく、ワークフローに無駄や不具合発生リスクが存在していたこと。 11 そしてキャラクターの構造上、他の装備のコリジョンなど、 オフラインで設定されるコリジョンだけでは対応できないケースが存在する可能性があること。 これらの解決策として今回紹介する揺れもの共通キャラクターコリジョンシステムを導入しました。 ©CAPCOM 11
揺れもの共通コリジョンシステム それではここまでの背景を踏まえ、今回導入した揺れもの共通のコリジョンシステムについて紹介します。 12 ©CAPCOM 12
揺れもの共通コリジョン① コリジョンをゲームオブジェクト単位で管理 • 専用コンポーネントに共通コリジョンアセットをセット • 揺れものコリジョンを一元化 専用コンポーネントにアセットをセット 共通コリジョンアセットを作成 共通コリジョンシステムには、先ほどお話しした問題に対する解決策として、大きな特徴が2つあります。 まず1つ目の特徴が、コリジョンの管理方法です。 13 各々アセット内でコリジョンを管理する方式ではなく、コンポーネント単位で管理する形に変更しました。 これはゲームオブジェクト単位と言い換えることもできます。 コリジョンは揺れものとは独立した共通コリジョンアセットとして別途作成し、それを専用のコンポーネントにセットします。 揺れものがコリジョンを利用する際は、このコンポーネント経由で共通コリジョンを参照する形にします。 これにより揺れもので利用するコリジョンを一元化することができました。 ©CAPCOM 13
揺れもの共通コリジョン② 親兄弟のコリジョンも利用可能 別部位の装備のコリジョンを利用できる Base Tops ※多階層になることもあるため 正確には同じ連結成分内の コリジョンを利用可能 Pants コリジョンを 共有 2つ目の特徴はコリジョンの共有です。 自分自身だけでなく、親兄弟のゲームオブジェクトのコリジョン形状も利用できるようにしました。 これによって、他の部位のコリジョンも利用できるようになります。 14 例えば、先ほどと同じように前垂れのある腰装備のことを考えます。 親兄弟のコリジョンも利用できるようになったことで、脚装備に応じて脚コリジョンを利用できるようになります。 なお実際のキャラクターは単純な親子構造ではなく、孫、ひ孫の階層を持つことが多いです。 そのため正確には、専用コンポーネントで形成される連結成分内のコリジョンを共有するという仕様になっています。 ©CAPCOM 14
装備の重複コリジョン問題と解決策 次に共通コリジョンシステムの導入にあたり、課題となっていたこととその解決策についてお話しします。 15 ©CAPCOM 15
共通コリジョンの問題点 同じ部位のコリジョンが重複 Base 腰や脚のコリジョンが BaseとPantsで重複 Tops or Pants ->コリジョンの優先度を 決める仕組みが必要 親兄弟のコリジョンも利用できるコリジョン収集機能には1つ課題がありました。 例えば先ほどの例のような装備の組み合わせの場合、脚や腰のコリジョンが重複してしまっています。 16 同じ部位のコリジョンが重複していると無駄な処理が走ることに加え、 揺れもののシミュレーションの不安定化を招く恐れもあります。 したがってこのようなケースでは、コリジョン同士に優先順位をつけて不要なものを除外しなくてはなりません。 この課題の解決策としてTagとPriorityという仕組みを導入しました。 ©CAPCOM 16
Tag コリジョン形状ごとに部位を指定する仕組み Head L_Arm_Upper Spine_1 Hip 部位の分け方を定義したアセットを作成 コリジョン形状ごとにTagを設定 まずはTagについて説明します。 Tagはコリジョン形状ごとに、どの部位にあたるかを指定する仕組みです。 まずTagの分け方を定義したTagアセットを作成し、 これを共通コリジョンアセットに設定することで形状ごとのTagの設定が可能になります。 17 Tagは体の部位だけでなく、武器や地面用のものを作成して使用することもあります。 ©CAPCOM 17
Priority 形状の優先を決定するための仕組み ゲームオブジェクト(コンポーネント)単位で設定 設定されたアセット内の全形状が Priority=6として扱われる 次にPriorityについて説明します。 Priorityはコリジョン形状の部位が重複した際に不要な形状を除外するための仕組みです。 18 Priorityはコンポーネント単位で設定します。 形状収集の際、そのコンポーネントに設定されたアセット内の全ての形状がそのPriorityを持つ形状として扱われます。 ©CAPCOM 18
Tag、Priorityによる収集形状の選択 Base Tops Pants 脚Tagのコリジョンが 重複 それではTagとPriorityを用いたコリジョン形状の取捨選択の仕組みについて、先ほどの例のキャラクターを使いながらお話しします。 まずコリジョンごとにTagを設定します。 実際にはもっと細かいTag分けが行われていますが、 今回は説明のため大雑把に頭、胴、腕、脚の4つのTagに分けられているとします。 19 ピンク色が頭、青色が腕、緑色が胴、赤色が脚のTagを表しています。 Tops装備の揺れものは、脚Tagの設定されたコリジョンと衝突しそうです。 ここで赤色のコリジョンに注目していただくと、脚Tagコリジョンはベースのものと、脚装備のものの2種類があります。 このままでは脚Tagのコリジョンが重複してしまっているため、優先度を設定して適切にコリジョンを選択する必要があります。 ©CAPCOM 19
Tag、Priorityによる収集形状の選択 Tops Base Priority=0 Priorityに応じて コリジョンを選択 Pants Priority=1 本システムでは、各Tagごとに最高Priorityを持つ形状のみを収集する仕様になっています。 仮にBaseにはPriority=0を設定し、PantsにはPriority=1を設定したとします。 20 各TagごとにPriority最高のコリジョンのみを利用できる仕様なので、 今回はPantsのものが優先され、Baseの脚コリジョンは除外されます。 最終的に取捨選択されたコリジョンを見ると、脚のコリジョンが脚装備のものになっていることが分かります。 このように、各装備のPriorityをベースとなる親よりも高い値に設定するような使い方を想定しています。 各装備のコリジョンのTagに「消したい親のTag」を設定することで、そのコリジョンを残すか否か選択できるようになります。 ©CAPCOM 20
揺れもの側のコリジョンフィルタリング 基本的にTagでフィルタリング • (例)マント->腰や腕のTagを設定 • フィルタリングの設定は揺れものアセット上で行う 後からTagを追加した場合… • 全ての揺れものアセットの編集が必要! ->TagGroupという仕組みを導入 最後にChain、Cloth側のコリジョンのフィルタリングについてお話しします。 揺れもの側では基本的にTagに基づいてコリジョンのフィルタリングを行います。 21 例えばマントのClothであれば、上半身と衝突してほしいので 腰や腕のTagを設定するようなイメージです。 ただ、Tagを直接指定する形にすると少し面倒なことが起こる可能性があります。 仮に後になってからTagを追加することになったとします。 この場合、全ての揺れものアセットのTag設定を編集しなくてはなりません。 揺れものアセットは1つのタイトルで合計600個程度になることもあるので、これは大変な作業になってしまいます。 この作業を少しでも軽減するために、TagGroupという仕組みを導入しました。 ©CAPCOM 21
TagGroup 揺れものアセット側では TagではなくTagGroupを指定 TagをまとめたTagGroupを定義する TagGroupは複数のTagをまとめて名前を付けただけのシンプルなものです。 例えば上半身を表すUpperBodyというTagGroupには、L_Arm_UpperやHeadなどのTagが含まれています。 揺れものアセット側からTagを指定する際は直接Tagを指定する代わりに、 TagGroupを指定して間接的にTagを指定するような仕組みにしました。 こうすることで後からTagの追加があったとしても、TagGroupアセットの編集だけで済むようになります。 22 仮に新しく「右肩、左肩」の2つのTagが追加されるとします。 この場合は、TagGroupアセットを編集して「上半身」のTagGroupに「右肩、左肩」のTagを追加します。 そうすることで、「上半身」のTagGroupが設定された揺れものに肩が衝突するようになります。 このとき揺れものアセット側には何の変更も加える必要はありません。 変更を加えるのはTagGroupアセットのみとなります。 ©CAPCOM 22
まとめ キャラクターの揺れものの問題 • Chain、Clothでコリジョンが重複 • 他装備のコリジョンを利用できない 共通コリジョンシステム • 共通コリジョンアセット • コリジョン管理は専用コンポーネントに一元化 • 他装備のコリジョンを利用可 Tag、Priority • 同じ部位で重複するコリジョンに優先をつける • TagGroupを使ってTagをまとめてフィルタリング このセッションのまとめです。 まずキャラクターの揺れものには2つの問題がありました。 23 異なる揺れものアセット同士でコリジョンが重複していることと、他の装備のコリジョンを利用できないことです。 これらの問題の解決策として共通コリジョンシステムを導入しました。 このシステムでは共通コリジョンアセットと専用コンポーネントを用いてコリジョンの管理を一元化し、重複問題を解決しました。 またヒエラルキー上で親兄弟の関係にあるコンポーネントのコリジョンも収集対象にしたことで、 他装備のコリジョンも利用できるようになりました。 同じ部位で複数のコリジョンを収集してしまう問題に対してはTagとPriorityを導入して対処しました。 またTagGroupという仕組みを使ってTagの追加をより容易にしました。 このセッションは以上となります。ご清聴ありがとうございました。 ©CAPCOM 23