2017-09-01 7 views
1

Donc, pour être clair sur mes objectifs, puisque je n'ai pas de code à partager ... Disons que j'ai un SCNNode qui est positionné entre la caméra et un autre SCNNode. Le premier SCNNode est un SCNBox, mais n'a pas de texture, ainsi le deuxième SCNNode peut être vu derrière lui. Je veux donner au premier nœud un matériau transparent, mais pour qu'il obtienne également tous les nœuds derrière lui, comme s'il était opaque. Dans une scène régulière, cela signifierait que vous pourriez voir la couleur de fond de la scène, noire peut-être, mais je prévois de le faire dans ARKit, ce qui est plus logique car cela signifie que vous verriez simplement le monde réel derrière.Est-il possible d'avoir un SCNNode qui soit transparent, mais qui masque tout objet derrière lui?

+0

Juste une idée, non testé: la boîte devant rendre la transparence et de laisser 'matière writesToDepthBuffer' à'on', puis configurer chaque nœud' renderingOrder' de sorte que la case en premier soit rendue en premier (0) et ensuite les autres noeuds (1 ou une plus grande valeur) –

Répondre

1

Vous pouvez utiliser le matériel avec la couleur claire:

extension SCNMaterial { 
    convenience init(color: UIColor) { 
     self.init() 
     diffuse.contents = color 
    } 
    convenience init(image: UIImage) { 
     self.init() 
     diffuse.contents = image 
    } 
} 

let clearMaterial = SCNMaterial(color: .clear) 
boxNode.materials = [clearMaterial] 
-1

J'ai testé mon idée à partir des commentaires et cela semble fonctionner, ne pas être parfaitement mais je vais développer plus tard sur ce point. Pour prendre en charge le processus de rendu, SceneKit utilise un tampon de profondeur et ne restitue un point que s'il se trouve devant ce qui est enregistré dans le tampon. Nous devons donc indiquer à SceneKit de rendre votre cube transparent d'abord, puis tous les autres nœuds, laissez donc la propriété renderingOrder de votre nœud de cube à 0 (la valeur par défaut) puis définissez tous les autres nœuds renderingOrder sur une valeur plus élevée, par exemple 1, 10 ... Normalement pour les objets transparents, vous ne voulez pas écrire dans le tampon de profondeur donc vous pouvez voir les objets derrière mais ce n'est pas le cas alors laissez votre propriété matérielle de cube writeToDepthBuffer à true (la valeur par défaut). La dernière chose à faire est de rendre votre cube transparent, vous pouvez utiliser le matériel par défaut, puis ajoutez

cube.geometry?.firstMaterial?.transparency = 0.00000001 

Comme je l'ai dit avant que cette méthode n'est pas parfait et il se sent plus d'une solution ... mais travaux. La raison pour laquelle nous ne définissons pas la transparence exactement à 0 est que si nous le faisons, c'est que le cube n'est même pas là, c'est un pixel entièrement transparent qui n'est pas sauvegardé dans le tampon de profondeur.