在 WWDC 演讲中“使用 RealityKit 增强您的空间计算应用程序”。我们了解如何使用 RealityKit 创建门户效果。 Vision Pro 上的“遭遇恐龙”体验中也有一个类似的传送门,只不过该传送门允许实体伸出传送门之外。使用提供的示例代码,我无法复制这种效果。使用示例代码,任何伸出门户的东西都会被剪掉。
如何让实体以类似于“遭遇恐龙”体验的方式伸出门户?
我熟悉使用 OcclusionMaterial 创建门户的旧方法,但是如果相机进入 OcclusionMaterial 和实体之间(例如在门户后面行走),这可能会破坏效果,而我无法在“邂逅恐龙”体验。
如果有帮助的话:我注意到,如果你从传送门的边缘非常仔细地观察,岩石不会像恐龙那样伸出来;它们会像恐龙一样伸出来。岩石被削断。因此,恐龙的渲染方式有所不同。
我尝试按照 WWDC 演讲“使用 RealityKit 增强空间计算应用程序”中的描述来设置场景。我创建了一个门户,并为其提供了针对我的世界的 PortalMaterial 和 PortalComponent。我创建了一个世界并给了它一个 WorldComponent。我使用 content.add 将所有内容添加到场景中,并获得了与 WWDC 演讲相同的效果,但无法让实体伸出门户。调整 PortalComponent 的 ClippingPlane 似乎根本没有帮助。
为了重现类似的门户效果,我使用了一个由内墙(法线指向内)、外墙(法线指向外)和大象模型组成的模型。代码就这么简单:
import SwiftUI
import RealityKit
struct ContentView : View {
var body: some View {
RealityView { content in
if let portal = try? await Entity(named: "portal") {
portal.scale *= 5
portal.position.z = -2
content.add(portal)
// There are 3 models inside – inner, outer, elephant
print(portal)
let inner = portal.findEntity(named: "inner") as! ModelEntity
var pbrMaterial = PhysicallyBasedMaterial()
pbrMaterial.faceCulling = .none
pbrMaterial.baseColor.tint = .systemRed
inner.model?.materials = [pbrMaterial]
let outer = portal.findEntity(named: "outer") as! ModelEntity
let occlusionMaterial = OcclusionMaterial()
outer.model?.materials = [occlusionMaterial]
let elephant = portal.findEntity(named: "elephant") as! ModelEntity
let goldenMaterial = SimpleMaterial(color: .yellow, isMetallic: true)
elephant.model?.materials = [goldenMaterial]
}
}
}
}
您可以从这里下载USDZ模型。