Проблема:
Я пытаюсь создать прямоугольник 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 (изначально Портрет), чтобы он оставался в портрете, независимо от того, как я на него смотрю, а также следуя за камерой вокруг?