2017-08-29 3 views
4

Dans presque tous les tutoriels d'ARKit, il semble que nous utilisions toujours ARPlane for floor.Utilisation de SCNFloor dans ARKIt

let planeGeometry = SCNPlane(width:CGFloat(planeAnchor.extent.x), height:CGFloat(planeAnchor.extent.z)) 
let planeNode = SCNNode(geometry:planeGeometry) 
planeNode.position = SCNVector3(x:planeAnchor.center.x, y:0, z:planeAnchor.center.y) 
planeNode.transform = SCNMatrix4MakeRotation(-Float.pi/2, 1.0, 0, 0) 

Et si vous vouliez un plan infini (pour projeter des ombres)? J'ai essayé SCNFloor et le résultat est bizarre - le sol suspendu dans les airs:

let planeGeometry = SCNFloor() 
let planeNode = SCNNode(geometry:planeGeometry) 
planeNode.position = SCNVector3(planeAnchor.center.x, 0, planeAnchor.center.z) 

Je l'ai fait une recherche Google et le seul résultat que je suis venu avec est-ce (qui ne fonctionne pas non plus): https://github.com/arirawr/ARKit-FloorIsLava/blob/master/FloorIsLava/ViewController.swift

Est-ce que SCNFloor() fonctionne dans ARKit? Sinon, que puis-je faire pour créer un gros plan?

Répondre

1

Si vous ajoutez votre nœud de plancher en rootNode, votre position Y doit être changé:

planeNode.position = SCNVector3(planeAnchor.center.x, -1.0, planeAnchor.center.z) 

Dans ce cas, je moins d'un mètre^

Vous pouvez utiliser la détection de surface pour trouver votre surface de plancher ancre, puis vous ajouterez votre sol dans le nœud associé pour cette ancre. Les coordonnées mondiales de l'ancre seront déjà correctes (avec moins Y), vous pouvez donc utiliser SCNVector3Zero comme position pour votre sol.

+0

Pourquoi un arbitraire -1? –

+0

@LimThyeChean juste pour le test. Vous devriez utiliser la détection de surface et trouver d'abord les coordonnées du plancher réel. Ensuite, vous utiliserez la coordonnée 'Y' du plancher réel. –

0

Vous pouvez simplement changer cette ligne pour faire votre avion aussi grand que vous le souhaitez:

let planeGeometry = SCNPlane(width:CGFloat(planeAnchor.extent.x),height:CGFloat(planeAnchor.extent.z) 

La façon dont il est au-dessus, il correspond à la taille du plan détecté, qui Arkit mises à jour le long du chemin.

Vous pouvez faire un peu plus comme ceci:

let overHang:CGFloat = 0.2 
... 
let planeGeometry = SCNNode(geometry: SCNPlane(width: CGFloat(planeAnchor.extent.x)+overHang, height: CGFloat(planeAnchor.extent.z)+overHang)) 

Ou, il suffit d'utiliser un CGFloat pour spécifier la taille en mètres:

let theSize:CGFloat = 4.0 
... 
let planeGeometry = SCNNode(geometry: SCNPlane(width: theSize, height: theSize))