Ориентация узла неверна, когда я делаю полный круг - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно, чтобы этот узел всегда смотрел в камеру, я делаю это

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    DispatchQueue.main.async {
        self.node.orientation.y = sceneView.pointOfView?.orientation.y
    }
}

но когда я пытаюсь сделать полный круг (изменить направление камеры на противоположное), это значение становится неправильным. Я пытался использовать SCNBillboardConstraint(), но при этом orientation узел сохранял значение 0, и мне нужно знать угол, поэтому мне это не подходит.

Мне нужно изменить только вращение Y, X и Z должны быть 0

Edit: я заметил, что мне нужно использовать node.presentation.orientation.y, когда я использую ограничение, но это все еще работает неправильно с углами к начальному углу около PI

1 Ответ

0 голосов
/ 24 мая 2018

Сначала вместо 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)!

Все соответствующие узлы должны быть одного типа.

...