swift 如何使用SceneKit编辑器创建AR Portal效果?

omvjsjqw  于 2023-05-21  发布在  Swift
关注(0)|答案(1)|浏览(138)

我想创建一个原型like this one:使用Xcode SceneKit编辑器。我找到了一个answer,其中房间是通过简单的SCNPlane对象以编程方式创建的,并根据渲染顺序进行处理。
然而,我想把一些更详细的东西放在一起,比如下载房间的3d模型,并使其只能通过门户网站访问。我试图直接在Xcode的SceneKit编辑器中实现相同的效果,转换这部分:

// a. Create The Left Wall And Set its Rendering Order To 200 
// Meaning It Will Be Rendered After Our Masks
let leftWallNode = SCNNode()
let leftWallMainGeometry = SCNPlane(width: 0.5, height: 1)
leftWallNode.geometry = leftWallMainGeometry
leftWallMainGeometry.firstMaterial?.diffuse.contents = UIColor.red
leftWallMainGeometry.firstMaterial?.isDoubleSided = true
leftWallNode.renderingOrder = 200

// b. Create The Left Wall Mask And Set its Rendering Order To 10 
// Meaning It Will Be Rendered Before Our Walls
let leftWallMaskNode = SCNNode()
let leftWallMaskGeometry = SCNPlane(width: 0.5, height: 1)
leftWallMaskNode.geometry = leftWallMaskGeometry
leftWallMaskGeometry.firstMaterial?.diffuse.contents = UIColor.blue
leftWallMaskGeometry.firstMaterial?.isDoubleSided = true
leftWallMaskGeometry.firstMaterial?.transparency = 0.0000001
leftWallMaskNode.renderingOrder = 10
leftWallMaskNode.position = SCNVector3(0, 0, 0.001)

编辑器中的两个平面:

我为它们设置了isDoubleSidedrenderingOrder,我使第二个透明(在漫反射颜色上使用alpha)。
不幸的是,在AR模式下显示时,它不起作用。

6l7fqoea

6l7fqoea1#

ARKit + SceneKit

一个类似ARPortal场景的虚拟世界必须被3D墙阻挡。这面墙必须有一个开口,入口在那里,通过它你可以看到门户的3D对象。墙的材质为Occlusion材质。这种类型的材质是一种 * 不可见 * 材质,它隐藏了3D对象,但显示的是来自iPhone AR摄像头的视频。SceneKit没有现成的材质,所以让我们创建它。

此代码演示了如何以编程方式将Occlusion材质指定给SceneKit对象:

portalPlane.geometry?.materials.first?.colorBufferWriteMask = [] 
portalPlane.geometry?.materials.first?.readsFromDepthBuffer = true
portalPlane.geometry?.materials.first?.writesToDepthBuffer = true
portalPlane.renderingOrder = -100

下图显示了如何在Xcode的Material Inspector中设置属性:

下图显示了如何在Node Inspector中设置属性:

另一方面,要退出门户,您需要一个三维对象,如门。门的多边形法线应指向内,带有洞口的墙的多边形法线应指向外。两个对象的材质都是单面的。

RealityKit

在RealityKit中,您可以使用开箱即用的遮挡材料。

portalPlane.model.materials[0] = OcclusionMaterial()

相关问题