QML粒子系统-Affector(1)

1,301 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 12 天,点击查看活动详情


📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!


Affector影响器

前言

经过前面的几篇文章,已经将粒子系统的三个重要部分进行了详细探究,剩下的这最后一个部分就是今天要讲的Affector影响器。前面文章中的例子中较少用到影响器,产生的变化较少,而增加了影响器,则可使得整个粒子发射系统发生翻天覆地的变化。

简介

影响器是粒子系统的一个可选组件。它们可以对模拟执行各种操作,例如改变粒子的轨迹或提前结束它们在模拟中的生命。

Affector影响器有一个基础类型Affector,下面有八个子类型:

  • Age
  • Attractor
  • Friction
  • Gravity
  • GroupGoal
  • SpriteGoal
  • Turbulence
  • Wander 本节先对基础类型Affector进行探究,其余子类型后面的文章会逐渐进行讲解。

属性列表

属性类型描述
accelerationStochasticDirection受影响的粒子将其加速度设置为这个方向。
enabledbool如果enabled设置为false,此影响器将不会影响任何粒子。默认值为true。
groupslist<string>哪些逻辑粒子组将受到影响。如果为空,它将影响所有粒子。
oncebool如果once被设置为true,这个影响器将只影响每个粒子一次。如果影响器通常模拟一段时间内的连续效应,那么它将模拟一秒时间内的效应即它影响粒子的瞬间。默认为false。
positionStochasticDirection受影响的粒子将其位置设置为这个方向,相对于粒子系统。当将方向解释为点时,可以将其想象为一个箭头,其基础在ParticleSystem的0,0处,尖端在指定位置处。
relativebool受影响的粒子是否将其现有的位置/速度/加速度添加到新粒子上。默认值为true。
shapeShape如果已定义大小,则形状属性可用于影响非矩形区域。
systemParticleSystem这就是受元件影响的系统。如果Affector是一个粒子系统的直接子元素,它将自动与粒子系统相关联。
velocityStochasticDirection受影响的粒子将其速度设置为这个方向。
whenCollidingWithlist<string>如果这里指定了任何逻辑粒子组,那么只有当被选中的粒子与这些组中的一个粒子相交时,才会触发影响器。这与groups属性不同。groups属性选择哪些粒子可以被检查,如果它们满足其他标准(包括在Affector的范围内,通过形状修改),那么它们将再次被测试,以查看它们是否与whenCollidingWith中的一个粒子组中的粒子相交。默认情况下,不指定任何组。

实战使用

基本属性的使用

上述属性列表中列出了基础类型Affector的所有可用属性,下面将结合代码对这些属性进行演示。

改变位置

        //! [A]
        Affector {
            groups: ["A"]
            x: 120
            width: 80
            height: 80
            once: true
            position: PointDirection { x: 120; }
        }
        //! [A]

A影响器用到了基础属性中的groups、once和position。这个影响器设置的大小为宽80、高80,在此范围内经过的粒子组A的粒子都会受到它的影响而做出改变。由于将once属性设置为true,则所有粒子只会改变一次,改变的内容就是将粒子放置在position属性所设置的位置。

简单来说,选定一个粒子组A,这个粒子组中经过影响器A的范围后会改变一次所在位置。下面是演示效果。

red.gif

可以从图中看到,粒子组一下子变到了x=120px的位置,看上去就好像中间断了一截似的。

改变初速度

        //! [B]
        Affector {
            groups: ["B"]
            x: 120
            y: 240
            width: 80
            height: 80
            once: true
            velocity: AngleDirection { angleVariation:360; magnitude: 72 }
        }
        //! [B]

B影响器与A影响器类似,不同之处在于改变的属性变成了velocity。这个属性会将经过影响器范围的所选粒子的初始速度进行改变。此段代码中将粒子组的初始速度变成了角速度。

green.gif 可以看到,本来是横向运动的粒子经过影响器的范围后初始速度发生变化,呈现出了发散状态。

改变加速度

        //! [C]
        Affector {
            groups: ["C"]
            x: 120
            y: 400
            width: 80
            height: 120
            once: true
            relative: false
            acceleration: PointDirection { y: -80; }
        }
        //! [C]

C影响器使用到的基础属性有groups、once、relative和acceleration。在这里将relative设置为false,表示将粒子加速度设置为PointDirection { y: -80; },而不是采用添加的方式。

blue.gif 图中蓝色粒子本来的方向是微微向右下角倾斜,经过影响器范围后,变成了大幅度向上倾斜的状态。