教程:函数曲线 - FrankYang6921/extreme-particles Wiki

现在你学完了单个粒子。想不想一次生成许多个?这可不是原版弱智的随机生成,它是按照你的函数来生成的。

/exp functional <粒子名称> <表达式> [<x> <y> <z>] [时长] [数量]

我会一一为你介绍所有的参数。

原点

为什么不先讲表达式?因为它比较难以理解,而且有了这些知识作为铺垫,你学起来会更加轻松。在表达式中,你可以指定xyz三个参数,就像你创建单个粒子时那样,但是为了使你的指令能够得到反复使用,我并不打算在表达式中使用绝对坐标。相反,我使用了相对坐标,相对于你在此处指定的原点。举个例子,你在表达式中设x-3,设原点的x4,则最终粒子所在的X坐标为(-3) + 4 = 1。对于yz同理。

时长

顾名思义 × 1,它指定了动画的时长(ms)。这个值默认是1000,适用于大多数场景。

数量

顾名思义 × 2,它指定了粒子的总数(个)。这个值默认是100,适用于大多数场景。

表达式

这是最复杂、最难懂的一块。且先看我来举个例子(秀一把)。

exp functional minecraft:end_rod "x=p*20; y=(p>.5?(1-p):p)*3*Math.sin(p*90)+1+p*3; z=(p>.5?(1-p):p)*3*Math.sin(p*90+1.57)-p*3; r=0xff; g=0x66; b=0x66; a=1; l=100; s=.5;" ~ ~ ~ 2000 1900

实在是标致极了()咳咳,先不秀了,来看个简单点的~

exp functional minecraft:end_rod "x=p*10; y=p*10; z=p*10; r=0x66; g=0xcc; b=0xff; a=p; l=200; s=p*2;" ~ ~ ~ 2000 1900

就像这样。注意到表达式,它是一个JavaScript语句块。没有学过JavaScript也不要紧!这里有一个入门教程。为了让你更好的理解,我把这个语句块单独拿出来。

x = p * 10;  // <x>
y = p * 10;  // <y>
z = p * 10;  // <z>
r = 0x66;  // <r>
g = 0xcc;  // <g>
b = 0xff;  // <b>
a = p;  // <透明度>
l = 200;  // <寿命>
s = p * 2;  // <大小>

看上去舒服多了吧!我还加了一些注释。它就像数学中的函数,具有自变量和因变量。在这里,因变量便是xyzrgbalsdxdydz。它们和你生成单个粒子时的参数是一一对应的。,如//后的注释所示。它们也须遵循单个粒子教程中提到的值域。自变量目前一共有3个:

使用这三个自变量,你就可以确定你的函数了。不同的函数之间使用分号来分割。让我们来分析一下上面的例子。它将xyz都表示为了p * 10,这意味着动画开始时它们都是0.0,动画结束时它们无限接近于1.0(记住,p总是在[0, 1)的范围内)。它还将rgb分别表示为了0x660xcc0xff,这是十六进制表示法,与#66ccff这样的表示法没有本质上的不同。这是一个常值函数。同理,它也将asp来表示了,l是常值函数。

下面,我会来快速地教你一些JavaScript的语法。在JavaScript中,“÷”用/表示,“×”用*表示,用%来求余数。先乘除后加减,括号内最先计算,与数学中的表达式并没有很大的区别。如果你需要三角函数,可以使用形如Math.sin(3.14)这样的写法,与数学中的sin3.14无异。所有的三角函数都使用弧度制。需要更多的细节,请点这里

小提示

怎样决定函数的定义域?这样!

if (0.0 <= p <= 0.5) x = 0.5 - p;
if (0.5 < p <= 1.0) x = p - 0.5;

if (...)的部分可以被理解成函数的定义域。上面的语句块与如下的数学表达式等效:

x = 0.5 - p (0 ≤ p ≤ 0.5)
x = p - 0.5 (0.5 < p ≤ 1)

Further more!

你现在已经知道了如何来生成一个函数曲线。准备好来学习生成图像了吗?