《我的世界》【1.16.5】Java版实用粒子教程(六)

第六节 拓展
一、 画圆命令的改进
一条指令画圆:
execute at <圆心> as <圆周> facing entity @s feet rotated ~-4 ~ run tp @s ^ ^ ^5
#"rotated ~-4 ~"中,"4"为转速,"tp @s ^ ^ ^5"中,"5"为半径。
#不想理解的人直接套模板
指令解读:大概就是让圆周自己绕着圆心旋转,而不是圆心拖拽圆周。

指令用途:可以给一个圆心挂多个圆周,绘制多个不同方向不同转速的同心圆

在前面的章节我们讲过了,画圆的命令只需要两条:
execute as @e[name=1] at @s run tp @s ~ ~ ~ ~4 ~
execute at @e[name=1] run particle minecraft:end_rod ^ ^1 ^5 0 0 0 0 0 force
但是单次绘制出来的圆不够完整。
我们使用的老方法是堆叠命令来让它绘制完整圆,这是基岩版的思路。但是这样就算堆叠四次,实际命令的计算量就是八条。Java版没C++优化那么好啊,不要盲目的堆叠命令。所以我们需要优化。
思路:圆是任意角度都是中心对称的图形,并且圆上的任意点到圆心的距离都是一样的(这个距离叫半径),所以我们可以直接从四个方向绘制这个圆,从盔甲架视线的四个水平方向来显示粒子,由于单个end_rod粒子的存在时间较长,它们拖拽出的轨迹可以重叠,所以就能描出一个完整的圆。
在上面那些命令的基础上,再加:
#从盔甲架视线后方显示粒子
execute at @e[name=1] run particle minecraft:end_rod ^ ^1 ^-5 0 0 0 0 0 force
#从盔甲架视线左方显示粒子
execute at @e[name=1] run particle minecraft:end_rod ^5 ^1 ^ 0 0 0 0 0 force
#从盔甲架视线右方显示粒子
execute at @e[name=1] run particle minecraft:end_rod ^-5 ^1 ^ 0 0 0 0 0 force

二、 竖方向法阵的绘制

绘制思路讲解。
前面的章节已经讲过了,我们这个方法是摆线法绘制,所以正星形的本质就是由圆形扭曲而来,所以我们要先画出一个圆。
我们按照第三节的套路,先把圆tp到一定高度,比如距离地面10格,然后旋转方向又y轴改成x轴。
execute as @e[name=k1] at @s run tp @s ~ 14 ~ ~ ~4
然后在他视角前方五格召唤粒子:
execute at @e[name=k1] run particle minecraft:end_rod ^ ^ ^5

我们发现粒子向下画了一个1/4圆的圆弧然后就不动了。(MC实体向下转是正数角度,向上转是负数角度。)
这是为什么呢?因为实体的视角不能向下转转到后面
所以我们这里的思路是:给向前转和向后转的盔甲架分别赋予tag1和tag2
当盔甲架在前半段时加tag1,从上往下旋转
盔甲架向下转到最下方时加删除tag1并加tag2,然后转180度转到后方,再从最下方转到最上
盔甲架转到最上方的时候删除tag2并加tag1,然后转180度转到前方,然后继续从上往下旋转,形成一个指令闭环
在盔甲架视角前方召唤一个粒子,圆的轨迹就出现了

指令(这个圆的半径是6):
#顺序:从上往下
#让y2旋转前半段
execute as @e[type=minecraft:armor_stand,tag=A,tag=y2] at @s run tp @s -14 11 -115 ~ ~-4
#若y2转到顶就原地横向旋转180度
execute as @e[type=minecraft:armor_stand,tag=A] at @s if entity @s[x_rotation=-90] run tp @s ~ ~ ~ ~180 ~
#[条件制约] 删除tag"y2"
tag @e[type=minecraft:armor_stand,tag=A] remove y2
#[条件制约] 增加tag"x2"
tag @e[type=minecraft:armor_stand,tag=A] add x2
#让x2转后半段
execute as @e[type=minecraft:armor_stand,tag=A,tag=x2] at @s run tp @s -14 11 -115 ~ ~4
#如果x2转到底就原地横向旋转180度转到前方
execute as @e[type=minecraft:armor_stand,tag=A] at @s if entity @s[x_rotation=90] run tp @s ~ ~ ~ ~180 ~
#[条件制约] 删除tag"x2"
tag @e[type=minecraft:armor_stand,tag=A] remove x2
#[条件制约] 增加tag"y2"
tag @e[type=minecraft:armor_stand,tag=A] add y2
#从盔甲架的四个方向显示粒子
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^6 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^-6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^-6 0 0 0 0 0 force

