复制SCNParticleSystem似乎不能很好地工作

时间:2017-04-25 06:59:01

标签: swift scenekit

我正在尝试将SCNParticleSystem用作其他人的“模板”。我基本上想要完全相同的属性,除了粒子的颜色动画。这是我到目前为止所得到的:

    public class A extends AppCompatActivity {
    [...]
    private List<String> list = new ArrayList<String>();

    private void doSomething() {
        list.add("a");
        list.add("b");
        for(String tmp:list) {
            Intent intent = new Intent(this, OtherActivity.class);
            intent.putStringExtra("TAG", tmp);
            startActivityForResult(intent, 1);
        }
    }

我不仅要复制if let node = self.findNodeWithName(nodeName), let copiedParticleSystem: SCNParticleSystem = particleSystemToCopy.copy() as? SCNParticleSystem, let colorController = copiedParticleSystem.propertyControllers?[SCNParticleSystem.ParticleProperty.color], let animation: CAKeyframeAnimation = colorController.animation as? CAKeyframeAnimation { guard animation.values?.count == animationColors.count else { return nil } // Need to copy both the animations and the controllers let copiedAnimation: CAKeyframeAnimation = animation.copy() as! CAKeyframeAnimation copiedAnimation.values = animationColors let copiedController: SCNParticlePropertyController = colorController.copy() as! SCNParticlePropertyController copiedController.animation = copiedAnimation // Finally set the new copied controller copiedParticleSystem.propertyControllers?[SCNParticleSystem.ParticleProperty.color] = copiedController // Add the particle system to the desired node node.addParticleSystem(copiedParticleSystem) // Some other work ... } ,还要复制SCNParticleSystemSCNParticlePropertyController,以确保安全。我发现我必须“手动”手动执行这些“深度”副本,因为CAKeyframeAnimation上的.copy()不会复制动画等。

当我在添加的节点上打开复制的粒子系统时(通过将SCNParticleSystem设置为正数),没有任何反应。

我认为问题不在于我添加它的节点,因为我已经尝试将birthRate添加到该节点并打开它,原始粒子系统变为可见那种情况。这似乎向我表明,我添加复制粒子系统的节点在几何,渲染顺序等方面都是可以的。

其他可能值得一提的是:场景是从.scn文件加载而不是以编程方式在代码中创建的。在理论上,这不应该影响任何事情,但谁知道......

关于为什么这个复制的粒子系统在打开它时没有做任何事情的想法?

1 个答案:

答案 0 :(得分:1)

不要对粒子系统使用copy()方法!

copy()方法不允许复制粒子的颜色(复制的粒子将默认为白色)。

您可以使用以下代码对其进行测试:

let particleSystem01 = SCNParticleSystem()
particleSystem01.birthRate = 2
particleSystem01.particleSize = 0.5
particleSystem01.particleColor = .systemIndigo                 // INDIGO
particleSystem01.emitterShape = .some(SCNSphere(radius: 2.0))

let particlesNode01 = SCNNode()
particlesNode01.addParticleSystem(particleSystem01)
particlesNode01.position.y = -3
sceneView.scene.rootNode.addChildNode(particlesNode01)

let particleSystem02 = particleSystem01.copy()                 // WHITE

let particlesNode02 = SCNNode()
particlesNode02.addParticleSystem(particleSystem02 as! SCNParticleSystem)
particlesNode02.position.y = 3
sceneView.scene.rootNode.addChildNode(particlesNode02)


对节点使用clone()方法!

clone()方法在3d对象和粒子系统上的工作更加一致,它可以帮助您保存粒子的颜色,但是当然不允许为每个单独的粒子保存位置。

let particlesNode02 = particlesNode01.clone()                  // INDIGO

particlesNode02.position.y = 3
sceneView.scene.rootNode.addChildNode(particlesNode02)