2017-09-10 3 views
0

Compte tenu du code fourni pour handle(_:forProperties:handler:), le bloc suivant devient rouge particule verte, mais qui ne fonctionne pas:couleurs dans un SCNParticleSystem Modification SCNParticleEventBlock ne fonctionne pas

[system handleEvent:SCNParticleEventBirth 
    forProperties:@[SCNParticlePropertyColor] 
     withBlock:^(void **data, size_t *dataStride, uint32_t *indices , NSInteger count) { 
      for (NSInteger i = 0; i < count; ++i) { 
       float *color = (float *)((char *)data[0] + dataStride[0] * i); 
       if (rand() & 0x1) { // Switch the green and red color components. 
        color[0] = color[1]; 
        color[1] = 0; 
       } 
      } 
     }]; 

avec ce qui suit, je suis en mesure de voir les particules vertes, mais peu importe ce que je fais, je ne peux pas sembler obtenir divers SCNParticleProperty pour faire quelque chose.

SCNParticleSystem *system = [SCNParticleSystem particleSystem]; 
system.particleColor = NSColor.greenColor; 
system.birthRate = 1; 

Une observation intéressante est que dans le bloc ci-dessus, dataStride ne semble avoir des valeurs pour certains SCNParticleProperty s. position, angle, velocity, et angularVelocity donnent tous 16, life et frame donnent 4, et tous les autres montrent nil. Je peux seulement supposer que l'API permet l'ajustement par particule pour quelques propriétés, ou une configuration supplémentaire doit être faite sur mon instance SCNParticleSystem afin de "déverrouiller" la modification via un bloc SCNParticleEventBlock. Ce qui précède produit les mêmes résultats dans Swift, et les deux Xcode 8 et 9. J'ai essayé d'attribuer des valeurs à presque toutes les propriétés de mon SCNParticleSystem sans aucune chance, et je ne vois pas d'exemple de code fourni par Apple autre que ce qui est dans l'en-tête.

Merci pour toute aide.

Répondre

0

Pour quiconque trébuche sur cette question: consultez la diapositive de particules dans le WWDC 2014 SceneKit sample project, ils fournissent un exemple pour pratiquement tout ce que vous pouvez faire avec SceneKit.

Comme prévu, la propriété qui nécessitait une valeur pour que cela fonctionne était particleColorVariation sur mon instance SCNParticleSystem. La valeur SCNVector4Zero (par exemple SCNVector4Make(0, 0, 0, 1)) donne dataStride en SCNParticleEventBlock ayant une valeur non nulle (16) à l'index de la propriété de particule. Il est regrettable que cela semble être une exigence non documentée, donc j'espère que ce post est utile pour toute personne rencontrant ce problème dans le futur.