Как получить точную CGpoint для рисования UIBezierpath на виде сцены из метода touchesMoved? - PullRequest
0 голосов
/ 07 мая 2019

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
    }

также пытался преобразоватьCGПункты в метрах

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

все еще не работает

1 Ответ

1 голос
/ 15 мая 2019

Это нарисует узел @ 0,0,0 с контуром того, из чего человека перетащили, переводя координаты экрана в мир.Я создал отдельный массив SCNVector3, которые представляют собой координаты в трехмерном пространстве (вы можете опустить несколько узлов на экране в этих точках, чтобы доказать позиции).Также обратите внимание, что добавление - это x, z, z (не scenepoint.y).Моя камера смотрит на 0,0,0 от 0,15,0,1.Это, по крайней мере, даст вам представление о том, что происходило с 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)
}
...