Проблемы с масштабированием узла (свойства .simdPivot и simdScale & .scale) - PullRequest
1 голос
/ 07 мая 2019

Я не понимаю, как работает масштабирование узлов на узлах.

Я пытаюсь понять, как работает код в Образце проекта Apple Face Based AR Experiences .В частности, я пытаюсь понять файл TransformVisualization.swift и преобразования, примененные к его узлам.

Вызывается метод addEyeTransformNodes (), а узлы левого и правого глаза масштабируются с использованием свойств simdScale.Это та часть, в которой я запутался.

Я пытался масштабировать один и тот же узел, используя свойства .scale и .simdScale, но оба они ничего не сделали.

Более того, более запутанным является тот факт, что, хотя значения для .simdPivot больше 1, узел сокращается.Я ожидал, что узлы будут масштабироваться.

Зачем нам нужно устанавливать .simdPivot для масштабирования узлов, а не свойства .scale и .simdScale?

Вот функция, о которой я говорю.

func addEyeTransformNodes() {
  guard #available(iOS 12.0, *), let anchorNode = contentNode else { return }

  // Scale down the coordinate axis visualizations for eyes.
  rightEyeNode.simdPivot = float4x4(diagonal: float4(3, 3, 3, 1))
  leftEyeNode.simdPivot = float4x4(diagonal: float4(3, 3, 3, 1))

  anchorNode.addChildNode(rightEyeNode)
  anchorNode.addChildNode(leftEyeNode)
}

Вот что я попробовал:

func addEyeTransformNodes() {
  guard #available(iOS 12.0, *), let anchorNode = contentNode else { return }

  // Does nothing
  rightEyeNode.simdScale = float3(3, 3, 3)
  // Does nothing
  leftEyeNode.scale = SCNVector3(x: 3, y: 3, z: 3)

  anchorNode.addChildNode(rightEyeNode)
  anchorNode.addChildNode(leftEyeNode)
}

Я ожидал масштабировать узел так, как я это сделал, но ничего не произошло.

С нетерпением жду ваших ответови помощь.

1 Ответ

0 голосов
/ 08 мая 2019

Если вам нужно сместить точку поворота (перед применением поворота и / или масштабирования), используйте simdPivot свойство экземпляра.

Используйте мой тестовый код, чтобы узнать, как это работает:

let sphereNode1 = SCNNode(geometry: SCNSphere(radius: 1))
sphereNode1.geometry?.firstMaterial?.diffuse.contents = UIColor.red
sphereNode1.position = SCNVector3(-5, 0, 0)
scene.rootNode.addChildNode(sphereNode1)

let sphereNode2 = SCNNode(geometry: SCNSphere(radius: 1))
sphereNode2.geometry?.firstMaterial?.diffuse.contents = UIColor.green
sphereNode2.simdPivot.columns.3.x = -1

sphereNode2.scale = SCNVector3(2, 2, 2)           // WORKS FINE
//sphereNode2.simdScale = float3(2, 2, 2)         // WORKS FINE

scene.rootNode.addChildNode(sphereNode2)

let sphereNode3 = SCNNode(geometry: SCNSphere(radius: 1))
sphereNode3.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
sphereNode3.position = SCNVector3(5, 0, 0)
scene.rootNode.addChildNode(sphereNode3)

Смещение по оси вращения x: -1:

enter image description here

Смещение по оси вращения x: 0:

enter image description here

Использование инициализатора init(diagonal:) поможет вам создать новый 4x4 Matrix с указанным вектором на главной диагонали.У этого метода есть проблема: он уменьшает объекты, когда вы назначаете диагональные значения больше 1, и наоборот. Итак, если вы хотите увеличить глаза персонажа, используйте следующий подход в качестве обходного пути :

rightEyeNode.simdPivot = float4x4(diagonal: float4(1/3, 1/3, 1/3, 1))
leftEyeNode.simdPivot = float4x4(diagonal: float4(1/3, 1/3, 1/3, 1))

Я думаю, инженеры Apple исправят эту проблему в будущем.

Надеюсь, это поможет.

...