12条命令,绘制一个完整圆。
这个圆还可以在此基础上横向自由旋转,指令:
#"... @s ~ ~ ~ ~15 ~"中,"15为要横向旋转的角度"
execute as @e[type=minecraft:armor_stand,tag=A] at @s run tp @s ~ ~ ~ ~15 ~
8条指令还是太繁琐了,画一个圆怎么会需要那么多命令?
所以我进行了优化,把检测tag改成了检测盔甲架的状态。
思路:在盔甲架y轴初始角度为0的情况下,前半段的y轴角度必定是0,后半段旋转180度后,盔甲架的y轴角度就变成了0+180=180度。使用了选择器的限制条件"y_rotation=",实体的y轴旋转角度。指令的数量就从12条优化到了8条:
#盔甲架前半段的旋转
execute as @e[type=minecraft:armor_stand,tag=A,y_rotation=0] at @s run tp @s -14 11 -115 ~ ~-4
#前半段转到顶就原地横向旋转180度到后方
execute as @e[type=minecraft:armor_stand,tag=A] at @s if entity @s[x_rotation=-90] run tp @s ~ ~ ~ ~180 ~
#盔甲架的后半段旋转
execute as @e[type=minecraft:armor_stand,tag=A,y_rotation=180] at @s run tp @s -14 11 -115 ~ ~4
#后半段转到顶就原地横向旋转180度到前方
execute as @e[type=minecraft:armor_stand,tag=A] at @s if entity @s[x_rotation=90] run tp @s ~ ~ ~ ~180 ~
#从盔甲架的四个方向显示粒子
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^6 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^-6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^-6 0 0 0 0 0 force

这种情况下,圆还是可以横向自由旋转,但在旋转后需要把第一条和第三条指令的选择器里的"y_rotation"的判断角度增加你要旋转的度数。比如我要把这个圆横向旋转15度,那么第一条指令就改成:
execute as @e[type=minecraft:armor_stand,tag=A,y_rotation=15] at @s run tp @s -14 11 -115 ~ ~-4
第三条指令就改成:
execute as @e[type=minecraft:armor_stand,tag=A,y_rotation=195] at @s run tp @s -14 11 -115 ~ ~4
其实,指令还可以继续优化。
思路:如果我只是画圆,那么我没必要让盔甲架必须在竖方向完整转一周。既然盔甲架在不横向旋转的情况下只能画个半圆,那么我就让它只画半圆。但是我可以从四个方向显示这个半圆,这样四个半圆就重叠组合成了一个完整的圆。
指令:
#让盔甲架从最上方转到最下方
execute as @e[type=minecraft:armor_stand,tag=A] at @s run tp @s -14 11 -115 ~ ~-4
#盔甲架角度触底后就把它的角度转回最上方
execute as @e[type=minecraft:armor_stand,tag=A] at @s if entity @s[x_rotation=-90] run tp @s ~ ~ ~ ~ 90
#从盔甲架的四个方向显示粒子
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^6 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^-6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^-6 0 0 0 0 0 force
六条命令绘制出了一个完整的竖方向圆。
优点:计算量少,且可以横向自由旋转。
缺点:因为圆心盔甲架的旋转周期是半圆,所以不能拖拽其他盔甲架,想让这个盔甲架以摆线法在圆内内嵌图形的话,就还是要使用上面两个版本。
接下来是在圆里内嵌图形,摆线法绘制正星形的思路都差不多,所以可以直接套用平面星形的绘制方法。
圆心自转
圆周向圆心自转的反方向自转
圆心拖拽圆周
显示粒子
堆叠命令来让完整星形显示。
召唤盔甲架:summon minecraft:armor_stand ~ ~ ~ {Tags:["A"]}
summon minecraft:armor_stand ~ ~ ~ {Tags:["B"]}
重置盔甲架的方向:execute as @e[type=minecraft:armor_stand,tag=A] at @s run tp @s ~ ~ ~ 0 0
execute as @e[type=minecraft:armor_stand,tag=B] at @s run tp @s ~ ~ ~ 0 0
让所有的盔甲架隐身:execute as @e[type=minecraft:armor_stand] at @s run data modify entity @s Invisible set value 1
接下来是绘制竖方向五芒星法阵的命令:
#这里使用的是通过判定盔甲架的y轴角度来画竖方向圆的方案,没有使用tag
#这里要求圆心和圆周两个盔甲架的x轴、y轴的初始旋转角度都为0
0#圆心盔甲架部分
#圆心盔甲架前半段旋转
execute as @e[type=minecraft:armor_stand,tag=A,y_rotation=0] at @s run tp @s -14 17 -115 ~ ~-4
#圆心盔甲架前半段转到顶就横向旋转180度转到后面
execute as @e[type=minecraft:armor_stand,tag=A] at @s if entity @s[x_rotation=-90] run tp @s ~ ~ ~ ~180 ~
#圆心盔甲架的后半段旋转
execute as @e[type=minecraft:armor_stand,tag=A,y_rotation=180] at @s run tp @s -14 17 -115 ~ ~4
#圆心盔甲架后半段转到底就横向旋转180度到前面
execute as @e[type=minecraft:armor_stand,tag=A] at @s if entity @s[x_rotation=90] run tp @s ~ ~ ~ ~180 ~
#圆周盔甲架部分
#注意,圆周的盔甲架与圆心盔甲架的自转方向相反,所以在y轴角度相同的情况下,圆心的x轴转角若为正方向,那么圆心的旋转方向就是负方向,所以第二条命令判断的角度自然也就改成了正数角度,后面两条命令的参数也随之改变,注意观察命令的细节
#圆周盔甲架的前半段旋转
execute as @e[type=minecraft:armor_stand,tag=B,y_rotation=0] at @s run tp @s ~ ~ ~ ~ ~6
#圆周盔甲架前半段转到底就横向旋转180度到后面
execute as @e[type=minecraft:armor_stand,tag=B] at @s if entity @s[x_rotation=90] run tp @s ~ ~ ~ ~180 ~
#圆周盔甲架的后半段旋转
execute as @e[type=minecraft:armor_stand,tag=B,y_rotation=180] at @s run tp @s ~ ~ ~ ~ ~-6
#圆周盔甲架后半段转到顶就横向旋转180度到前面
execute as @e[type=minecraft:armor_stand,tag=B] at @s if entity @s[x_rotation=-90] run tp @s ~ ~ ~ ~180 ~
#圆心拖拽圆周
execute as @e[type=minecraft:armor_stand,tag=A] at @s run tp @e[type=minecraft:armor_stand,tag=B] ^ ^ ^6
#圆心盔甲架携带的粒子
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^9.5 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^ ^-9.5 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^11 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=A] at @s run particle minecraft:end_rod ^ ^-11 ^ 0 0 0 0 0 force
#圆周盔甲架携带的粒子
execute as @e[type=minecraft:armor_stand,tag=B] at @s run particle end_rod ^ ^ ^3.5 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=B] at @s run particle end_rod ^ ^ ^3.5 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=B] at @s run particle end_rod ^ ^ ^3.5 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=B] at @s run particle end_rod ^ ^ ^3.5 0 0 0 0 0 force
一共17条命令,堆叠八次

