本帖最后由 LocusAzzurro 于 2021-6-10 13:25 编辑
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1eze0i4ri0aj30m80go778.jpg
使用表达式来生成任何你想要的东西!
大家好,这里Az,最近完成了对WorldEdit中//generate 指令的研究,在这里与大家分享一下获得的成果,发掘这个功能更多的潜能。
目录
I.指令简介
II.指令结构与使用方式
III.可用标示
IV.坐标范围
V.等式与不等式
VI.空心图形标示的使用
VII.逻辑门的使用与多面体
VIII.函数的使用
IX.源坐标的使用
X.移动后源坐标的使用
XI.例子-曲面
XII.例子-多面体
XIII.使用例子
XIV.相关资料与来源
XV.后记
阅读提示:你可能需要如下知识来理解本文并了解它的使用方式
注意本文内容与Perlin噪声研究文章所讨论内容并无关联,二者为WorldEdit下的不同功能
WorldEdit插件系列教程(作者 shengjing1): http://www.mcbbs.net/thread-68779-1-1.html
WorldEdit插件资源(作者 sjjklh): http://www.mcbbs.net/thread-68815-1-1.html
WorldEdit插件简短介绍:
2015/12/27 18:54 GMT+1 一次施工完成
2015/12/27 19:21 GMT+1 二次施工完成
2020/09/08 19:32 GMT+1 图片重修复与纯文本流线化完成
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1eze0i4ri0aj30m80go778.jpg
使用表达式来生成任何你想要的东西!
大家好,这里Az,最近完成了对WorldEdit中//generate 指令的研究,在这里与大家分享一下获得的成果,发掘这个功能更多的潜能。
目录
I.指令简介
II.指令结构与使用方式
III.可用标示
IV.坐标范围
V.等式与不等式
VI.空心图形标示的使用
VII.逻辑门的使用与多面体
VIII.函数的使用
IX.源坐标的使用
X.移动后源坐标的使用
XI.例子-曲面
XII.例子-多面体
XIII.使用例子
XIV.相关资料与来源
XV.后记
阅读提示:你可能需要如下知识来理解本文并了解它的使用方式
- WorldEdit 基础操作
- 三维直角坐标系
- 基础代数
- 集合论与逻辑运算
注意本文内容与Perlin噪声研究文章所讨论内容并无关联,二者为WorldEdit下的不同功能
WorldEdit插件系列教程(作者 shengjing1): http://www.mcbbs.net/thread-68779-1-1.html
WorldEdit插件资源(作者 sjjklh): http://www.mcbbs.net/thread-68815-1-1.html
WorldEdit插件简短介绍:
WorldEdit是一个常用的地图编辑工具,玩家可以利用它进行许多建筑中的操作,加快施工速度,同时也提供了许多便捷的功能。
2015/12/27 18:54 GMT+1 一次施工完成
2015/12/27 19:21 GMT+1 二次施工完成
2020/09/08 19:32 GMT+1 图片重修复与纯文本流线化完成
本帖最后由 LocusAzzurro 于 2020-9-8 15:36 编辑
I.指令简介
//generate 为WorldEdit中的一个指令,可简写为//gen或//g,作用是按照用户给出的一个表达式生成对应的形状。这个是WorldEdit一个非常强大的功能,理论上下可以生成任何使用表达式表示的物体,但实际使用有一个较大的限制,由于Minecraft单指令可以输入的最大字符数,过长的表达式无法输入,但就算如此,这个指令仍然可以用来完成一些复杂的操作,在Minecraft各个领域得到应用。在这里我将与各位讲解一下这个指令的使用方法,使用时的注意事项,以及我研究与找到的一些实际使用方法与例子,也希望各位如果有能力一起来完善对这个指令的研究,发掘出他更多的潜力。在正式开始之前,我们来看一个来自WorldEdit Wiki的例子来了解这个指令的强大效果。
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezenpik0n0j311y0jlqg8.jpg
一个心形,仅使用了一个指令生成,虽然在这里我不会介绍如此复杂的使用方式,但从这里也不难看出这个指令的强大。用来生成它的指令为复制代码接下来,我们将会一一讲解这个指令的结构与使用方式。
I.指令简介
//generate 为WorldEdit中的一个指令,可简写为//gen或//g,作用是按照用户给出的一个表达式生成对应的形状。这个是WorldEdit一个非常强大的功能,理论上下可以生成任何使用表达式表示的物体,但实际使用有一个较大的限制,由于Minecraft单指令可以输入的最大字符数,过长的表达式无法输入,但就算如此,这个指令仍然可以用来完成一些复杂的操作,在Minecraft各个领域得到应用。在这里我将与各位讲解一下这个指令的使用方法,使用时的注意事项,以及我研究与找到的一些实际使用方法与例子,也希望各位如果有能力一起来完善对这个指令的研究,发掘出他更多的潜力。在正式开始之前,我们来看一个来自WorldEdit Wiki的例子来了解这个指令的强大效果。
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezenpik0n0j311y0jlqg8.jpg
一个心形,仅使用了一个指令生成,虽然在这里我不会介绍如此复杂的使用方式,但从这里也不难看出这个指令的强大。用来生成它的指令为
- //g wool:red (z/2)^2+x^2+(5*y/4-sqrt(abs(x)))^2<0.6
本帖最后由 LocusAzzurro 于 2020-9-8 15:40 编辑
II.指令结构与使用方式
让我们来看一下之前的指令复制代码
这其中//g 为 //generate 指令的简写wool:red 为使用的方块ID,这里是红色羊毛,可以是数字ID(如1,2),可以是文字ID(如stone,grass)剩余的部分为生成使用的指令,例子中使用的是一个十分复杂的指令,因为并不是本文的重点,我们就不在这里深入研究了。
但这里要讲解一下表达式书写的方式与需要注意的地方首先让我们看一下表达式的写法,它的写法与Java相似:
需要注意的地方有:与日常书写表达式不同,2x,3y等需要用乘号链接,即2*x, 3*y;
最后但并不是最不重要的,WorldEdit中使用的是并不是等式,而是不等式,因为WorldEdit会将选区内的每个方块的位置带入计算,并将结果用方块反映出来,此处的结果只能是1,即有方块,或0,即无方块。如果使用等式的话,由于Minecraft为方块世界,精细度不能达到显示结果的程度,所以效果不佳。(等式无法使用的原因为笔者个人推测,如有错误请指出)但虽然不能使用等式,我们仍可以使用-h标示来达到接近的效果,这部分我们会在介绍标示时继续深入。
综上所述,这个指令的格式为
复制代码
-h, -r, -o 为这个指令可以使用的标示。
使用这个指令的时候需要选择一个选区,形状会在这个选择的选区中生成,注意选区的形状会影响到输出的形状,有时这个特性会造成一些麻烦,但有时可以使用这个来达到希望的效果,这一点我们接下来会讲到。
同时,就像刚才提到的,在使用这个指令时,我们可以使用一个或几个标示来改变指令的效果,来达到需要的结果。
II.指令结构与使用方式
让我们来看一下之前的指令
- //g wool:red (z/2)^2+x^2+(5*y/4-sqrt(abs(x)))^2<0.6
这其中//g 为 //generate 指令的简写wool:red 为使用的方块ID,这里是红色羊毛,可以是数字ID(如1,2),可以是文字ID(如stone,grass)剩余的部分为生成使用的指令,例子中使用的是一个十分复杂的指令,因为并不是本文的重点,我们就不在这里深入研究了。
但这里要讲解一下表达式书写的方式与需要注意的地方首先让我们看一下表达式的写法,它的写法与Java相似:
- 加减乘除分别为+ - * /;
- 次方为 ^ ,这个符号在这里不表示逻辑异或门;
- 使用多重括号时仅能使用圆括号;
- 在表达式中可以使用 && 来代表逻辑与门,用||来代表逻辑或门,! 比较特殊,加在一段表达式前代表逻辑非门,加在表达式或数字之后代表数学阶乘(更详细的介绍见下文逻辑门部分);
- 比较使用的是 < > (大于与小于),<=(小于等于),>=(大于等于),==(等于),!=(不等于);
- 一般的函数是可以在表达式中使用的,如abs()绝对值,cos()正弦,sqrt()平方根等,完整的列表可以查看
需要注意的地方有:与日常书写表达式不同,2x,3y等需要用乘号链接,即2*x, 3*y;
最后但并不是最不重要的,WorldEdit中使用的是并不是等式,而是不等式,因为WorldEdit会将选区内的每个方块的位置带入计算,并将结果用方块反映出来,此处的结果只能是1,即有方块,或0,即无方块。如果使用等式的话,由于Minecraft为方块世界,精细度不能达到显示结果的程度,所以效果不佳。(等式无法使用的原因为笔者个人推测,如有错误请指出)但虽然不能使用等式,我们仍可以使用-h标示来达到接近的效果,这部分我们会在介绍标示时继续深入。
综上所述,这个指令的格式为
- //generate <ID> [-h/-r/-o] <表达式>
-h, -r, -o 为这个指令可以使用的标示。
使用这个指令的时候需要选择一个选区,形状会在这个选择的选区中生成,注意选区的形状会影响到输出的形状,有时这个特性会造成一些麻烦,但有时可以使用这个来达到希望的效果,这一点我们接下来会讲到。
同时,就像刚才提到的,在使用这个指令时,我们可以使用一个或几个标示来改变指令的效果,来达到需要的结果。
本帖最后由 LocusAzzurro 于 2020-9-8 15:42 编辑
III.可用标示[简介]
在使用指令时,我们可以添加一个或多个标示来改变指令的运行方式,添加标示的方法很简单,只需要将标示像添加参数一样的方式添加至指令中即可。如:复制代码
可用的标示有三个,分别是-h,-r与-o。-h 会使生成的形状空心-r 会使生成时使用源坐标-o 会使生成时使用源坐标,同时将坐标系原点移动到玩家位置(或者玩家的第一选择点,如果使用了/toggleplace)
-r 与 -o 的效果冲突,因此-o的效果会覆盖掉-r的效果。-h 与 -r 或 -o二者之一可以同时使用。
这里仅仅给出一个标示的基本介绍,在本文之后的章节中会一一介绍它们的效果,接下来我们首先来集中看一下不使用任何标示的情况。
III.可用标示[简介]
在使用指令时,我们可以添加一个或多个标示来改变指令的运行方式,添加标示的方法很简单,只需要将标示像添加参数一样的方式添加至指令中即可。如:
- //g 1 -h x>y
可用的标示有三个,分别是-h,-r与-o。-h 会使生成的形状空心-r 会使生成时使用源坐标-o 会使生成时使用源坐标,同时将坐标系原点移动到玩家位置(或者玩家的第一选择点,如果使用了/toggleplace)
-r 与 -o 的效果冲突,因此-o的效果会覆盖掉-r的效果。-h 与 -r 或 -o二者之一可以同时使用。
这里仅仅给出一个标示的基本介绍,在本文之后的章节中会一一介绍它们的效果,接下来我们首先来集中看一下不使用任何标示的情况。
本帖最后由 LocusAzzurro 于 2020-9-8 15:51 编辑
IV.坐标范围
在不使用任何标示的情况下,WorldEdit会将当前的选区看做一个三维直角坐标系,坐标系原点为选区中心。
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdx52eq4yj311y0jltng.jpg
如图,我用羊毛标出了三条坐标轴,WorldEdit使用的坐标轴系统与Minecraft的相同,即从西(负)到东(正)为X轴(蓝),从下到上为Y轴(黄),从北到南为Z轴(红)。
这个坐标系三条轴的界限为 -1 与 +1 ,也可以说生成的范围为 [-1;+1] ,注意这个界限仅在不使用标示或仅使用-h标示时存在,-r 与 -o 的运行方式完全不同,我们在下文会分别看到他们的生成方式。http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdx5m8uehj311y0jlqi6.jpg
如上图,我在坐标轴上用金块与钻石块标出了两个点,按照刚才我们讲到的,金块的坐标应为(0;0.5;5)即Y值为0.5,钻石块的坐标为(0.5;0;0)即X值为0.5。
下面我们来试试使用几个简单的方程
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdx6g68uaj311y0jmncp.jpg
上图使用的是复制代码效果即为将所有Y值小于0.5的方块位置设置为白色玻璃方块
接下来我们来试试曲面http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdx5y4rxrj311v0jldw9.jpg
这里使用了球体的公式复制代码生成出的就是半径为1的实心球体(如果你说这个球半径不是1建议重新阅读本章节)。
到这里可能各位都注意到了(什么?你说你没有?),这几次生成使用的选区都是一个正方体,这是因为只有这样生成出的形体才是比例正确的。那么如果选区不是正方体就不能生成了么?并不是,如果用来生成的选区不是正方体,生成的形状会被按照三轴之间的比例在三轴方向被拉伸或压缩,这还是因为选区的范围为从-1到+1造成的。那么如果我用一个长方体的选区生成就是异端了么?也并不是,这两种方式各有他们的用处,如需要生成一个比例正确的结构,像是一个球体,那么使用正方体选区就是正确的选择,如果要生成的是一个椭球,则可以直接选择一个长方体选区,这样球体就会被按照比例自动被拉伸成椭球,也省去了计算椭球表达式的麻烦。
如下图,选区的Y轴实际长度为X轴和Z轴的两倍,图中的金块的坐标依然为 (0;0.5;0) ,在这个情况下生成的形状在Y轴上就会被拉伸两倍。
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdx5hh0arj311y0jljy5.jpg
如果我们再次使用之前的复制代码
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdx6iw4h1j311y0ji47b.jpg
可以看到填充的部分依然是选区下方的3/4 部分,但在Y轴上填充的高度变为了之前的2倍。
最后让我们再次使用一下之前的球体公式
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdx6d1e93j311y0jhgv3.jpg
可以看到,就如刚才所说,生成出的是一个椭球。
IV.坐标范围
在不使用任何标示的情况下,WorldEdit会将当前的选区看做一个三维直角坐标系,坐标系原点为选区中心。
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdx52eq4yj311y0jltng.jpg
如图,我用羊毛标出了三条坐标轴,WorldEdit使用的坐标轴系统与Minecraft的相同,即从西(负)到东(正)为X轴(蓝),从下到上为Y轴(黄),从北到南为Z轴(红)。
这个坐标系三条轴的界限为 -1 与 +1 ,也可以说生成的范围为 [-1;+1] ,注意这个界限仅在不使用标示或仅使用-h标示时存在,-r 与 -o 的运行方式完全不同,我们在下文会分别看到他们的生成方式。http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdx5m8uehj311y0jlqi6.jpg
如上图,我在坐标轴上用金块与钻石块标出了两个点,按照刚才我们讲到的,金块的坐标应为(0;0.5;5)即Y值为0.5,钻石块的坐标为(0.5;0;0)即X值为0.5。
下面我们来试试使用几个简单的方程
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdx6g68uaj311y0jmncp.jpg
上图使用的是
- //g 95:0 y<0.5
接下来我们来试试曲面http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdx5y4rxrj311v0jldw9.jpg
这里使用了球体的公式
- //g 155 x^2+y^2+z^2<1
到这里可能各位都注意到了(什么?你说你没有?),这几次生成使用的选区都是一个正方体,这是因为只有这样生成出的形体才是比例正确的。那么如果选区不是正方体就不能生成了么?并不是,如果用来生成的选区不是正方体,生成的形状会被按照三轴之间的比例在三轴方向被拉伸或压缩,这还是因为选区的范围为从-1到+1造成的。那么如果我用一个长方体的选区生成就是异端了么?也并不是,这两种方式各有他们的用处,如需要生成一个比例正确的结构,像是一个球体,那么使用正方体选区就是正确的选择,如果要生成的是一个椭球,则可以直接选择一个长方体选区,这样球体就会被按照比例自动被拉伸成椭球,也省去了计算椭球表达式的麻烦。
如下图,选区的Y轴实际长度为X轴和Z轴的两倍,图中的金块的坐标依然为 (0;0.5;0) ,在这个情况下生成的形状在Y轴上就会被拉伸两倍。
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdx5hh0arj311y0jljy5.jpg
如果我们再次使用之前的
- //g 95:0 y<0.5
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdx6iw4h1j311y0ji47b.jpg
可以看到填充的部分依然是选区下方的3/4 部分,但在Y轴上填充的高度变为了之前的2倍。
最后让我们再次使用一下之前的球体公式
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdx6d1e93j311y0jhgv3.jpg
可以看到,就如刚才所说,生成出的是一个椭球。