ios - 如何通过 touchesMoved 方法获取用于在场景 View 上绘制 UIBezierpath 的准确 CGpoint?

标签 ios scenekit arkit uibezierpath swift4.2

UIBezierpath 显示在现实世界的其他地方

从下面的代码收集 CGPoint

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let location = touches.first?.location(in: self.sceneView) else {
            return
        }
        arrayCGPoints.append(location)
    }

& 使用下面的代码显示 Bazierpath

func updateBazierPath(){        

        if arrayCGPoints.count > 0 {

            let bezierPath = UIBezierPath()

            var i : Int = 0
            for varPoint in arrayCGPoints{

                if i == 0 {
                    bezierPath.move(to: varPoint)
                }
                else{
                    bezierPath.addLine(to: varPoint)
                }
                i += 1
            }
            bezierPath.close()
        }
        // Add shape
        let shape = SCNShape(path: bezierPath, extrusionDepth: 0.2)
        let shapeNode = SCNNode(geometry: shape)
    self.sceneView.scene.rootNode.addChildNode(shapeNode)

        shapeNode.geometry?.firstMaterial?.isDoubleSided = true
        shapeNode.geometry!.firstMaterial?.diffuse.contents = UIColor.blue
        shapeNode.position.z = -0.2
        shapeNode.eulerAngles.x = -.pi / 2
    }

还尝试将 CGPoints 转换为米

arrayCGPoints.append(CGPoint(x: location.x/100, y: location.y/100))

还是不行

最佳答案

这将绘制一个节点@ 0,0,0,其中包含人物拖动的轮廓,将屏幕坐标转换为世界坐标。我创建了一个单独的 SCNVector3 数组,它们是 3d 空间中的坐标(您可以在屏幕上的这些点上放置一些节点来证明位置)。另请注意附加的是 x,z,z (不是 scenepoint.y)。我的相机从 0,15,0.1 开始观察 0,0,0。这至少可以让您直观地了解 z 发生的情况,并希望能够回答您提出的问题。

如果您希望生成的形状与用户触摸的位置精确对齐,这里无法解决这个问题。

var shapeNode = SCNNode()

func updateBazierPath()
{
    for vPoints in arrayCGPoints
    {
        let projectedPoint = gameScene.projectPoint(SCNVector3(0, 0, 0))
        let scenePoint = gameScene.unprojectPoint(SCNVector3(vPoints.x, vPoints.y, CGFloat(projectedPoint.z)))
        scenePoints.append(SCNVector3(scenePoint.x, scenePoint.z, scenePoint.z))
    }
    let bezierPath = UIBezierPath()
    bezierPath.move(to: CGPoint(x: CGFloat(scenePoints[0].x), y: CGFloat(scenePoints[0].y)))
    for vCount in 1...scenePoints.count - 1
    {
        bezierPath.addLine(to: CGPoint(x: CGFloat(scenePoints[vCount].x), y: CGFloat(scenePoints[vCount].y)))
    }
    bezierPath.close()

    shapeNode.removeFromParentNode()
    let shape = SCNShape(path: bezierPath, extrusionDepth: 0.5)
    shapeNode = SCNNode(geometry: shape)
    shapeNode.geometry?.firstMaterial?.isDoubleSided = true
    shapeNode.geometry!.firstMaterial?.diffuse.contents = UIColor.yellow
    //let action = SCNAction.repeatForever(SCNAction.rotate(by: .pi, around: SCNVector3(1, 0, 0), duration: 5))
    //shapeNode.runAction(action)
    shapeNode.position = SCNVector3(0, 0, 0)
    shapeNode.eulerAngles.x = -.pi / 2
    gNodes.gameNodes.addChildNode(shapeNode)
}

关于ios - 如何通过 touchesMoved 方法获取用于在场景 View 上绘制 UIBezierpath 的准确 CGpoint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56016243/

相关文章:

ios - 在 iOS 设备中滚动时粘滞按钮闪烁

ios - 如何打开 Podfile 进行编辑

ios - GameplayKit 中的 GKS 文件是什么?

ios - 访问 SCNSphere 属性

ios - 如何检查 iOS 11 安装的设备是否支持 ARKit?

ios - 在城市中共享 3D 对象并让人们使用 ARKit 看到它们

swift - RealityKit——在检测到的平面上可视化网格

ios - 尝试将平移手势应用于 UITableViewCell 但失败了,为什么?

ios - 在手动保留 Release模式下是否有可能合成/释放弱属性

ios - 将 "SCNScene"转换为 "SCNNode"