2017-10-10 6 views
2

Je travaille sur une application AR dans laquelle je rends un modèle 3D.Chargement de l'image gif dans SCNNode- ARKit (SceneKit) en utilisant calayer ne pas afficher correctement

Sur tapant un nœud enfant je suis afficher une image gif en créant l'animation à l'aide CALayer et le chargement dans diffuse.contents en suivant ce fil Set contents of CALayer to animated GIF?

  let animation : CAKeyframeAnimation = createGIFAnimation(url: gifImageURL!)! 
      let layer = CALayer() 
      layer.bounds = CGRect(x: 0, y: 0, width:600, height:200) 
      layer.add(animation, forKey: "contents") 

      let newMaterial = SCNMaterial() 
      newMaterial.isDoubleSided = true 
      newMaterial.diffuse.contents = layer 
      let plane = SCNPlane(width: 5, height: 5) 
      plane.materials = [newMaterial] 
      let node = SCNNode(geometry: plane) 
      self.sceneView.scene.rootNode.addChildNode(node) 

Je suis en mesure de rendre le gif image dans SCNNode mais il affiche seulement le quart de celui-ci (la partie inférieure droite de gif est seulement visible). J'ai essayé étapes ci-dessous pour remédier à cette situation, mais toujours en vain

  1. Modification de la largeur/hauteur du plan
  2. Modification des limites de CALayer
  3. Essayé avec différentes tailles d'image GIF

Tout le monde s'il vous plaît me aider comment rendre une image gif complète dans SCNPlane en utilisant CALayer.

+2

moitié de l'image ou un quart de l'image? Parce qu'un quart d'une image sonne comme s'il s'agissait d'un point d'ancrage/origine – Knight0fDragon

+0

Oui, seul le quart de l'image est visible. Quel pourrait être le problème ici? – yaali

Répondre

2

Pour contourner ce problème j'ai suivi la procédure ci-dessous pour charger le gif correctement,

let plane = SCNPlane(width: 2, height: 2) 

    let bundleURL = Bundle.main.url(forResource: "engine", withExtension: "gif") 
    let animation : CAKeyframeAnimation = createGIFAnimation(url: bundleURL!)! 
    let layer = CALayer() 
    layer.bounds = CGRect(x: 0, y: 0, width: 900, height: 900) 

    layer.add(animation, forKey: "contents") 
    let tempView = UIView.init(frame: CGRect(x: 0, y: 0, width: 900, height: 900)) 
    tempView.layer.bounds = CGRect(x: -450, y: -450, width: tempView.frame.size.width, height: tempView.frame.size.height) 
    tempView.layer.addSublayer(layer) 

    let newMaterial = SCNMaterial() 
    newMaterial.isDoubleSided = true 
    newMaterial.diffuse.contents = tempView.layer 
    plane.materials = [newMaterial] 
    let node = SCNNode(geometry: plane) 
    node.name = "engineGif" 
    let gifImagePosition = SCNVector3Make((self.virtualObjectInteraction.selectedObject?.childNodes[0].position.x)! + 2, (self.virtualObjectInteraction.selectedObject?.childNodes[0].position.y)! + 4, (self.virtualObjectInteraction.selectedObject?.childNodes[0].position.z)! - 2) 
    node.position = gifImagePosition 
    self.virtualObjectInteraction.selectedObject?.childNodes[0].addChildNode(node)