Масштаб системы частиц в SceneKit - PullRequest
0 голосов
/ 24 октября 2018

Я играю в игру со SceneKit, для которой может измениться размер всей игры, то есть размер эталонного узла (GameRootNode), с которым связаны все узлы, может измениться, тогда размер всех узлов соответственно изменится, когда это произойдет.

Когда дело доходит до системы частиц, она становится сложной.До сих пор мне приходилось создавать систему частиц для каждого экстремума диапазона размеров, который может иметь игра, и играть со свойствами системы частиц, чтобы настроить эффект.Результат не очень хороший.

Поэтому я попытался масштабировать систему частиц с помощью двух подходов:

  • присоединить 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)

1 Ответ

0 голосов
/ 24 октября 2018

Существует два способа масштабирования системы частиц: формы '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 (например, в 125 раз, если ваш масштабный коэффициент равен 5).

Надеюсь, это поможет.

...