我想创建一个原型像这个:仅使用 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)
在编辑器中分成两个平面:
我负责设置isDoubleSided
and renderingOrder
对于它们两个,我将第二个设为透明(在漫反射颜色上使用 alpha)。
不幸的是,当以 AR 模式显示时,它不起作用。
ARKit + 场景套件
ARPortal 类场景中的虚拟世界必须通过 3D 墙来阻挡用户。这面墙必须有一个开口,即入口所在,通过它您将看到门户的 3D 对象。墙体的材质是Occlusion
材料。这种类型的材料是无形的隐藏在其后面渲染的 3D 对象的材质,但显示来自 iPhone 的 AR 摄像头的视频。 SceneKit 没有现成的这样的材质,所以让我们来创建它。
此代码展示了如何以编程方式将遮挡材质分配给 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 中设置属性:
另一方面,要退出门户,您需要一个 3D 对象,例如门。门的多边形法线应指向内,带有开口的墙壁的多边形法线应指向外。这两个物体的材质都是单面的。
现实套件
在 RealityKit 中,您可以开箱即用地使用遮挡材质。
portalPlane.model.materials[0] = OcclusionMaterial()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)