在SCNParticleEventBlock中修改SCNParticleSystem颜色不起作用

时间:2017-09-10 03:43:08

标签: ios objective-c scenekit particle-system

鉴于为handle(_:forProperties:handler:)提供的示例代码,以下块应该将绿色粒子变为红色,但不会:

[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;
              }
          }
      }];

通过以下内容,我可以看到绿色颗粒,但无论我做什么,我似乎无法通过各种SCNParticleProperty来做任何事情。

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

一个有趣的观察结果是,在上面的方框中,dataStride似乎只有某些SCNParticleProperty的值。 position, angle, velocityangularVelocity全部产生16lifeframe产生4,其他所有产品都显示nil。我只能假设API允许对几个属性进行每粒子调整,或者必须在我的SCNParticleSystem实例上进行其他配置,以便通过SCNParticleEventBlock块“解锁”修改。

以上结果在Swift和Xcode 8和9中产生了相同的结果。我尝试将值分配给我SCNParticleSystem的几乎每个属性而没有运气,并且没有看到Apple提供的任何示例代码除了标题中的内容。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

对于任何绊倒这个问题的人:查看WWDC 2014 SceneKit sample project中的粒子幻灯片,它们提供了基本上可以用SceneKit做的所有事情的示例。

正如预期的那样,在particleColorVariation实例上需要值才能运行的属性为SCNParticleSystem。将其设置为SCNVector4Zero以外的任何内容(例如SCNVector4Make(0, 0, 0, 1))会导致dataStride中的SCNParticleEventBlock在其索引处具有非零值(16)粒子属性。

不幸的是,这似乎是一个无证件的要求,所以希望这篇文章对将来遇到这个问题的任何人都有用。