Почему я должен добавить узел к superNode в рендерере (_: nodeFor :) в ARKit - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь наложить обнаруженную плоскость на некоторые изображения

, поэтому я пытаюсь использовать renderer(_:nodeFor:)

Внутри этого метода некоторые блоггеры написали код, подобный этому

    guard let anchor = anchor as? ARPlaneAnchor else { return nil }
    let anchorNode = SCNNode()
    let planeNode = SCNNode()

    let material = SCNMaterial()
    material.diffuse.contents = UIColor.gray.withAlphaComponent(0.6)

    let plane = SCNPlane(width: CGFloat(anchor.extent.x), height: CGFloat(anchor.extent.z))
    plane.materials = [material]

    planeNode.geometry = plane
    planeNode.position = SCNVector3(anchor.center.x, 0, anchor.center.z)
    planeNode.eulerAngles = SCNVector3(-Float.pi / 2, 0, 0)

    anchorNode.addChildNode(planeNode)
    return anchorNode

почему они добавляют дочерний узел в пустой узел?

почему просто не вращается сам

Конечно, я читал документацию об этом

они сказали:

Вы можете реализовать этот метод дляпредоставить новый объект SCNNode (или экземпляр подкласса SCNNode), содержащий любые вложения, которые вы планируете использовать в качестве визуального представления привязки.Обратите внимание, что ARKit контролирует видимость узла и его свойство transform, поэтому может оказаться полезным добавить дочерние узлы или отрегулировать свойство pivot узла, чтобы сохранить любые сделанные вами изменения положения или ориентации.

чтологика за сценой?

тогда как вращать сам узел с помощью pivot?

1 Ответ

0 голосов
/ 06 ноября 2018

Когда вызывается renderer(_:nodeFor:), он запрашивает узел для привязки к якору, и если местоположение якоря в мировом пространстве обновляется, он также автоматически обновляет узел.Все, что вам нужно сделать, это вернуть узел плоскости, который вы хотите поместить на обнаруженную поверхность.

Например, в renderer(_:nodeFor:) вы можете сделать это

guard let anchor = anchor as? ARPlaneAnchor else { return nil }

let imagePlane = SCNPlane(width: CGFloat(anchor.extent.x), height: CGFloat(anchor.extent.z))
imagePlane.firstMaterial.diffuse.contents = UIImage(named: 'yourImage')

return SCNNode(geometry: imagePlane)
...