使用ParticleBlinkScript节点
ParticleBlinkScript节点类似于BlinkScript节点,但不是在图像上工作,而是在粒子系统上工作。它是一个粒子节点,可让您编写Blink内核以修改粒子,从而实现使用以下操作无法实现的自定义行为Nuke的内置粒子节点。
要使用ParticleBlinkScript节点,请以与其他任何粒子节点相同的方式将其连接到粒子系统。
注意: 有关ParticleBlinkScript节点属性的完整细分,请参阅ParticleBlinkScript在参考指南中。
在ParticleBlinkScript中Properties标签,在script部分,编写一个Blink内核以修改粒子属性。声明要作为属性读取或写入的每个属性图片。节点绑定每个图片您在内核中声明了相同名称的粒子属性。
例如,如果要修改粒子位置,请声明一个图片叫p_position。所有粒子图像名称必须以前缀开头_。
注意: 在与属性名称匹配之前,将删除前缀。使用前缀的原因是,可以声明其他类型的特殊图像(请参见下文)。
闪烁内核示例
Nuke有一个ParticleDrag op,它将每个粒子的速度乘以阻力系数。>下面是一个示例Blink内核,它执行相同的操作。
kernel ParticleDragKernel : ImageComputationKernel<ePixelWise> { //为我们感兴趣的粒子属性声明图像 Image<eRead> p_startTime; Image<eReadWrite> p_velocity; param: //声明参数 float _drag; // This will be a knob for the drag factor float _dt; // The time step for the kernel float _endTime; // The particle system time at the end of the step void define() { defineParam(_drag, "pa_drag", 1.0f); defineParam(_dt, "_dt", 1.0f); defineParam(_endTime, "_endTime", 1.0f); } void process() { //计算该粒子的时间步长 float dt = max(0.0f, min(_dt, float(_endTime - p_startTime()))); //由于这是阻力,因此在dt上赋予指数衰减更为精确。对于其他部队,我们可能只想乘以dt。 float t = pow(1.0f-_drag, dt); p_velocity() *= t; } }; |
一个图片声明了粒子速度属性, p_velocity。在这种情况下, 图片将要读写,因此必须将其声明为eReadWrite。在此内核中, 图片粒子系统的宽度为1,高度为粒子数。
注意: 通常只需要读取一个属性,在这种情况下,可以将其声明为电子阅读。
有一个参数, pa_drag,速度乘以处理()方法。Nuke每个粒子调用一次处理方法。
注意: 前缀pa_添加到拖动参数名称不是必需的,但是是一种很好的做法,因为当ParticleBlinkScript为内核参数创建旋钮时,它可以防止名称冲突。
有关更多信息,请参见Nuke的Help菜单下Documentation > Guide to Writing Blink Kernels或导航至: https://learn.foundry.com/nuke/developers/121/BlinkKernels/
警告: ParticleBlinkScript非常灵活,因为您可以在内核中编写的代码没有任何限制。结果,从内核源编译的代码可能会导致Nuke崩溃,所以请谨慎使用!