Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

シューティングゲーム改: シーン再構築へのオクルージョンの追加 #1

Draft
wants to merge 1 commit into
base: step-up-base/version-1.0
Choose a base branch
from

Conversation

tomoto
Copy link
Collaborator

@tomoto tomoto commented Aug 21, 2024

注: このDraft PRは「さらにステップアップ」の説明用です。実際にマージを要求するものではありません。

概要

Chapter 8で作成した「シューティングゲーム改」では、シーン再構築により現実世界の物体が障害物となり、弾が跳ね返ったり転がったりといった振る舞いをします。しかし、弾やターゲットが障害物の背後にあっても透けて見えてしまい、不自然な体験になることがあります。これは、障害物が物体の運動にのみ影響を与えるように設定されており、背後にある物体を隠す設定(オクルージョンまたは陰面処理と呼ばれる)がなされていないためです。本ステップアップでは、オクルージョンを追加してこの問題を解決します。

差分の確認とコードの修正

Files changedタブを開き、差分を確認してください。これらの差分に従って、Chapter 8のコードを修正してください。差分があるのは下記3ファイルです。

  • ファイル project.pbxproj
    • 無視してください。次のファイル追加の際にXcodeにより自動的に書き換えられます。
  • ファイル MeshResourceExtension.swift
    • 新規ファイルです。XcodeでSwiftファイルを新規追加し、内容を転記してください。
  • ファイル SceneReconstruction.swift
    • run メソッド内のシーン再構築処理を変更します。+ で始まる行を追加、- で始まる行を削除してください。

動作確認

修正後、Vision Pro実機でアプリを実行してください。障害物の背後にある弾やターゲットが隠れて見えなくなることが確認できます。

うまく動かないなど、答え合わせが必要な人はこのリンクから本修正適用済みのアーカイブをダウンロードし、Chapter8 フォルダを参照してください。

解説

ソース差分上のコメントを参照してください。

Comment on lines 34 to +46
guard let shape = try? await ShapeResource
.generateStaticMesh(from: meshAnchor) else { continue }
guard let mesh = try? await MeshResource(
from: MeshResource.Contents(geom: meshAnchor.geometry)
) else { continue }
switch update.event {
// 障害物が新規に追加された場合
case .added:
// 追加された物体から障害物 Entity を作成、物理演算機能を追加
let entity = ModelEntity()
// 追加された物体から障害物 Entity を作成、隠面処理と物理演算機能を追加
let entity = ModelEntity(
mesh: mesh,
materials: [OcclusionMaterial()]
)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここが最も肝となる修正です。

SceneReconstructionProvider から得た MeshAnchor には現実の物体のかたちを表すメッシュ情報が格納されており、それをもとに ShapeResourceCollisionComponent を作成して衝突をシミュレートできるのは本誌で学んだ通りです。この修正ではさらに、このメッシュ情報を用いて MeshResource を作成し、障害物を表すエンティティのかたち(ModelEntitymesh 引数)に設定します。またエンティティのマテリアルを OcclusionMaterial (背後のオブジェクトを隠す不可視のマテリアル)に設定します。

MeshAnchor から MeshResource への変換は、ShapeResource とは異なり簡単な手段がないので(visionOS 1.2時点)、MeshResource.swift に自前の変換関数を用意して実現しています。

Comment on lines 60 to +63
case .updated:
// 物体の id を取得して形状と位置を更新
guard let entity = meshEntities[meshAnchor.id] else { continue }
entity.model?.mesh = mesh
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

認識される障害物のかたちは刻々と変化します。変化が検知されたらエンティティのかたちも忘れずに更新します。

@tomoto tomoto added the さらにステップアップ 「さらにステップアップ」説明用のPull Request label Aug 21, 2024
@tomoto tomoto marked this pull request as draft August 21, 2024 05:27
@tomoto tomoto force-pushed the step-up-occlusion branch from e4b6caa to c09cf66 Compare August 21, 2024 16:06
@tomoto tomoto changed the base branch from version-1.0-rc1 to step-up-base/occlusion August 21, 2024 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
さらにステップアップ 「さらにステップアップ」説明用のPull Request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant