Я пытался SCNNode eulerAngles
и SCNNode rotation
, и мне не повезло ...
Я думаю, это потому, что я вызвал SCNNode.transform()
, когда добавляю картину. Когда позже я изменю SCNNode.eulerAngles
и вызову SCNNode.rotation()
, они могут повлиять на первые transform
.
. Наконец-то я получу работу, используя SCNMatrix4Rotate
, а не eulerAngles
и rotation
.
func addPainting(_ hitResult: ARHitTestResult, _ grid: Grid) {
...
let newPaintingNode = SCNNode(geometry: planeGeometry)
newPaintingNode.transform = SCNMatrix4(hitResult.anchor!.transform)
newPaintingNode.transform = SCNMatrix4Rotate(newPaintingNode.transform, -Float.pi / 2.0, 1.0, 0.0, 0.0)
newPaintingNode.position = SCNVector3(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
self.paintingNode = newPaintingNode
...
}
...
@objc func rotateNode(_ gesture: UIRotationGestureRecognizer){
if let _ = self.paintingNode {
// Get The Current Rotation From The Gesture
let rotation = Float(gesture.rotation)
if gesture.state == .began {
self.rotationZ = rotation
}
if gesture.state == .changed {
let diff = rotation - self.rotationZ
self.paintingNode?.transform = SCNMatrix4Rotate(self.paintingNode!.transform, diff, 0.0, 0.0, 1.0)
self.rotationZ = rotation
}
}
}
А приведенный выше код работает как в вертикальной, так и в горизонтальной плоскости.