Сначала вместо SCNBillboardConstraint
попробуйте использовать SCNLookAtConstraint
.
SCNLookAtConstraint
объект автоматически корректирует ориентацию узла, чтобы он всегда указывал на другой узел.
Если SCNLookAtConstraint бесполезен, то это проблема блокировки карданного подвеса. Блокировка карданного подвеса - это потеря одной степени свободы в трехмерном механизме. В SceneKit есть две переменные: eulerAngles
(внутренние углы Эйлера, выраженные в радианах, представляют последовательность из 3 поворотов вокруг оси xyz в следующем порядке: zyx или roll, yaw, pitch) и orientation
(ориентация узла, выражается как кватернион). Вы используете последнее, но ...
SceneKit использует единичные кватернионы, компоненты которых удовлетворяют уравнению:
x*x + y*y + z*z + w*w == 1
Я полагаю, ваша камера не вращается правильно, потому что вы используете только один компонент структуры кватерниона (без четвертого значимого компонента в векторе, то есть w
).
Чтобы избавиться от неправильного поведения камеры, используйте все компоненты кватерниона (выраженные в SCNVector4
, где значения x-y-z
являются нормализованными компонентами, а поле w
содержит угол поворота в радианах или величину крутящего момента в ньютон-метров).
self.node.orientation = (sceneView.pointOfView?.orientation)!
Все соответствующие узлы должны быть одного типа.