как получить реальную координату центра сцены в ARkit - PullRequest
0 голосов
/ 10 января 2019

В ARKit, если у меня есть ARSCNView, как получить реальную координату центра текущей сцены? Я использую Swift в качестве языка программирования.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Тунг Нгуен,

Надеюсь, у тебя был хороший день: -)

Я собираюсь попытаться помочь (просто не уверен, что именно вы ищете) ... но я думаю, у меня есть некоторые подсказки ;-)

Я собираюсь дать вам подсказки и посмотреть, смогу ли я помочь:

Вопрос: «Как получить реальную координату центра мира сцены в арките?»

1) если вы спрашиваете о центре системы координат реального мира: Вот как вы это видите:

https://developer.apple.com/documentation/scenekit/scndebugoptions/2882039-showworldorigin

Как использовать в коде: В функции viewDidLoad

sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin]

Как получить позицию мирового происхождения? Если я понимаю, о чем вы просите, реальный центр ARKit - это положение и ориентация устройства на момент первого запуска конфигурации сеанса. Координаты будут (0,0,0). [Если для вас это не имеет смысла, дайте мне знать (я знаю, что часто пропускаю, но при наборе текста на iPad).]

Вот как расположить что-то в центре реального мира (мы знаем, что центр мира находится в координатах (0,0,0))

Как использовать в коде;

func addBox() {
// create a SceneKit box shape
    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)

// create a SceneKit node 
    let boxNode = SCNNode()
// attach the shape to the node
    boxNode.geometry = box
// give node a position ( this will be the real world center!
    boxNode.position = SCNVector3(0, 0, 0)

// SCNVector3 you can think of for now as SCNVector3(x,y,z)
//https://developer.apple.com/documentation/scenekit/scnvector3

// create a SceneKit scene 
    let scene = SCNScene()

// add the node as a child of the rootNode
// the root node defines the origin of the world coordinate systems for SceneKit.
//Apple Documentation states:"The world coordinate system of the view's    
//SceneKit scene directly responds to the AR world coordinate system    
//established by the session configuration."
// so ARKit and SceneKit world coordinate systems match :-)

    scene.rootNode.addChildNode(boxNode)

//add the SceneKit scene to sceneView
    sceneView.scene = scene
}

Итак, мой первый ответ вам - сохранить позиционирование переменной. Как использовать в коде:

let ARWorldOrigin = SCNVector3(0, 0, 0)

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

1) Вы имели в виду центр физического экрана?

2) Вы имели в виду центр поля зрения просмотра камеры? (Попробуйте эту страницу стека потока для подсказок: Получить все ARAnchors сфокусированной камеры в ARKIT

3) Перейдите по всем ссылкам из этого вопроса stackoverflow: Какая единица измерения используется в положении SCNVector3 для x, y и z в ARKit

Я надеюсь, что смог каким-то образом помочь и понять ваш вопрос:

Хорошего дня! И надеюсь, что программирование ARkit

Мы все учимся, убедившись в том, что знаем.

Smartdog

0 голосов
/ 10 января 2019

вы можете получить точку касания, используя такой жест

// 1.
@objc func tapped(recognizer :UIGestureRecognizer) {
    // Get exact position where touch happened on screen of iPhone (2D coordinate)
    let touchPosition = recognizer.location(in: sceneView)

    // 2.
    // Conduct a hit test based on a feature point that ARKit detected to find out what 3D point this 2D coordinate relates to
    let hitTestResult = sceneView.hitTest(touchPosition, types: .featurePoint)

    // 3.
    if !hitTestResult.isEmpty {
        guard let hitResult = hitTestResult.first else {
            return
        }
        print(hitResult.worldTransform.columns.3)
    }
}

и вы можете получить точку в позиции

let positionOfObjectToAdd = SCNVector3 (hitResult.worldTransform.columns.3.x, hitResult.wor

ldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)

...