generated at
Adding 3D content to your appを読む
stereoscopic displayを持つデバイスでは、人々はより現実的に感じられる方法で3Dコンテンツを体験できる
visionOSのアプリを作成する際は、アプリのインターフェースに奥行きを加える方法を検討してください
システムは、既存のウィンドウ、ボリューム、没入型スペースなど、3Dコンテンツを表示するいくつかの方法を提供
アプリとその提供するコンテンツに最適なオプションを選択せよ

従来の2Dウィンドウに奥行きを追加する
Windowはアプリのインターフェースの重要な部分です。visionOSでは、アプリは自動的にvisionOSのルックアンドフィールを持つマテリアル、目と手の入力用にチューニングされた間隔を持つ完全にリサイズ可能なウィンドウ、カスタムコントロールのハイライト調整へのアクセスを取得します。
必要に応じてカスタムビューに深度効果を組み込み、3Dレイアウトオプションを使用してウィンドウ内のビューを配置します。
shadow(color:radius:x:y:)またはvisualEffect(_:)モディファイアをビューに適用します。
hoverEffect(_:isEnabled:)モディファイアを使用して、誰かがビューを見たときにビューを持ち上げたりハイライトしたりします。
ZStackを使用してビューをレイアウトします。
transform3DEffect(_:)を使用してビュー関連の変更をアニメーション化します。
rotation3DEffect(_:axis:anchor:anchorZ:perspective:)モディファイアを使用してビューを回転させます。
この時点ではこう言われても、どう実装するのが良いのか、何をしなければいけないのかがわからない基素
SwiftUIのAPIがいろいろある、ということがわかる
2Dビューにより多くの奥行きを与えることに加えて、2Dウィンドウに静的な3Dモデルを追加することもできます。
たとえば、ショッピングアプリでは、この種のビューを使用して製品の3Dバージョンを表示できます。
Model3Dビューは、USDZファイルまたは他のアセットタイプをロードし、ウィンドウ内の固有のサイズで表示します。
アプリ内にモデルデータがあるか、ネットワークからダウンロードする

RealityKitを使用して動的な3Dシーンを表示する

RealityKitは、画面上で動的に更新される3Dモデルとシーンを構築するためのAppleのテクノロジーです。
visionOSでは、RealityKitとSwiftUIを一緒に使用して、アプリの2Dコンテンツと3Dコンテンツをシームレスに結合します。
既存のUSDZアセットをロードするか、Reality Composer Proでアニメーション、物理学、ライティング、サウンド、カスタムビヘイビアを組み込んだシーンを作成します。
Reality Composer Proプロジェクトをアプリで使用するには、Swiftパッケージをプロジェクトに追加し、Swiftファイルでそのモジュールをインポートしてください。
詳細については、Xcodeプロジェクトでのファイルとフォルダーの管理を参照してください。
インターフェイスに3Dコンテンツを表示する準備ができたら、RealityViewを使用します
このSwiftUIビューは、RealityKitコンテンツのコンテナとして機能し、馴染みのあるSwiftUIテクニックを使用してそのコンテンツを更新できるようにします。

以下の例は、RealityViewを使用して3D球体を表示するビューを示しています。
ビューのクロージャ内のコードは、球体のRealityKitエンティティを作成し、球体の表面にテクスチャを適用して、球体をビューのコンテンツに追加します。
swift
struct SphereView: View { // Viewプロトコルの要件であるbodyプロパティを定義 var body: some View { // RealityViewを作成し、その内容を定義するクロージャ RealityView { content in // contentパラメータは、RealityKitのコンテンツを操作するために使用されます。 // ModelEntityは、RealityKitの基本的なオブジェクトで、3Dシーンに追加できます。 let model = ModelEntity( mesh: .generateSphere(radius: 0.1), materials: [SimpleMaterial(color: .white, isMetallic: true)]) // 作成したModelEntityインスタンスをRealityViewのコンテンツに追加 content.add(model) } } }

some Viewのsomeは、SwiftのOpaque Result Types(不透明な結果型)を示すキーワードです。
これは、関数やプロパティが特定のプロトコルに適合する何らかの具体的な型を返すことを示します
具体的な型はコンパイラによって推論され、呼び出し元のコードには公開されません
some View : someキーワードを使用することで、bodyは異なる具体的な型を返すことができますが、それらの型は全てViewプロトコルに適合していなければなりません
これにより、ContentViewの利用者はbodyがViewを返すことを知っていれば十分で、実際に返される具体的な型を知る必要がありません。

SwiftUIがRealityViewを表示すると、エンティティやその他のコンテンツを作成するためにコードを一度だけ実行します。
エンティティの作成はハイコストなため、このビューは作成コードを一度だけ実行します。
エンティティの状態を更新する場合は、ビューの状態を変更し、更新クロージャを使用してそれらの変更をコンテンツに適用します。
次の例では、更新クロージャを使用して、scaleプロパティの値が変更されたときに球の大きさを変更します。
swift
struct SphereView: View { var scale = false var body: some View { RealityView { content in let model = ModelEntity( mesh: .generateSphere(radius: 0.1), materials: [SimpleMaterial(color: .white, isMetallic: true)]) content.add(model) // update closure t } update: { content in if let model = content.entities.first { model.transform.scale = scale ? [1.2, 1.2, 1.2] : [1.0, 1.0, 1.0] } } } }

GPT-4oupdate:はRealityKitのコンテキストで使われるクロージャーで、シーンが定期的に更新されるたびに呼び出されるものです。