2015-10-20 14 views
7

La documentazione per SCNMaterialProperty.contents indica che si tratta di una proprietà animabile e infatti è possibile eseguire un crossfade tra due colori. Tuttavia non riesco a dissolvenza incrociata tra due immagini.SceneKit - Texture proprietà materiale crossfade

Quindi sto iniziando a chiedermi se è possibile o se devo creare uno shader personalizzato per questo?


ho provato un'animazione implicita, nel qual caso si mostra subito il 'dopo' immagine:

node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"before"]; 
[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration:5]; 
node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"after"]; 
[SCNTransaction commit]; 

Un'animazione esplicita, che non fa nulla:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"contents"]; 
animation.fromValue = (__bridge id)[UIImage imageNamed:@"before"].CGImage; 
animation.toValue = (__bridge id)[UIImage imageNamed:@"after"].CGImage; 
animation.duration = 5; 
[node.geometry.firstMaterial.diffuse addAnimation:animation forKey:nil]; 

Così come attraverso un CALayer, che non fa nulla:

CALayer *textureLayer = [CALayer layer]; 
textureLayer.frame = CGRectMake(0, 0, 793, 1006); 
textureLayer.contents = (__bridge id)[UIImage imageNamed:@"before"].CGImage; 
node.geometry.firstMaterial.diffuse.contents = textureLayer; 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"contents"]; 
animation.fromValue = (__bridge id)[UIImage imageNamed:@"before"].CGImage; 
animation.toValue = (__bridge id)[UIImage imageNamed:@"after"].CGImage; 
animation.duration = 5; 
[textureLayer addAnimation:animation forKey:nil]; 
+0

Si è tentato di animare una modifica tra due materiali, anziché tra due valori di contenuto per la stessa proprietà materiale? – rickster

risposta

6

Dal mio test, non sembra che questa proprietà sia effettivamente animabile quando sono coinvolti i valori di trama (piuttosto che i valori dei colori solidi). O questo è un bug in SceneKit (cioè è inteso per essere animabile ma non funziona) o è un bug nei documenti di Apple (cioè non è concepito per essere animabile ma dicono che lo è). In entrambi i casi, è necessario file that bug in modo da ricevere una notifica quando Apple lo risolve.

(anche non apparire come questo è un problema TVOS-specifica -. Lo vedo su OS X pure)

riesco a capire perché le transizioni animate struttura potrebbero non essere lì ... da una prospettiva GL/Metal, che richiede il binding di un'unità di texture aggiuntiva e due ricerche di texture per pixel (anziché una) durante la transizione.

mi viene in mente un paio di potenziali soluzioni decenti:

  1. Utilizzare un modificatore shader. Scrivi un frammento GLSL (ish) che sembra qualcosa di simile:

    uniform sampler2D otherTexture; 
    uniform float fadeFactor; 
    #pragma body 
    vec4 otherTexel = texture2D(otherTexture, _surface.diffuseTexcoord); 
    _surface.diffuse = mix(_surface.diffuse, otherTexel, fadeFactor); 
    

    Imposta sul materiale che si desidera animare utilizzando il punto SCNShaderModifierEntryPointSurface ingresso. Quindi utilizzare setValue:forKey: per associare un SCNMaterialProperty con la otherTexture e un CABasicAnimation per animare la fadeFactor da 0 a 1.

  2. Usa qualcosa di più animato (come una scena SpriteKit) come il contenuto di proprietà dei materiali, e animare che per eseguire la transizione . (Come bonus, quando lo si fa in questo modo, è possibile utilizzare altri stili di transizione.)

+0

Grazie mille, funziona perfettamente! Avevo provato a legare una trama prima attraverso KVC, ma ho assegnato l'immagine direttamente in modo errato senza l'uso di "SCNMaterialProperty", che sembra sciocca in retrospettiva. Archiverò subito il radar. – alloy

+0

Radar: https: //openradar.appspot.it/23283570 – alloy

0

L'animazione non sta accadendo perché la proprietà "contenuti" è animatable solo quando impostato su un colore non per un'immagine. Puoi leggerlo sulla documentazione della mela sulla proprietà dei contenuti.

+0

Ho appena dato un'altra occhiata ai documenti, ma non riesco a trovare nulla su un'immagine che non sia adatta per l'animazione. – alloy

+0

Dalla documentazione: proprietà contenuti: Specifica il contenuto del destinatario. Può essere un colore (NSColor/UIColor), un'immagine (NSImage/CGImageRef), un layer (CALayer), un percorso (NSString o NSURL), una scena SpriteKit (SKScene) o una trama (SKTexture, id o GLKTextureInfo) . Animabile quando impostato su un colore. –

+0

Eh, anche quando eseguo una ricerca per "Animabile quando impostato su un colore" non riesco a trovarlo su questa pagina: https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/ SCNMaterialProperty_Class/index.html # // apple_ref/OCC/instp/SCNMaterialProperty/contenuti. Dove lo stai vedendo? Comando – alloy