# 定向粒子
粒子不光可以旋转,也可以有运行轨迹。使用随机方向(也称为向量空间)定义了粒子的速度和加速度,形成了粒子的轨迹。
提供了不同空间向量来定义粒子的速度与加速度:
AngleDirection
(角度方向) - 一个角度变化的方向PointDirection
(点方向) - 一个x和y分量变化的方向TargetDirection
(目标方向) - 一个朝着目标点的方向
尝试使用速度方向将粒子从场景的左侧移动到右侧。
首先尝试使用AngleDirection
。 为此,需要将AngleDirection
指定为发射器的速度属性的一个元素:
velocity: AngleDirection { }
粒子发射的角度使用angle
属性指定。 角度范围为0~360°,以向右为0°。 对于此示例,希望粒子向右移动,因此0已经是正确的方向;颗粒应散布的角度为±5°:
velocity: AngleDirection {
angle: 0
angleVariation: 15
}
现在已经设置了方向,接下来是指定粒子的速度。 速度通过幅度定义,幅度表示每秒运动的像素数。 大约有640px的宽度,幅度为100似乎是一个不错的数字。 这意味着粒子穿过开放空间的存在期限为6.4秒。 为了使粒子的移动更加有趣,将magnitudeVariation
设置为幅度的一半来改变幅度:
velocity: AngleDirection {
...
magnitude: 100
magnitudeVariation: 50
}
这是完整的源代码,平均生命周期设置为6.4秒。 将发射器的宽度和高度设置为1px,这意味着所有粒子都在同一位置发射,并从这里根据给定的轨迹传播。
Emitter {
id: emitter
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
width: 1; height: 1
system: particleSystem
lifeSpan: 6400
lifeSpanVariation: 400
size: 32
velocity: AngleDirection {
angle: 0
angleVariation: 15
magnitude: 100
magnitudeVariation: 50
}
}
那么加速度用于做什么呢? 加速度为每个粒子添加一个加速度向量,会随着时间的推移改变速度向量。 例如,制作一个像星星弧一样的轨迹。 为此,将速度方向更改为-45°并消除对角度变化范围的控制,以更好地将连贯的弧线可视化:
velocity: AngleDirection {
angle: -45
magnitude: 100
}
将加速度方向设置成90°(向下方向),将加速度的幅度设置为速度的四分之一(100/25=4):
acceleration: AngleDirection {
angle: 90
magnitude: 25
}
结果是一条左中部到右底部的弧线。
这些值是通过试错的方法发现的。
这是发射器的完整代码。
Emitter {
id: emitter
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
width: 1; height: 1
system: particleSystem
emitRate: 10
lifeSpan: 6400
lifeSpanVariation: 400
size: 32
velocity: AngleDirection {
angle: -45
angleVariation: 0
magnitude: 100
}
acceleration: AngleDirection {
angle: 90
magnitude: 25
}
}
下面的粒子希望粒子从左到右移动,但是这次使用向量空间PointDirection
。
PointDirection
从x和y分量衍生出它的向量空间。 例如,如果希望粒子以45°向量移动,则需要为x和y指定相同的值。译者笔记:这里的x和y只是用于指定方向的,而不代表运动到的目标点。
本例中,希望粒子从左到右移动,构建一个15°的圆锥。 为此,指定一个PointDirection
作为速度的向量空间:
velocity: PointDirection { }
为了实现每秒100px移动速度,将x分量设置为100。对于15°(即,90°的1/6),指定y变化为100/6:
译者分析:
我认为上面的角度的计算是错误的,x方向没有变化范围就是100,y方向存在变化范围是±100/6。
如下图所示:
OA的长度为100,AB的长度为100/6,那么所有可能的方向向量都在图中的阴影区域。由于是椎体,需要计算图中∠AOB,这样就是最大的范围。
如图所示,计算出来的范围应该是9.48°,远没有达到15°。
velocity: PointDirection {
x: 100
y: 0
xVariation: 0
yVariation: 100/6
}
结果应该是粒子从右到左以在15°的圆锥体中移动。
看下最后一种选择,TargetDirection
。 目标方向允许将目标点指定为相对于发射器或项的x和y坐标。 这个项(译者注释:也就是被指定的属性值)中指定的中心点将成为目标点,可以通过指定x轴的1/6偏差(译者注释:作为y轴)来实现15°的圆锥:
velocity: TargetDirection {
targetX: 100
targetY: 0
targetVariation: 100/6
magnitude: 100
}
译者注释:
targetVariation这个变量应该是在x、y轴上都产生效果吧?
那么y的范围就是±100/6,x的范围是100±(100/6),这样能够得出比15°椎体更大的范围。
角度可能的范围,如下图所示:
OA为x轴的正常的范围100, B和E为A点的偏差区间,EF(等同BD、AC)为y轴的正常偏差的一半(另一半未画出,因为圆锥角度只需要一半)。
在图上,可以看到∠DOB包裹了所有可能的角度,也就是圆锥的角度。计算出来为11.30°。
提示
当有一个特定的x/y坐标,希望向其发射粒子流时,可以使用目标方向。
由于与上一张效果图类似,就不放效果图了。相反,这里提出一个问题:
在下图中,红色和绿色圆圈分别为速度和加速度属性的目标方向指定了目标项,每个目标方向具有相同的参数。 这里的问题是:谁负责速度,谁负责加速度?