Обновление ориентации SCNNode - PullRequest
0 голосов
/ 13 ноября 2018

Проблема:

Я пытаюсь создать прямоугольник SCNNode. Ориентация имеет значение.

1) Инициализируется перед камерой Z расстояние (Завершено)

и

2) остается в исходном положении и следует за положением камеры, однако узел ВСЕГДА обращен "вверх" относительно камеры. Таким образом, независимо от того, что, если человек смотрит на узел, узел является вертикальным в пространстве.

Мои попытки:

1) Я выполнил часть 1

func updatePositionAndOrientationOf(_ node: SCNNode, withPosition position: SCNVector3, relativeTo referenceNode: SCNNode) {
    let referenceNodeTransform = matrix_float4x4(referenceNode.transform)

    // Setup a translation matrix with the desired position
    var translationMatrix = matrix_identity_float4x4
    translationMatrix.columns.3.x = position.x
    translationMatrix.columns.3.y = position.y
    translationMatrix.columns.3.z = position.z

    // Combine the configured translation matrix with the referenceNode's transform to get the desired position AND orientation
    let updatedTransform = matrix_multiply(referenceNodeTransform, translationMatrix)
    node.transform = SCNMatrix4(updatedTransform)
}

из Поместить объект SceneKit перед текущей ориентацией SCNCamera .

2) Я пробовал несколько вещей:

- Настройка вращения узла на камеру

  • В результате он следует за поворотом камеры и не следует за положением. Я не хочу, чтобы узел вращался при вращении камеры, мне нужно, чтобы он постоянно смотрел на камеру.

- Установка ориентации узла на камеру

  • Результат, аналогичный приведенному выше. Вращение перемещает узел; Я должен иметь возможность поворачивать телефон вдоль Z (портрет в ландшафт), и узел должен оставаться в вертикальном положении все время.

- Использование SCNLookAtConstraint / BillBoardConstraint

  • BillBoardConstraint позволяет мне редактировать конкретную ось, поэтому я могу сказать ей отключить ось .Z; Однако, когда я двигаюсь на 90 градусов влево от узла,

                        _
    
         This Side    | * |     * = node; _ = positions around node
    
                        _
    

На самом деле он поворачивает узел в ландшафтный режим. (Длинные снизу и короткие по бокам). Мне нужно, чтобы он оставался в вертикальном положении.

  • LookAtConstraint разрешает GimbalLocked, но выполняет аналогичные повороты и имеет проблемы, аналогичные описанным выше.

Любые указания о том, как сохранить мой прямоугольник SCNNode (изначально Портрет), чтобы он оставался в портрете, независимо от того, как я на него смотрю, а также следуя за камерой вокруг?

...