Вы одновременно используете два типа вращения.Это не правильно!
boxParent.orientation = (sceneView.pointOfView?.orientation)! //quaternion
Эта переменная использует ориентацию узла, выраженную как quaternion
(4 компонента: x, y, z, w).
boxParent.eulerAngles = (sceneView.pointOfView?.eulerAngles)!
Вращение узла, выраженное в шагеуглы поворота, рыскания и крена в радианах (3 компонента: x, y, z).
Вам необходимо решить, какую переменную вы будете использовать: orientation
или eulerAngles
.Я полагаю, вы выберете ориентация .
Читать эту полезную статью и эту о Quaternions
и что такое Gimbal Lock
is.
Также используйте объект SCNLookAtConstraint
(отрицательная ось z узла указывает на целевой узел ограничения) или SCNBillboardConstraint
объект (автоматически настраивает ориентацию узла, так что его локальная ось z всегда указываетв направлении узла pointOfView) для автоматической настройки ориентации узла, поэтому камера всегда будет указывать на другой узел.