鉴于为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, velocity
和angularVelocity
全部产生16
,life
和frame
产生4
,其他所有产品都显示nil
。我只能假设API允许对几个属性进行每粒子调整,或者必须在我的SCNParticleSystem
实例上进行其他配置,以便通过SCNParticleEventBlock
块“解锁”修改。
以上结果在Swift和Xcode 8和9中产生了相同的结果。我尝试将值分配给我SCNParticleSystem
的几乎每个属性而没有运气,并且没有看到Apple提供的任何示例代码除了标题中的内容。
感谢您的帮助。
答案 0 :(得分:0)
对于任何绊倒这个问题的人:查看WWDC 2014 SceneKit sample project中的粒子幻灯片,它们提供了基本上可以用SceneKit做的所有事情的示例。
正如预期的那样,在particleColorVariation
实例上需要值才能运行的属性为SCNParticleSystem
。将其设置为SCNVector4Zero
以外的任何内容(例如SCNVector4Make(0, 0, 0, 1)
)会导致dataStride
中的SCNParticleEventBlock
在其索引处具有非零值(16
)粒子属性。
不幸的是,这似乎是一个无证件的要求,所以希望这篇文章对将来遇到这个问题的任何人都有用。