Как разместить SCNFloor на реальном полу?

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

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

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

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

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

Спасибо

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 ответ

Решение

Значение 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)
  }
Другие вопросы по тегам