Неправильно повернутый SCNNode Swift - PullRequest
0 голосов
/ 02 апреля 2020

У меня странная проблема, и я не уверен, как ее решить. Так что у меня есть что-то вроде формы круга из SCNodes (и пользователь находится внутри этого круга, чтобы он мог их видеть). Вот как я вызываю функцию для создания узлов (исполнителей).

@objc func tapped(gesture: UITapGestureRecognizer) {           
         let touchPosition = gesture.location(in: sceneView)
         let hitTestResults = sceneView.hitTest(touchPosition, types: .existingPlaneUsingExtent)
         guard let hitTest = hitTestResults.first, let anchor = hitTest.anchor as? ARPlaneAncahor, let gridIndex = grids.firstIndex(where: { $0.anchor == anchor }) else {
         return
       }
       addArtist(hitTest, grids[gridIndex])
}

Это нормально работает в 80% случаев, но иногда художник (SCNNode) поворачивается неправильно. Я понятия не имею, как я могу решить это. Может кто-нибудь объяснить это мне?

Я 10 раз использовал функцию createArtist, чтобы получить круг от узлов художника. Вот как я его использую: createArtist(artist: &artistNode1, eurlesAngles: Float.pi/5*1, numberOfArt: 0, rotation: -CGFloat.pi/2) Чтобы иметь хороший круг, у eurlesAngles есть Float.pi / 5 * (от 1 до 10)

func createArtist(artist: inout SCNNode, eurlesAngles: Float, numberOfArt: Int, rotation: CGFloat){

    let WidthInCm : CGFloat = CGFloat(1.20)
    let HeightInCm : CGFloat = CGFloat(2)
    let rect = CGRect(x: 0, y: 0, width: WidthInCm, height: HeightInCm)
    let roundedRect = UIBezierPath(roundedRect: rect, cornerRadius: 0.30)
    roundedRect.flatness = 0.0005
    let planeGeometry = SCNShape(path: roundedRect, extrusionDepth: 0)
    let material = SCNMaterial()
    material.diffuse.contents = artistsArray[numberOfArt]
    planeGeometry.materials = [material]
    artist = SCNNode(geometry: planeGeometry)

    artist.transform = SCNMatrix4(hitResult.anchor!.transform)
    artist.eulerAngles = SCNVector3(artist.eulerAngles.x , sceneView.pointOfView!.eulerAngles.y, artist.eulerAngles.z)
    artist.position = SCNVector3(hitResult.worldTransform.columns.3.x,  hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
    sceneView.scene.rootNode.addChildNode(artist)

    let paintingBeforeTransform = artist.transform
    let yRotation = SCNMatrix4MakeRotation(sceneView.pointOfView!.eulerAngles.y + eurlesAngles - artist.eulerAngles.y, 0, 1, 0)
    let newRotation = SCNMatrix4Mult(yRotation, paintingBeforeTransform)
    artist.transform = newRotation


    let boxTransform3 = artist.transform
    let xTranslation3 = SCNMatrix4MakeTranslation(2.5, sceneView.pointOfView!.position.y - artist.position.y - 1.8, 0)
    let newTransformR3 = SCNMatrix4Mult(xTranslation3, boxTransform3)
    artist.transform = newTransformR3

    let rotate = SCNAction.rotateBy(x: 0, y: rotation, z: 0, duration: 1)
    artist.runAction(rotate)

}
...