在ARKit水平面上绘制填充的多边形

时间:2018-08-22 14:43:55

标签: ios swift polygon arkit uibezierpath

在ARKit世界中,如何在检测到的水平面上绘制用户触摸的填充多边形连接点。

我继续通过将击中点保留在数组上来实现此目的...

let position = SCNVector3.positionFrom(matrix: result.worldTransform)
let sphere = SphereNode(position: position)
nodes.append(position)

...然后尝试绘制贝塞尔曲线路径

let bezierPath = UIBezierPath()
bezierPath.lineWidth = 0.1

for index in 0..<nodes.count {

    let node = nodes[index] as SphereNode
    if (index == 0) {

       let point = CGPoint(x: CGFloat(node.position.x), y: CGFloat(node.position.z))
       bezeierPath.move(to: point)


    } else {
       let point = CGPoint(x: CGFloat(node.position.x), y: CGFloat(node.position.z))
        bezeierPath.addLine(to: point)

     }

 }

bezeierPath.close()
bezeierPath.fill()
bezeierPath.stroke()

let shape = SCNShape(path: bezeierPath, extrusionDepth: 0.03)
shape.firstMaterial?.diffuse.contents = UIColor.red
let node = SCNNode.init(geometry: shape)
sceneView.scene.rootNode.addChildNode(node)

但这不会在正确的位置绘制多边形。它将它垂直拉到相机后面。

1 个答案:

答案 0 :(得分:0)

诸如SCNPlaneSCNTextSCNShape之类的2D几何形状本质上是垂直的,因为它们在xy平面上工作。在您的示例中,您将z 3D坐标用作y 2X坐标。

尝试将node.eulerAngles.x设置为-.pi / 2(如果没有-,请尝试将其设置为无效),并且您的节点将是水平的,而不是垂直的。