【问题标题】:Scale a particle system in SceneKit在 SceneKit 中缩放粒子系统
【发布时间】:2019-03-29 06:21:03
【问题描述】:

我正在用 SceneKit 做一个游戏,整个游戏的大小可以改变,即所有节点链接到的参考节点(GameRootNode)的大小可以改变,然后所有节点的大小在发生时都会相应改变.

说到粒子系统,它变得越来越棘手。到目前为止,我必须为游戏可以具有的每个极端尺寸范围做一个粒子系统,并使用粒子系统的属性来调整效果。结果不好。

所以我尝试使用 2 种方法来缩放粒子系统:

  • BulletNode附加到GameRootNode,将粒子系统附加到BulletNode,然后缩放GameRootNode(如下所述)

  • 缩放GameRootNode,创建BulletNode,将粒子系统附加到BulletNode,然后将BulletNode缩放到与GameRootNode相同的比例

在这两种情况下,粒子系统都保持其原始大小(即在 SceneKit 编辑器中定义的大小)

有没有办法缩放粒子系统?

GameRootNode = SCNNode()
let Sequence = SCNAction.sequence([SCNAction.scale(to: VCOfScene.VCPlayAR.ScalingFactor, duration: 0), 
                                   SCNAction.move(to: SCNVector3.init(-Float(kNbColonnesLevel) / 2 * Float(VCOfScene.VCPlayAR.ScalingFactor), 
                                   0, 
                                  -Float(kNbLignesLevel) / 2 * Float(VCOfScene.VCPlayAR.ScalingFactor)), 
                                   duration: 0)])
GameRootNode.runAction(Sequence)

BulletNode = SCNNode(geometry: Level3D.Bullet.geometry)
BulletNode.position = Position.PositionToVector()
BulletNode.name = ProjectileImageName + String(ProjectileID)

let BulletShape = SCNParticleSystem(named: "Fireball.scnp", inDirectory: nil)!
BulletShape.emittingDirection = DirectionBullet
BulletShape.particleColor = Character.Color

BulletNode.addParticleSystem(BulletShape)
GameRootNode.addChildNode(BulletNode)
GameRootNode.runAction(Sequence)

【问题讨论】:

    标签: swift scenekit particle-system scnnode


    【解决方案1】:

    有两种方法可以缩放粒子系统:Shapes 的Width,Height,Length 以及粒子系统的X,Y,Z Scale。

    这是一个如何使用 SCNAction 缩放粒子系统的示例:

    override func viewDidLoad() {
    
        super.viewDidLoad()
        let scene = SCNScene(named: "art.scnassets/myScene.scn")!
    
        //.......................................................
    
        let particleSystem = SCNParticleSystem()
        particleSystem.emitterShape = SCNBox(width: 1,
                                            height: 1,
                                            length: 1,
                                     chamferRadius: 0)
    
        particleSystem.birthRate = 50
        particleSystem.particleSize = 0.05
        particleSystem.stretchFactor = 2
        particleSystem.particleLifeSpan = 3
        particleSystem.particleVelocity = 10
    
        let psNode = SCNNode()
        psNode.addParticleSystem(particleSystem)
        psNode.scale = SCNVector3(1, 1, 1)
    
        let action = SCNAction.sequence([SCNAction.scale(by: 5, duration: 10)])
        psNode.runAction(action)
        scene.rootNode.addChildNode(psNode)
    }
    

    当你放大一个粒子系统时,你应该相应地增加Birth rate 属性。例如,您的scale(x:1, y:1, z:1)Birth rate = 50。您决定将scale 增加到(x:5, y:5, z:5)

    为了保持相同的粒子密度,您必须增加 Birth rate 属性(例如,如果您的比例因子为 5,则增加 125 倍)。

    【讨论】:

    • 谢谢,但它似乎接近我尝试过的。缩放动作是在节点上完成的,而不是在粒子系统上。正如你所提到的,您需要更改粒子系统的参数才能获得相同的行为,不仅是出生率,还有其他一些行为。
    • 好的,我会尝试更改一些其他参数。你能告诉我具体是什么参数吗?
    • 嗯,你必须使用几乎所有的参数来在比例变化时保持相同的效果,尤其是在一个节点上附加了复杂的多个粒子系统时。事实上,缩放粒子系统所连接的节点并没有做任何事情。我猜想缩放粒子系统是不可能的。
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多