2017-07-01 3 views
0

Je veux ajouter un nœud à ma scène, en gardant une position par rapport à la caméra, mais en gardant l'orientation/rotation de la scène. Où je suis jusqu'à présent ...Comment ajouter un nœud à ma scène SceneKit/ARKit, en conservant sa position mais en réinitialisant son orientation/rotation

Lorsque j'appuie sur l'écran, j'ajoute une ancre à ma scène, avec une transformation égale à la transformation de la caméra. Puis, dans didUpdateNode, lorsque le nœud d'ancrage a sa configuration d'informations de position, j'ajoute un nœud enfant contenant un modèle, qui a position.z = -0.5. Le nœud du modèle est ajouté à la scène directement devant la caméra et reflète les propriétés de rotation de la caméra. Avec le téléphone incliné vers le bas et à un angle, cela pourrait ressembler à ceci:

enter image description here

Le noeud du modèle, affecté par les données de rotation du noeud d'ancrage, est mis en rotation de la même manière que la caméra. Ce modèle particulier apparaît de son côté - cela ne me préoccupe pas, c'est juste un espace réservé. Ignorer également le bouton rouge en haut, qui était pour le débogage.

Jusqu'ici, tout va bien. Ce que je veux faire à la place de ceci est que l'information de rotation soit essentiellement "réinitialisée", de sorte qu'elle apparaisse à la même hauteur que ma caméra, et face à une position face-avant par défaut. Et si je tournais l'appareil photo différemment et que je bougeais dans la pièce, des modèles supplémentaires seraient ajoutés à différentes positions, mais toujours à la même hauteur et avec la même orientation.

Cela pourrait ressembler à ceci. Imaginez que je viens d'appuyer sur l'écran pour ajouter l'objet, et il apparaît à une hauteur standard, et la rotation pertinente à la scène, plutôt que la caméra.

enter image description here

J'ai essayé de jouer avec eulerAngles, rotation et orientation les propriétés du nœud mais ne peut pas obtenir que cela fonctionne de manière satisfaisante. Voici le code que je suis à ce jour .. J'ai créé une scène vide, et je l'utilise ship.scn du projet standard de SceneKit comme modèle:

class ViewController: UIViewController, ARSCNViewDelegate { 
    @IBOutlet var sceneView: ARSCNView! 

    var anchors = [ARAnchor]()  

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Set the view's delegate 
    sceneView.delegate = self 

    // Show statistics such as fps and timing information 
    sceneView.showsStatistics = true 

    // Create a new scene 
    let scene = SCNScene(named: "scene.scn")! 

    // Set the scene to the view 
    sceneView.scene = scene 
    } 

    override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    // Create a session configuration 
    let configuration = ARWorldTrackingSessionConfiguration() 
    configuration.planeDetection = .horizontal 

    // Run the view's session 
    sceneView.session.run(configuration) 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    // Pause the view's session 
    sceneView.session.pause() 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { 
    if anchors.contains(anchor) { 
     // Create a new scene 
     let scene = SCNScene(named: "art.scnassets/ship.scn")! 
     let shipNode = scene.rootNode.childNode(withName: "ship", recursively: true)! 
     shipNode.position.z = -5 
     node.addChildNode(shipNode) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    super.touchesBegan(touches, with: event) 

     if let currentFrame = sceneView.session.currentFrame { 
     let translation = matrix_identity_float4x4 
     let transform = simd_mul(currentFrame.camera.transform, translation) 
     let anchor = ARAnchor(transform: transform) 

     anchors.append(anchor) 
     sceneView.session.add(anchor: anchor) 
     } 
    } 
    } 
} 
+0

En ce qui concerne la position du modèle: que voulez-vous réinitialiser exactement? Voulez-vous que l'avion apparaisse à la hauteur de votre caméra? À une hauteur constante fixe? Que l'avion apparaît toujours au nord de votre caméra? Devant la caméra? En ce qui concerne l'orientation du modèle: voulez-vous qu'il en ait une constante sans rapport avec la caméra (comme toujours au nord, toujours verticale) ou un mixage (comme toujours face à la caméra, toujours vertical)? – Guig

+1

Jetez un coup d'œil dans ['SCNTransformConstraint'] (https://developer.apple.com/documentation/scenekit/scntransformconstraint). – orangenkopf

+0

@Guig Idéalement, je veux créer un avion plat dans le monde, où la coordonnée z voyagerait du sud au nord et x coordonnerait d'ouest en est, donc dans mon nœud initial j'essaye de créer cela. J'ai laissé de côté les détails de l'alignement de l'avion avec North, parce que cela implique le Core Location et c'est la prochaine étape.En ce moment, j'ai juste besoin que ce soit, en termes simples, plat et non-tourné, comme s'il était assis directement sur le sol. – Andrew

Répondre

0

Suis-je manque quelque chose ou voulez-vous que chaque modèle avoir la même orientation, quelle que soit l'orientation de la caméra?

Dans quel cas pouvez-vous simplement définir l'orientation de chaque modèle pour qu'elle soit identique à celle d'un noeud ajouté au début de la session? Par exemple, lorsque la session commence, vous ajoutez un nœud à la scène (visible ou cachée), sauvegardez son orientation, puis réutilisez-la plus tard?