У меня странная проблема, и я не уверен, как ее решить. Так что у меня есть что-то вроде формы круга из 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)
}