我正在开发一个AR Kit应用程序,其中一架飞机被放置在一个表面上的用户定义点之间 . 目前,平面在形状和大小方面正确创建,但未在AR空间中以正确的方向放置 . 如何以一种将它放置在设定点的方式镜像节点?

这是当前状态的图像 . 注释如下:

  • Blue :设定点数

  • Green :成品和放置形状的角落

  • White :应该镜像形状的线,以便正确放置

Screenshot from the app

在技术方面,我做了以下事情:

  • 设置AR Kit应用程序,如果用户触摸屏幕上的位置,则在特征点顶部创建节点(带蓝色球体)

  • 将节点的x和z值存储在CGPoints数组中(z变为y)

  • 从数组中的所有值中减去第一个节点的x和y,因此第一个点变为0点

  • 创建连接阵列中所有点并关闭它的CGPath

  • 使用CGPath创建SCNShape

  • 使用SCNShape创建SCNNode

  • 使用SCNMatrix4Rotation旋转SCNNode的轴,使其平放

  • 在屏幕被点击的第一个节点(屏幕截图中的位置1)的位置添加新的SCNNode到场景

这是从3到7的代码(其余的,我认为,发布的内容太多了 . 但是可以自由地要求它):

normalizePoints()
let path = UIBezierPath()
path.move(to: CGPoint(x: points!.first!.x, y: points!.first!.y)) // jump to start position
for point in points! {
    if point != points!.first! { // skip first point since it's the start position
        path.addLine(to: point)
    }
    if point == points!.last {
        path.addLine(to: CGPoint(x: points!.first!.x, y: points!.first!.y)) // last point gets connected to first
    }
}
let line = SCNShape(path: path, extrusionDepth: CGFloat(0))
line.firstMaterial?.diffuse.contents = UIColor.green
lineNode = SCNNode(geometry: line)
// rotate shape so it lays flat
//amid in the -z direction
lineNode!.pivot = SCNMatrix4MakeRotation(Float(M_PI_2), 1, 0, 0)
let first = SCNNodePoints!.first!
let position = SCNVector3(first.position.x, first.position.y, first.position.z)
lineNode?.position = position // place at first node
sceneView.scene.rootNode.addChildNode(lineNode!)

我已经尝试更改旋转矩阵的第一个参数,因此旋转270°而不是旋转90° . 然而,当我这样做时,形状变得不可见 .