web-dev-qa-db-fra.com

Comment puis-je ajouter un 2dView ayant du texte dans ARkit scene iOS

Comment puis-je ajouter une 2dView ayant du texte dans la scène ARkit iOS.Comment puis-je ajouter cette vue en haut d'un nœud qui ne tourne pas lorsque nous faisons pivoter le nœud.  enter image description here

8
Developer

Vous pouvez ajouter une SCNPlane et utiliser un SCNLookAtConstraint to pour que l'avion regarde toujours la caméra.

Vous pouvez créer un matériau personnalisé et définir ses propriétés du matériau sur:

  • Une couleur (UIColor ou CGColor), spécifiant une couleur constante sur toute la surface du matériau Un numéro (

  • Une image (UIImage ou CGImage), spécifiant une texture à mapper sur la surface du matériau

  • Une couche d'animation de base (CALayer)
  • Une texture (SKTexture, MDLTexture, MTLTexture ou GLKTextureInfo)
  • Une scène SpriteKit (SKScene)

Vous pouvez également afficher des contenus animés à l'aide de CoreAnimation ou de SpriteKit, mais

SceneKit ne peut pas utiliser un calque déjà affiché ailleurs (par exemple, le calque de sauvegarde d'un objet UIView)


Voici un exemple d'utilisation de SpriteKit:

  1. Créez votre scène SpriteKit:

par exemple.:

let skScene = SKScene(size: CGSize(width: 200, height: 200))
skScene.backgroundColor = UIColor.clear

let rectangle = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 200, height: 200), cornerRadius: 10)
rectangle.fillColor = #colorLiteral(red: 0.807843148708344, green: 0.0274509806185961, blue: 0.333333343267441, alpha: 1.0)
rectangle.strokeColor = #colorLiteral(red: 0.439215689897537, green: 0.0117647061124444, blue: 0.192156866192818, alpha: 1.0)
rectangle.lineWidth = 5
rectangle.alpha = 0.4
let labelNode = SKLabelNode(text: "Hello World")
labelNode.fontSize = 20
labelNode.fontName = "San Fransisco"
labelNode.position = CGPoint(x:100,y:100)
skScene.addChild(rectangle)
skScene.addChild(labelNode)
  1. Créez votre avion et définissez la scène comme votre propriété matérielle

par exemple.

let plane = SCNPlane(width: 20, height: 20)
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.contents = skScene
plane.materials = [material]
let node = SCNNode(geometry: plane)
scene.rootNode.addChildNode(node)
  1. Animez votre scène

par exemple.

labelNode.run(SKAction.repeatForever(SKAction.rotate(byAngle: .pi, duration: 2)))

 enter image description here

17
jlsiewert

Il vaut probablement la peine de mentionner que vous pouvez également utiliser quelques autres éléments pour le contenu ... Une liste peut être trouvée ici ... https://developer.Apple.com/documentation/scenekit/scnmaterialproperty/1395372- Contenu

J'ai essayé le code de la réponse ci-dessus et cela a bien fonctionné, mais ma vitesse de ralentissement ralentissait, car de nombreux nœuds en avaient besoin. Et le SKScene est probablement assez lourd.

J'ai pu utiliser une SKView avec un SKLabelNode mais le problème était que le texte ne serait pas mis à jour de manière visuelle. J'imagine que je devrais appeler une texture (à partir de :) à chaque fois et j'ai pensé que ce serait tout aussi lent SKView texture (from:) https://developer.Apple.com/documentation/spritekit/skview/1520114-texture

J'ai vu une autre façon de le faire avec un CALayer mais pensais que id avait le même problème avec le changement de texte, je suis donc parti avec SCNText. 

Il convient également de mentionner SCNBillboardConstraint en tant qu'alternative à LookatConstraint https://developer.Apple.com/documentation/scenekit/scnbillboardconstraint

0
The Way