Minecraft(我的世界)中文论坛
标题: [WorldEdit]//generate 指令研究 - 使用表达式生成任何形体!(WE 5.0+) [~8000字 ]
作者: LocusAzzurro 时间: 2015-12-27 23:38
标题: [WorldEdit]//generate 指令研究 - 使用表达式生成任何形体!(WE 5.0+) [~8000字 ]
本帖最后由 LocusAzzurro 于 2020-9-8 18:32 编辑
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 时间: 2015-12-27 23:39
本帖最后由 LocusAzzurro 于 2020-9-8 15:40 编辑
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()平方根等,完整的列表可以查看
WorldEdit Wiki http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax#Functions (在下文的函数部分会有更多的介绍)
需要注意的地方有:与日常书写表达式不同,2x,3y等需要用乘号链接,即2*x, 3*y;
最后但并不是最不重要的,WorldEdit中使用的是并不是等式,而是不等式,因为WorldEdit会将选区内的每个方块的位置带入计算,并将结果用方块反映出来,此处的结果只能是1,即有方块,或0,即无方块。如果使用等式的话,由于Minecraft为方块世界,精细度不能达到显示结果的程度,所以效果不佳。(等式无法使用的原因为笔者个人推测,如有错误请指出)但虽然不能使用等式,我们仍可以使用-h标示来达到接近的效果,这部分我们会在介绍标示时继续深入。
综上所述,这个指令的格式为
- //generate <ID> [-h/-r/-o] <表达式>
复制代码
-h, -r, -o 为这个指令可以使用的标示。
使用这个指令的时候需要选择一个选区,形状会在这个选择的选区中生成,注意选区的形状会影响到输出的形状,有时这个特性会造成一些麻烦,但有时可以使用这个来达到希望的效果,这一点我们接下来会讲到。
同时,就像刚才提到的,在使用这个指令时,我们可以使用一个或几个标示来改变指令的效果,来达到需要的结果。
作者: LocusAzzurro 时间: 2015-12-27 23:40
本帖最后由 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
可以看到,就如刚才所说,生成出的是一个椭球。
作者: LocusAzzurro 时间: 2015-12-27 23:41
本帖最后由 LocusAzzurro 于 2020-9-8 15:56 编辑
V.等式与不等式
刚才提到了WorldEdit使用的不等式而非等式,这里简单来讲解一下二者的区别(学霸可以跳过)。
下面的这个等式是一条直线
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdxjhmeywj30ts0d9aab.jpg
而不等式表达的是一个区域
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdxj41194j30ti0cw0t2.jpg
WorldEdit中使用的是不等式,来表达一个区域,这个区域中的方块位置便会被放置方块。
作者: LocusAzzurro 时间: 2015-12-27 23:41
本帖最后由 LocusAzzurro 于 2020-9-8 16:03 编辑
VI.空心图形标示的使用
刚才我们提到了生成时可以使用表示来改变命令的输出,首先我们来看一下空心图形标示,即 -h ,它的作用是可以使生成的图形“空心”,即只有图形边缘位置得方块会被生成,这个边缘的判定方式是“如果这个方块位置一方块单位周围的任何方块位置不属于这个图形,那么这个位置的方块就会被生成,反之则不生成。”
首先我们来看一个例子
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdxt0qwk4j311y0jlk49.jpg
上图使用的指令是即一个抛物面的下方部分
如果使用相同的表达式,但是使用-h 标示,结果就会是这样的(下图红色玻璃部分为新指令输出,覆盖到白色玻璃的旧指令的输出上进行比较)。
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdxsxesh0j311y0jigz2.jpg
可以看到,只有抛物面最上方(也可以说只有抛物面本身)的位置生成了方块。上图使用的是
就像我们刚刚看到的,使用这个方式也可以使不等式拥有类似等式的输出,接下来我们来看一下另一个例子。在本文开始的部分我们提到了球体内部的不等式如果我们使用-h 标示,就可以生成空心的球体,即表达式为的球面,虽然并不能达到完全准确,但也能达到**分。
那么,我们来看一下生成的效果:http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdxtqc69wj311y0jm4at.jpg
上图使用的命令为- //g 95:0 -h x^2+y^2+z^2<1
复制代码
可以看到使用空心图形标示的效果。
到现在为止,我们使用的例子都是简单的平面或曲面,那么各位可能会问了,像是正方体这种有棱有角的多面体可以生成吗?答案是肯定的,但生成多面体我们需要用到另一个功能,那就是逻辑门。
作者: LocusAzzurro 时间: 2015-12-27 23:41
本帖最后由 LocusAzzurro 于 2020-9-8 15:36 编辑
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 时间: 2015-12-27 23:42
本帖最后由 LocusAzzurro 于 2020-9-8 15:42 编辑
III.可用标示[简介]
在使用指令时,我们可以添加一个或多个标示来改变指令的运行方式,添加标示的方法很简单,只需要将标示像添加参数一样的方式添加至指令中即可。如:
可用的标示有三个,分别是-h,-r与-o。-h 会使生成的形状空心-r 会使生成时使用源坐标-o 会使生成时使用源坐标,同时将坐标系原点移动到玩家位置(或者玩家的第一选择点,如果使用了/toggleplace)
-r 与 -o 的效果冲突,因此-o的效果会覆盖掉-r的效果。-h 与 -r 或 -o二者之一可以同时使用。
这里仅仅给出一个标示的基本介绍,在本文之后的章节中会一一介绍它们的效果,接下来我们首先来集中看一下不使用任何标示的情况。
作者: LocusAzzurro 时间: 2015-12-27 23:42
本帖最后由 LocusAzzurro 于 2020-9-8 16:18 编辑
VII.逻辑门的使用与多面体
在之前我们提到了在表达式中可以使用逻辑门,我们首先来回顾一下:&& 表示逻辑与门|| 表示逻辑或门! 加在一段表达式前表示逻辑非门
那么这些逻辑门有什么作用呢,我们来一个个看一下:
逻辑与门代表集合论中的交集,即同时属于两个或更多集合的元素,在几何中我们可以理解为同时满足多个不等式的部分。
我们可以用一个例子来理解一下:如下图表示的是 y<0的区域指令http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdxl9z6w4j311y0jlk3h.jpg
下图表示的是 x<0 的区域指令
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdxl7b69ij311y0joqgt.jpg
那么如果我们使用逻辑与门将两个表达式连接,即我们表达的是两部分的交集(即y<0∩x<0),即同时满足两个不等式的区域,也可以说是两部分共有的区域。使用指令我们会得到下面的结果:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdxl16m7nj311y0jlwqc.jpg
这印证了我们刚才所说的,只有两部分(红色与蓝色的部分)共有的区域被生成了。
接下来是逻辑或门,它相当于集合论中的并集,如果我们依旧使用之前的两个不等式x<0 与y<0但使用逻辑与门来连接,即我们表达的是两个不等式的并集(x<0∪y<0),即两个不等式的区域相加的结果,也可以说是所有包括在两个不等式的任何一个中或两个中的区域。使用指令:我们得到的是下面的结果:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdxl4i116j311y0jj4c4.jpg
可以看到,生成的区域包括了之前两个不等式所有的部分。
最后我们一起看一下逻辑非门以及多个逻辑门的使用。逻辑非门表示“不属于这个集合的部分”,即如果我们的集合是y<0,那么如果我们在它之前加上非门,即 !(y<0) (由于!符号的多种意义,建议在为需要使用非门的部分加上括号),我们表达的就是y>0 的部分(其实是y>=0,但WorldEdit不支持等式),即属于 y<0 的部分。多个逻辑门的使用即为使用多个逻辑门来表达一个特定的区域,这里需要注意的是,就像数学计算一样,先乘除后加减,先计算括号内部分,从左到右计算一样,逻辑运算也有它的规则:- 和数**算一样,逻辑运算中括号也有最高的优先级,并遵循从左到右的运算顺序。
同样,我们继续使用之前的两个不等式来举例,这一次我们表达的是:表达的是x<0与非y<0的交集,我们知道我们首先需要计算非门,所以我们的表达式可以理解为:即为x<0 与 y>0的交集。整个表达式表达的是“x>0区域与非y<0区域共有的部分”。让我们把它写进命令里:会得到这个结果:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdxkyb1n1j311y0jn153.jpg
就像我们刚才所说。
讲了那么多我们来看一个实际的例子,一个在选区中心,边长为1的正方体,我们需要先确定正方体6个面所属的平面,然后用不等式决定区域(这里需要有些3D分析能力),找到6个不等式然后将它们用 逻辑与门 && 连起来,意思就是找到这6个区域共有的区域,那个区域就是我们的正方体了。
我们的正方体的8个顶点分别为:
- (0.5;0.5;0.5)
- (0.5;-0.5;0.5)
- (0.5;0.5;-0.5)
- (0.5;-0.5;-0.5)
- (-0.5;0.5;0.5)
- (-0.5;-0.5;0.5)
- (-0.5;0.5;-0.5)
- (-0.5;-0.5;-0.5)
它的六个面所属的六个平面将会分别为:- x=0.5
- x=-0.5
- y=0.5
- y=-0.5
- z=0.5
- z=-0.5
接下来将它们变为不等式:
- x<0.5
- x>-0.5
- y<0.5
- y>-0.5
- z<0.5
- z>-0.5
这6个不等式的空间区域的交集就是那个正方体了。我们用&&表示逻辑与门,就是交集,这样就可以把6个不等式连起来:- x<0.5 && x>-0.5 && y<0.5 && y>-0.5 && z<0.5 && z>-0.5
复制代码
最后的指令就是:- //g 155 x<0.5 && x>-0.5 && y<0.5 && y>-0.5 && z<0.5 && z>-0.5
复制代码
输入指令,成功生成了正方体:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdxkpeo4qj311x0jo143.jpg
以上便是多面体的生成方式以及逻辑门的使用,接下来我们来通过几个例子看一看WorldEdit中函数的使用。
作者: LocusAzzurro 时间: 2015-12-27 23:43
本帖最后由 LocusAzzurro 于 2020-9-8 17:44 编辑
IX.源坐标的使用
现在我们来关注一下 -r 标示,它的作用是使生成时使用源坐标,简单来说,就是将整个地图视作一个巨大的立体直角坐标系,虽然生成的范围依旧会被限制在选区中,但使用指令时可以带入实际的坐标进行(即F3画面上的XYZ坐标)运算。
这样说起来可能不好理解,让我们来看一个例子吧:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdxz8sdq0j311y0jgni9.jpg
我们的目标是建立一个以上图的玻璃方块位置为中心,半径为5的球体,首先我们需要得到这个玻璃方块的坐标,即(-167;30;324) (见上图左上角最后一行Looking at:)。
我们知道,三维球面的方程是(x-x[sub]c[/sub])[sup]2[/sup]+(y-y[sub]c[/sub])[sup]2[/sup]+(z-z[sub]c[/sub])[sup]2[/sup]=r[sup]2[/sup]
带入我们的中心点坐标,并加上半径5,就成了:- (x+167)^2+(y-31)^2+(z-324)^2=25
复制代码 现在我们可以将它转化成不等式,来表达球体内部:- (x+167)^2+(y-31)^2+(z-324)^2<25
复制代码 将其带入指令(不要忘记-r标示):- //g 155 -r (x+167)^2+(y-31)^2+(z-324)^2<25
复制代码 输入指令,可以得到下面的结果:http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdxzmkr4cj311y0jnkin.jpg
我们成功地在正确的位置生成了正确的球体(你说你弄这么一大堆就为跟我说个球?)
接着我们来看这个模式可能的另一个应用,使用三个点来生成一个平面:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdxy14nu0j311y0joqb0.jpg
如上图,在空间里选择了三个点,使用羊毛标注,我们的目标是找到并生成这过这三个点的唯一平面(给出空间中三个不在同一直线的点,仅存在一个过这三点的平面)。
首先我们需要找到这三个点的坐标:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdxy14nu0j311y0joqb0.jpg
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdyc3jl3mj311y0jj7lc.jpg
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdxyvpfouj311y0jmgtb.jpg
R(-177;23;230)B(-176;36;315)Y(-164;29;316)
通过计算,我们可以得到平面的方程为:接下来我们来将它带入指令- //g 95:0 -r -h -92*x-181*y-163*z+41669<0
复制代码 可以看到等式转换成了不等式,并且使用了-h标示来仅生成平面,输入后我们得到的是:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdxyz572pj311y0jmtsy.jpg
可以看到我们成功生成了过三点的平面,可以注意到只有这个平面在选区中的部分被生成了,也可以理解为生成了平面与选区范围的交集。
作者: LocusAzzurro 时间: 2015-12-27 23:44
本帖最后由 LocusAzzurro 于 2020-9-8 17:43 编辑
X.移动后源坐标的使用
最后,我们来看一下-o 标示,移动过的源坐标,它与之前的-r 标示十分相似,也是使用实际地图坐标长度来进行运算,但二者的区别是-r 完完全全使用的是真实的方块坐标,但-o 模式会将玩家使用命令时所在的位置(或者玩家的第一个选择点,如果使用了/toggleplace),作为三维直角坐标系的原点。
和刚才一样,我们来看一个例子:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdyw7wm46j311y0jgtkv.jpg
这次我们的目标是生成一个以这个金块为中心的空心椭球,和刚才不同,我们不需要得到这个金块的坐标,而是将这个金块位置的坐标看做原点,即(0;0;0)
接着,我们在这个位置使用指令- //g 95:0 -o -h x^2+(2*y)^2+z^2<100
复制代码
可以看到使用了-o 与 -h 标示,并且并没有对像刚才一样带入中心点的坐标,如此输入的结果是:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdywpiwquj311y0jhqhw.jpg
从外面看的效果如下:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdywks0s5j311y0jlwy5.jpg
成功生成了需要的椭球。
最后我们来看一个斜面:http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdywxhk63j311y0jk7n9.jpg
如上图,我们在钻石块位置使用指令:因为x=y平面的特性,可以生成一个45度的斜面效果如下:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdyx7w6ccj311y0jpwp0.jpg
整体效果:
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdyx4fu7sj311y0jnh0m.jpg
至此,对于指令本身的研究结束,接下来会展示一些本人收集到的一些实际的应用与实际操作例子(部分为个人研究,部分为在他人的研究之上进行的深入,部分为他人的研究)。
作者: LocusAzzurro 时间: 2015-12-27 23:44
本帖最后由 LocusAzzurro 于 2020-9-8 18:09 编辑
XII.例子-多面体
1.四棱柱
旋转45度后的正方体- -2*x+2*z+2>0 && -2*x-2*z+2>0 && 2*x+2*z+2>0 && 2*x-2*z+2>0
复制代码 形体高度=选区高度
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzbhwwl5j311y0jjap6.jpg
2.三棱柱
底边平行于X轴- z<(3*sqrt(2)/2)*x+(3*sqrt(2)-2)/2 && z<-(3*sqrt(2)/2)*x+(3*sqrt(2)-2)/2
复制代码 形体高度=选区高度
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzs0n6nzj311y0ji4i3.jpg
3.金字塔/四棱锥- -2*x-y+1>0 && 2*x-y+1>0 && -2*z-y+1>0 && 2*z-y+1>0
复制代码 形体高度=选区高度
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzrbygu5j311y0jlqhd.jpg
4.四面体- 4*x + 4*y +4*z + 4>0 &&-4*x + 4*y +4*z -4<0&&-4*x + 4*y +-4*z + 4>0&&4*x + 4*y +-4*z -4<0
复制代码 形体高度=选区高度
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdzrxk858j311y0jodz5.jpg
作者: LocusAzzurro 时间: 2015-12-27 23:45
本帖最后由 LocusAzzurro 于 2020-9-8 18:26 编辑
XIII.使用例子
最后,我们来看几个实际的操作例子:
1. 肋形穹顶走廊
操作目标是在这些柱子上加上肋形穹顶
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdztvfjjhj311y0jl4lh.jpg
首先确定选区,选区底边的四个点为四根柱子的中心点
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzu12l6vj311y0jlap5.jpg
接下来使用肋形穹顶的指令- //g 1:6 -h ((x+1)^2+(y+1)^2<4&&(x-1)^2+(y+1)^2<4)||((z+1)^2+(y+1)^2<4&&(z-1)^2+(y+1)^2<4)
复制代码
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzu4b6l0j311y0jjdv6.jpg
成功生成了穹顶
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdzu9babdj311y0jn196.jpg
接下来使用//stack进行堆积即可,最终效果如下
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzuf9e2bj311y0jlh1c.jpg
2. 半椭球穹顶
目标为在圆形底座上创建半椭球型的穹顶,首先创建选区
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzur4lemj311y0jjk7j.jpg
使用指令
- //g lapislazuli -h x^2+(y+1)^2+z^2<1
复制代码
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdzuwia1tj311y0jowun.jpg
成功生成,效果如下
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzv201z7j311y0jiatn.jpg
3. 复合式穹顶
使用帆拱与圆形穹顶组合的复合式穹顶首先创建一个帆拱- //g 155 -h -h x^2+(y+1)^2+z^2<2
复制代码
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdzz5y2ffj311w0jlgxj.jpg
接下来将选区向上平移先前选区的一半高度的距离(这里的选区为30x30x30,所以向上平移15格),移除帆拱的上半部分,留下的下半部分作为复合式穹顶的穹隅
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzz8ya25j311y0jmqfm.jpg
接下来,不改变选区的位置,使用半球穹顶的指令
- //g 155 -h x^2+(y+1)^2+z^2<1
复制代码
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdzzdkphyj311y0jngxh.jpg
成功生成,效果如下
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzzmc89pj311y0jj0zi.jpg
4. 扇形拱顶
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzzq167qj311s0jjwxb.jpg
前文提到的扇形拱顶,使用圆弧旋转面的组合来完成
5. 光学三棱柱
一个简单的小作品【突然有的脑洞2333
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzzul3jpj311y0jnwzu.jpg
作者: LocusAzzurro 时间: 2015-12-27 23:45
本帖最后由 LocusAzzurro 于 2020-9-8 17:28 编辑
VIII.函数的使用
在表达式中我们可以使用一系列的函数,使用的方法与日常的写法相似,即函数(<输入值>),这里我们来使用几个常见的函数作为例子了解一下它们在表达式中的应用。
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdxnvtusaj311s0jcqiv.jpg
上图使用了其中abs(x)代表的便是x的绝对值
下面这个是正弦cos(x),同时使用了 -h 来仅生成正弦的曲线(什么?你想说说好的曲线呢?有两种可能,一是你没仔细看前面的,二是你三角函数没学好www)
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdxnylwc3j311i0jd4a0.jpg
上图使用的指令是
那么为了更容易得看出曲线,我们可以对它进行一些压缩
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdxno5hi9j311y0jm4bm.jpg
这里我们使用了
这样就能明显看出正弦的曲线了。
除了提到的这两个,生成时还可以使用许多其他的函数,各位可以参考前文给出的链接中的列表来了解。
接下来,我们将会讲解生成时可以使用的另外两个标示,-r 与 -o 这两个标示的运作方式与之前提到的完全不同。
作者: LocusAzzurro 时间: 2015-12-27 23:45
本帖最后由 LocusAzzurro 于 2020-9-8 18:29 编辑
XIV. 相关资料与来源
【WE插件进阶】//GEN命令 建筑屋顶基本型公式总结
作者 sara_yiwei
http://tieba.baidu.com/p/3063854405
例子部分多个例子来源与研究基础(即只提供公式,后续分析由笔者完成)]
【WorldEdit】WE中//generate指令的研究(教程+讨论向)
作者 Az蓝色轨迹(本人)
http://tieba.baidu.com/p/2714393353
[本文大部分内容研究基础]
Wikipedia数词条
[相关专业知识来源]
作者: LocusAzzurro 时间: 2015-12-27 23:47
本帖最后由 LocusAzzurro 于 2020-9-8 18:04 编辑
XI.例子-曲面
接下来我们来了解一些这个指令的实际应用,这些应用一般与建筑有关,也会有一些其他非相关的形体。每个图形我仅会给出所用的公式与标示,前面的主命令与方块部分需要自己补全,即使用时要使用如下格式:
//g <方块ID> <下文给出部分>
1. 半球形体高度=选区高度/2如果使用了-h标示便可以生成半球穹顶。
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzft51b3j311y0jjwu0.jpg
2. 圆柱体
两个的表达式分别为形体高度=选区高度使用 -h 可以生成空心圆柱
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzc3z1ytj311y0jl4f2.jpg
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzcd6t1nj311y0jlqhx.jpg
3. 半圆拱顶
通过将上一个圆柱体向下移动一单位并使用-h得到形体高度=选区高度/2将x替换为z可以得到另一个方向的拱顶
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzckzji1j311y0jj15u.jpg
4.半圆十字拱/穹形拱顶
通过将两个方向的半圆拱顶交叉形成- -h x^2+(y+1)^2<1||z^2+(y+1)^2<1
复制代码 形体高度=选区高度/2
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzc8vdqjj311y0jmtm1.jpg
5. 抛物面
形体高度=选区高度/2将x替换为z可以生成另一方向的抛物面抛物线形的拱顶
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzh5tv4gj311y0jok3p.jpg
6. 抛物面十字拱
通过将两个方向的抛物面交叉形成形体高度=选区高度/2
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzgqm1f8j311x0jk4au.jpg
7. 等角拱
通过两个稍大平移过的圆柱体的交集形成- -h (x+1)^2+(y+1)^2<4&&(x-1)^2+(y+1)^2<4
复制代码 形体高度=选区高度/0.25+sqrt(2)/2将x替换为z可以生成另一个方向的拱顶
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzbnpseoj311y0jogzy.jpg
8. 十字尖拱/肋形拱顶
通过将两个方向的等角拱交叉形成- -h ((x+1)^2+(y+1)^2<4&&(x-1)^2+(y+1)^2<4)||((z+1)^2+(y+1)^2<4&&(z-1)^2+(y+1)^2<4)
复制代码 形体高度=选区高度/0.25+sqrt(2)/2
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzrfaxjfj311v0jntov.jpg
9. 圆锥形体高度=选区高度使用-h可以生成空心形体
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdzbsjcokj311y0jl4cz.jpg
10.旋转抛物面形体高度=选区高度
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzhktw0qj311y0kcqic.jpg
11. 抛物面帆拱
通过上一个形体的空心形体得到形体高度=选区高度帆拱为从圆形面到方形面的转换
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzho5b9qj311y0kcwui.jpg
12. 球形帆拱
通过稍大的半球穹顶的空心形体得到形体高度=选区高度
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezdzr8zwz2j311y0jlaq4.jpg
13. 双曲面A,B,C,D可以分别取值,下图使用的是形体高度=选区高度
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzfy6l4yj311y0jik7o.jpg
14. 圆弧旋转面
通过将圆弧沿Y轴旋转一周得到- (1-sqrt(x^2+z^2))^2+y^2 > A && y>0
复制代码 A 可取值来决定大小,下图使用- (1-sqrt(x^2+z^2))^2+y^2 > 0.9 && y>0
复制代码 形体高度=选区高度/2生成在选区上半部分将多个形体连续放置可以得到扇形拱顶
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezdzcg8elvj311y0k6h2c.jpg
15. 四面攒尖顶
通过4个方向的抛物面外部的交集形成,并只取下半部分- -h y^2+x>0&&y^2+z>0&&y^2-x>0&&y^2-z>0&&y<0
复制代码 形体高度=选区高度/2
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezdzru0w7aj311y0jpqg3.jpg
16. 圆形攒尖顶
圆弧旋转面的下半边- (1-sqrt(x^2+z^2))^2+y^2 > A && y<0
复制代码 A 可取值决定大小,下图使用- (1-sqrt(x^2+z^2))^2+y^2 > 0.9 && y<0
复制代码 形体高度=选区高度/2
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzrj5r59j311y0jodti.jpg
17. 葱型圆顶- -h x^2+z^2<(0.5*sin(0.75*pi*(y+1))+0.5)^2
复制代码 形体高度=选区高度
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezdzg8h9wzj311y0jjnbn.jpg
作者: LocusAzzurro 时间: 2015-12-28 01:44
本帖最后由 LocusAzzurro 于 2020-9-8 18:30 编辑
XV.后记
我认为这是一个WorldEdit一个非常有潜力,但仍未被发掘的功能,希望更多人能进行更深入的研究,使它的光芒发挥到极致。
- LocusAzzurro
作者: Skey 时间: 2015-12-28 10:33
{:10_530:}怒占沙发(伪沙发)
楼主对WE的研究真是深呐,膜拜!
作者: 孤独秋叶 时间: 2015-12-28 13:05
WorldEdit有很多用处都没被重视,很多人都只用于填地,或者弄一下几何而已
作者: MuChenyu 时间: 2015-12-28 15:26
我天= =we这么nb
作者: Wsbyeah 时间: 2015-12-28 17:40
楼主在刷精华
作者: LocusAzzurro 时间: 2015-12-29 02:28
恩,我也就弄一下几何了 {:10_518:}
作者: 黑星nova 时间: 2015-12-29 05:05
这个教程一个赛艇,想起来之前和dreamweaver俩人在一个单开的世界里各种玩//g,不亦乐乎,这个指令的潜力的确很大,就是使用门槛高了一点。顺带一提,这玩意做拱券还是挺舒服的。
作者: 哐哐哐 时间: 2015-12-29 09:48
然而我只上初一,啥都听不懂{:10_522:}
作者: andylizi 时间: 2015-12-29 16:15
。。。。。。。。
。。。。。。。。。。。。。。。。
看到标题时想,太感动了,终于有这个的中文教程了
看完后。。。
无言以对。。。
作者: LocusAzzurro 时间: 2015-12-29 21:21
无言以对是怎么讲。。 
作者: 林扬骐 时间: 2015-12-29 21:35
我以后试着用原版实现这些功能吧(金字塔已经有了想法了但是没发)
作者: andylizi 时间: 2015-12-30 09:02
意思就是逼死我小学6年级
三角函数是什么鬼
作者: j7528802 时间: 2015-12-30 12:53
虽然我是数学渣,但是能在国内出现这个指令的教程好感动啊
作者: 1027122.2 时间: 2015-12-30 20:48
大神啊{:10_552:}
作者: 你猜猜是谁 时间: 2015-12-31 14:12
楼主厉害{:10_523:}
作者: Dfeat_败类 时间: 2016-1-1 00:28
创世神教程?
作者: 117779284 时间: 2016-1-1 08:14
现在大触建筑都是各种工具。
作者: YangZhong1314 时间: 2016-1-1 18:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: 圣骑士686 时间: 2016-1-3 12:27
我好像学到了什么新的技能
作者: Exodus 时间: 2016-1-4 09:18
仔细想想艺术雕刻和数控车床好像没太大关系_(:з」∠)_
作者: Yy星人 时间: 2016-1-5 18:02
精了!我一个都没看懂
作者: yirk 时间: 2016-1-6 21:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: Noble_shuibie 时间: 2016-1-9 17:24
精华中的精华
作者: Kelcoin 时间: 2016-1-9 17:43
太可怕了!!
大神啊!!!
作者: qq1394236817 时间: 2016-1-15 22:47
怒顶蓝鸡触!!!!!!
作者: app6609 时间: 2016-1-24 20:37
那么好的帖子怎能没有回复,赞一个
作者: mc1549570730 时间: 2016-1-25 09:35
听到8000字我就来看看了 楼主幸苦了
作者: 935262316 时间: 2016-1-28 17:10
真是好教程,但是有点听不懂
作者: roseauxyw 时间: 2016-2-22 17:37
yiwei赶来支持!AZ的总结太棒了 把这个//GEN命令 细化解释成了一个体系。
一直在想,如果这些公式能预存为简单指令,对于不care逻辑过程的小伙伴们来说应用起来会超级方便的!!
左键-右键-选中一个区域-直观分类按键-HUA-生成
一种办法是写一个小插件
或者用一个工地小地图 预存命令方块来实现?
哈哈 很想和你探讨一下。
作者: LocusAzzurro 时间: 2016-2-22 18:04
本帖最后由 LocusAzzurro 于 2016-2-22 18:35 编辑
其实我想过使用WE自带脚本执行这些的可能性,目前正在和小组探讨这部分内容。
另外有没有看淡其他的研究啊www
作者: LuAria 时间: 2016-3-17 22:02
想问大大关于一开始选区的问题,怎么让它形成一个三维的坐标选区(我用//sel cuboid来选区,最后出来的都是立方体)?好多函数想出来都用不了T^T
作者: LocusAzzurro 时间: 2016-3-17 22:18
//sel cuboid 就是立方体选区啊,直接选出来输入要生成的函数就行了,一般生成选区最好选成长宽高都相等的
作者: LuAria 时间: 2016-3-17 22:31
我选了第一个点之后,在对角线(立体的)那端再选第二个点(一共有3375个块),然后输入//g 79 x^2+z^2<10,最后显示的是由3375个冰块合成的正方体?
作者: LocusAzzurro 时间: 2016-3-18 00:49
阁下一定没好好看完文章,坐标系边界是 [-1,+1], <10 肯定会整个选区填满的啊。
另外有更多问题的话建议私信联系,不然一会成版聊了。
作者: Ttttt... 时间: 2016-9-3 20:25
打错
正弦应该是sin,余弦才是cos
作者: 1962903464 时间: 2017-8-15 10:24
就是神马都看不懂
作者: 東冻Dong 时间: 2019-3-29 22:32
都是精华
作者: yuen27787231 时间: 2019-5-20 16:33
這個十分之實用 但是要利用到數學的應用我真是怕了
作者: azide 时间: 2019-6-12 23:12
了解了谢谢
作者: NEIKI 时间: 2019-9-23 10:55
第一次用。。教程很有用啊。
作者: 1214090013 时间: 2020-2-15 18:19
有worldpainter内味了
作者: 绝影寒潭 时间: 2020-2-17 15:06
好厉害的感觉,但是我还是不懂。。太笨了
作者: 晓夜Port 时间: 2020-2-21 18:34
没想到蓝鸡15年就开始做WE指令了
作者: 菜菜没有名字 时间: 2020-11-5 23:54
写的也太详细了,真是有被感动到QAQ