效果:

这个五角星自带自转的效果,自转的速度取决于你把命令堆叠了多少次。
就比如这个我堆叠了十六次命令的flame粒子法阵:

三、粒子球
摆线法绘制粒子球的原理就是让竖方向圆以一定的速度进行横方向旋转,所以圆的半径就是粒子球的半径。
指令:
#这里采用的是六条命令画圆的版本,所以圆心盔甲架不可在竖方向拖拽其他盔甲架
#圆心盔甲架旋转前半段
#注意,这条指令在Y轴方向也设置了旋转角度,所以这个竖方向圆的横向转速是2
execute as @e[type=minecraft:armor_stand,tag=500w] at @s run tp @s -14 20 -115 ~2 ~-4
#圆心盔甲架角度触底后就把它的角度转回最上方
execute as @e[type=minecraft:armor_stand,tag=500w] at @s if entity @s[x_rotation=-90] run tp @s ~ ~ ~ ~2 90
#从圆心盔甲架视线的四个方向显示粒子
execute as @e[type=minecraft:armor_stand,tag=500w] at @s run particle minecraft:end_rod ^ ^ ^6 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=500w] at @s run particle minecraft:end_rod ^ ^6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=500w] at @s run particle minecraft:end_rod ^ ^-6 ^ 0 0 0 0 0 force
execute as @e[type=minecraft:armor_stand,tag=500w] at @s run particle minecraft:end_rod ^ ^ ^-6 0 0 0 0 0 force
堆叠四次,点到为止即可。

效果:

如果命令堆叠的次数过多效果就会变样,比如我堆叠了八次:

四、三维空间内任意平面的圆
这些是小豆给的命令,感谢小豆。
学习这部分前,建议读者先去了解一下三角函数和欧拉角。
在MC里,存在着X、Y、Z体系的三维坐标系,但是实体都只能上下和左右旋转,即世界坐标的X轴和Y轴旋转,横滚的Z轴是个不存在的轴。
所以我们要通过三角函数和三维向量来确定圆在进行Z轴旋转变化后得到的点,然后把公式套入命令,得到变化后粒子所在的三维坐标。
注:函数执行的方向就是圆的朝向,如果不想瞬间画圆,就把递归改成连闪。




五、公式法画图形
案例作者:小豆
公式法画图形就是通过直线的方程计算出粒子所在的点,读者可以自己把命令抄下来多写写,学习一下是如何把公式代入命令的。这个五角星一样可以在三维空间任意角旋转,函数执行的方向就是五角星的朝向,不想瞬间画出图形就把高频改成连闪。






所以这里的效果差不多都可以用以上的原理做出来:
【我的世界】史诗工程—指令魔法阵 https://www.bilibili.com/video/BV1xb4y1m7yc
