Как динамически создавать аннотации для 3D-объектов с помощью scenekit — ARKit в iOS 11?

Я работаю над созданием аннотаций, используя overlaySKScene нечто подобное (https://sketchfab.com/models/1144d7be20434e8387a2f0e311eca9b1# ). Я следил за https://github.com/halmueller/ImmersiveInterfaces/tree/master/Tracking%20Overlay для создания наложения.

Но в приведенном примере они создают только одну аннотацию, и она статична. Я хочу динамически создавать несколько аннотаций на основе количества дочерних узлов, которые у нас есть, а также иметь возможность размещать аннотацию поверх соответствующего дочернего узла. Как этого добиться?

Я добавляю наложение, как показано ниже,

    sceneView.overlaySKScene = InformationOverlayScene(size: sceneView.frame.size)

где InformationOverlayScene — это SKScene, в котором я добавил два childnodes для создания одной аннотации.


person yaali    schedule 19.09.2017    source источник
comment
классный проект.. хотел бы помочь, но еще не знаком с scenekit/arkit..   -  person Fluidity    schedule 21.09.2017


Ответы (2)


Создайте массив со спрайтами-аннотациями, сопоставленными с массивом дочерних узлов, а затем выполните что-то вроде следующего:

func renderer(_ aRenderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

    let scnView = self.view as! SCNView
    //for each character
    for var i in 0...inBattleChars.count-1 {
        let healthbarpos = scnView.projectPoint(inBattleChars[i].position)

        battleSKO.healthbars[i].position = CGPoint(x: CGFloat(healthbarpos.x), y: (scnView.bounds.size.height-10)-CGFloat(healthbarpos.y))
    }
}

Перед визуализацией каждого кадра обновляется позиция SKSprite (в HealthBars) для каждого SCNNode в inBattleChars. Ключевой частью является то, что projectPoint используется для получения 2D-позиции сцены наложения SK на основе SCNNode в 3D-сцене.

Чтобы предотвратить отображение аннотаций невидимых узлов (например, дочерних узлов на обратной стороне родительского объекта), используйте метод nodesInsideFrustum(of:) SCNRenderer.

person Xartec    schedule 22.09.2017
comment
@ Xartec Я сделал то же самое. Теперь я могу видеть наложение, но в двух разных позициях. Когда я открываю сеанс камеры, он правильно показывает наложение с 3D-объектом, но когда я поворачиваю камеру на 180 градусов, я снова вижу то же наложение в другом месте. Видно только в 2-х местах и ​​больше нигде. Как такое могло произойти? - person yaali; 09.10.2017
comment
Это сработало. Но поскольку мы меняем положение оверлея в методе updateAtTime, оверлей всегда кажется шатким и не выглядит стабильным. Есть ли способ обновить положение дочерних объектов наложения только при каком-то заметном движении камеры или движении 3D-модели? - person yaali; 28.10.2017

Вы можете добавить SKScene или CALayer в качестве материального свойства.

Вы можете создать SCNPlane с определенной шириной и высотой и добавить сцену SpriteKit в качестве материала. Пример можно найти здесь.

Затем вы просто размещаете плоскость там, где хотите, и создаете и удаляете аннотации по мере необходимости.

person jlsiewert    schedule 22.09.2017
comment
Я хочу динамически добавлять такие текстовые поля для многих дочерних узлов. Также я хочу, чтобы это вело себя как аннотация. Даже если я изменю размер или отойду от 3D-объекта, аннотации все равно должны быть того же размера. См. sketchfab.com/models/1144d7be20434e8387a2f0e311eca9b1#. Используя этот метод, я могу добиться чего-то подобного? - person yaali; 22.09.2017
comment
Нет, это создает аннотации, которые имеют фиксированное положение в пространстве и соответственно масштабируются. - person jlsiewert; 22.09.2017