Как разместить SCNFloor на реальном этаже? - PullRequest
0 голосов
/ 31 октября 2019

Я бы хотел добавить scnfloor там, где находится реальный этаж, но он появляется выше, и при добавлении childNode объект не лежит на полу, а выглядит как летящий.

При регистрации положения добавленного узла или якоря плоскости я всегда получаю y = 0, независимо от того, сканирую ли я пол или стол.

Чего мне не хватает? Или это невозможно изменить y из scnfloor? Но в документах написано

"... о его локальном координатном пространстве"

, поэтому я подумал, что это возможно.

Спасибо

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let planeAnchor = anchor as? ARPlaneAnchor else {return}
    let anchorX = planeAnchor.center.x
    let anchorY = planeAnchor.center.y
    let anchorZ = planeAnchor.center.z

    print("planeAnchor.center %@", planeAnchor.center) //y always 0
    print("node.position %@", node.position) //y always 0
    print("convert %@", node.convertPosition(SCNVector3(anchorX, anchorY, anchorZ), to: nil)) //y always 0

    let floor = SCNFloor()
    let floorNode = SCNNode(geometry: floor)
    floorNode.position = SCNVector3(anchorX, anchorY, anchorZ)
    let floorShape = SCNPhysicsShape(geometry: floor, options: nil)
    floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: floorShape)
    node.addChildNode(floorNode)
    let childNode = createChildNode()
    floorNode.addChildNode(childNode)
}

1 Ответ

1 голос
/ 31 октября 2019

Значение center.y якоря всегда будет равно нулю, здесь есть некоторая дополнительная информация: https://developer.apple.com/documentation/arkit/arplaneanchor/2882056-center

В основном преобразование якорей даст правильное положение обнаруженной плоскости. Из-за этого вы можете просто добавить свой экземпляр SCNFloor как дочерний элемент переданного узла, и он будет отображаться в правильной позиции, нет необходимости явно устанавливать позицию, как вы делаете выше.

Вы будетенеобходимо обновить размер вашей геометрии при изменении экстента ARPlaneAnchor по мере того, как ARKit уточняет границы плоскости. Некоторая дополнительная информация находится здесь: https://developer.apple.com/documentation/arkit/tracking_and_visualizing_planes

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

  func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let planeAnchor = anchor as? ARPlaneAnchor else {
      return
    }

    let floor = SCNFloor()
    let floorNode = SCNNode(geometry: floor)
    floor.length = CGFloat(planeAnchor.extent.z)
    floor.width = CGFloat(planeAnchor.extent.x)
    node.addChildNode(floorNode)

    let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)
    box.materials[0].diffuse.contents = UIColor.red
    let boxNode = SCNNode(geometry: box)
    boxNode.position = SCNVector3(0, 0.025, 0)

    node.addChildNode(boxNode)
  }
...