ARKit:遮挡平面中除参考图像以外的所有内容

时间:2018-12-03 22:49:22

标签: swift scenekit arkit

我有一个图像参考正在触发ARKit2上的体验,并且我想创建一个遮挡平面,该平面覆盖触发器周围的所有内容,除了触发器本身。代表性的是,它是这样的(将图像放置在平面下方以显示更好,但实际上是在同一水平上):

Need to create the occlusion plane shown on the top

到目前为止,我对像这样的常规形状进行遮挡没有问题:

func setOcclusionMaterial() {

    let occlusionPlane = SCNPlane(width: imageReference!.physicalSize.width, height: imageReference!.physicalSize.height)

    let holdout = SCNMaterial()
    holdout.isDoubleSided = true
    holdout.diffuse.contents = CIColor.black
    holdout.colorBufferWriteMask = SCNColorMask(rawValue: 0)
    occlusionPlane.firstMaterial? = holdout

    let occlusionNode = SCNNode()
    occlusionNode.eulerAngles.x = -.pi / 2
    occlusionNode.geometry = occlusionPlane
    node!.addChildNode(occlusionNode)

}

但是,我不确定如何创建一个不包含图像区域(圆圈)的平面。

我想做的是放置一个3D元素,该元素似乎位于触发器下方,但只有从上向下或略微倾斜才能看到。

希望这很清楚,如果您有任何想法,谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的代码不会对我造成阻碍,至少在我迅速聚集在一起的游乐场中不会如此。如果我的答案不能真正解决您的问题,也许您可​​以创建一个。

您必须在此处进行选择。可以在3D建模工具(如Blender)中创建自定义几何图形,也可以通过SCNGeometrySource手动创建几何图形,但这很麻烦,因为您将需要很多三角形才能使其正常工作。

您可以尝试将CALayer用作飞机的geometry: 创建一个CGPath,它是带有圆形切口(或您想要的任何形式)的矩形,然后从路径中创建一个CAShapeLayer

var path = CGMutablePath()

path.addRect(CGRect(x: 0, y: 0, width: 100, height: 100))
path.addEllipse(in: CGRect(x: 25, y: 25, width: 50, height: 50))

let layer = CAShapeLayer()
layer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
layer.path = path
layer.fillColor = UIColor.white.cgColor
layer.fillRule = .evenOdd 

我无法确认这是否确实有效,因为您的遮挡对我而言不是很有效。