我正在开发一个AR Kit应用程序,其中一架飞机被放置在一个表面上的用户定义点之间 . 目前,平面在形状和大小方面正确创建,但未在AR空间中以正确的方向放置 . 如何以一种将它放置在设定点的方式镜像节点?
这是当前状态的图像 . 注释如下:
-
Blue :设定点数
-
Green :成品和放置形状的角落
-
White :应该镜像形状的线,以便正确放置
在技术方面,我做了以下事情:
-
设置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° . 然而,当我这样做时,形状变得不可见 .