使用ParticleBlinkScript节点

ParticleBlinkScript节点类似于BlinkScript节点,但不是在图像上工作,而是在粒子系统上工作。它是一个粒子节点,可让您编写Blink内核以修改粒子,从而实现使用以下操作无法实现的自定义行为Nuke的内置粒子节点。

要使用ParticleBlinkScript节点,请以与其他任何粒子节点相同的方式将其连接到粒子系统。

注意:  有关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为内核参数创建旋钮时,它可以防止名称冲突。

有关更多信息,请参见NukeHelp菜单下Documentation > Guide to Writing Blink Kernels或导航至: https://learn.foundry.com/nuke/developers/121/BlinkKernels/

警告:  ParticleBlinkScript非常灵活,因为您可以在内核中编写的代码没有任何限制。结果,从内核源编译的代码可能会导致Nuke崩溃,所以请谨慎使用!