VisionOS 中的 Model3D 和 RealityView 有什么区别?

P. *_*sin 4 swiftui realitykit visionos

我认为 RealityView 应该能够做更多奇特的事情,但我仍然想弄清楚它们之间的确切区别。目前,它们彼此太相似了,例如它们都需要一个实体名称来初始化。我想知道什么时候 Model3D 就足够了,什么时候必须使用 RealityView?

ARG*_*Geo 5

现实视图

\n

Apple 工程师的标准做法是为视图提供多个初始化程序。VisionOSRealityView也不例外。让我们看一下 RealityView 的init(make:update:attachments:)具有三个闭包的初始化程序,您可以在其中:

\n
    \n
  • 创建、设置和配置初始 3D 场景的内容(make关闭)
  • \n
  • 更新场景的内容以响应视图状态的变化(可选update关闭)
  • \n
  • 实现在 3D 场景中使用的附件视图的 ViewBuilder(attachments闭包)
  • \n
\n

还有带有占位符init(make:update:placeholder:)的初始化程序。

\n

使用 RealityView 在 RealityKit 应用程序中异步加载(这是一个可选操作)并显示丰富的 3D 内容。RealityView 将符合 RealityViewContentProtocol 的结构传递给makeupdate闭包,您可以使用它在场景中添加和删除 RealityKit 的实体。实体必须是.usdzReality Composer Pro 中的 3D 图元、模型或场景。

\n
RealityView { content, attachments in\n    // code\n} update: { content, attachments in\n    // code           \n} attachments: {\n    // code         \n}\n
Run Code Online (Sandbox Code Playgroud)\n

就像在 ARSCNView(它是 AR 和 VR 的 SceneKit 共生体)中一样,您不必使用锚点,但是,使用锚点使您有机会实现强大的 AR 场景 \xe2\x80\x93,例如image trackingplane trackinghand tracking, ETC。

\n

让我们看看 RealityView 在代码中的样子以及控制台中将打印什么基础对象:

\n
import SwiftUI\nimport RealityKit\n\nstruct ContentView: View {\n    var body: some View {\n        RealityView { content in\n            if let model = try? await Entity.load(named: "car") {\n                model.scale /= 10\n                \n                let anchor = AnchorEntity()\n                anchor.addChild(model)\n                content.add(anchor)\n                \n                print(content)\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

换句话说,RealityView它是 VisionOS SwiftUI 应用程序的 RealityKit 视图,您可以在其中访问场景的集合点。并且不要忘记锚点是RealityView层次结构的重要组成部分,而 Model3D 中的情况并非如此。

\n

在此输入图像描述

\n
\n
\n

模型3D

\n

SwiftUI 的 Model3D 视图比 RealityView 更简单,用于从指定的 URL(.usdz.reality多个模型)或应用程序的包异步加载和显示模型。在模型加载之前,SwiftUI 会显示一个占位符。生成的模型包含在ResolvedModel3D视图中。使用 Model3D 视图时,您无法像在 RealityView 中那样分解 3D 场景。

\n
Model3D(url: url) { phase in\n    if let model = phase.model {\n        // code\n    } else if phase.error != nil {\n        // error description    \n    } else {\n        // placeholder\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

就像 RealityView 一样,Model3D 视图也有几个初始值设定项。

\n

让我们看看init(named:bundle:content:placeholder:)带有占位符@ViewBuilder 的初始化程序在代码中的外观以及控制台中将打印什么基础对象:

\n
import SwiftUI\nimport RealityKit\n\nstruct ContentView: View {\n    var body: some View {\n        Model3D(named: "car") { model in\n            model.resizable()\n\n            let _ = print(model)\n        } placeholder: {\n            ProgressView()\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

换句话说,Model3D是 SwiftUI 的 3D 视图包含 RealityKit 的场景。

\n

在此输入图像描述

\n