Minecraft(我的世界)中文论坛
标题: [WorldEdit]//deform 指令研究 - 随意控制你的百变选区!
作者: LocusAzzurro 时间: 2016-1-22 20:56
I.指令简介
//deform 为 WorldEdit中的一个指令,作用是根据用户给出的表达式对选区进行变换。 这个功能是WorldEdit的强大功能之一,可以按照用户的需求对选区进行转换,可以达到旋转,拉伸,移动选区内容的效果。
在本文中我将向各位分享这个指令的使用方式,需要注意的地方,以及一些实例,也希望各位共同发现它更多的潜能。
在正式开始之前,我们先来看一个例子了解它的能力:
上面的形体通过一个命令即可转换为:
当然,这样看起来并不能很好的理解它是如何运作的,那么让我来一一了解它的功能,首先,我们通过上图使用的指令来了解指令的构成。
作者: LocusAzzurro 时间: 2016-1-22 20:57
标题: [WorldEdit]//deform 指令研究 - 随意控制你的百变选区!
本帖最后由 LocusAzzurro 于 2016-1-22 14:54 编辑

使用表达式来控制你的百变选区!
大家好,这里Az,最近完成了对WorldEdit中//deform 指令的研究,在这里与大家分享一下获得的成果,发掘这个功能更多的潜能。
目录
阅读提示:你可能需要如下知识来理解本文并了解它的使用方式
- WorldEdit 基础操作
- 三维直角坐标系
- 基础代数
- 几何变换
WorldEdit是一个常用的地图编辑工具,玩家可以利用它进行许多建筑中的操作,加快施工速度,同时也提供了许多便捷的功能。
[groupid=1151]Minecraft插件百科[/groupid]
作者: LocusAzzurro 时间: 2016-1-22 20:58
II.指令结构与使用方式
上图使用的指令是:
这其中:
//deform 为主指令
x+=sin(2*y) 为使用的几何变换表达式
这里使用的表达式的写法与日常的有些不同,我们来看一下表达式需要注意的地方:
- 表达式的写法与Java相似:
- 加减乘除分别为+ - * /;
- 次方为 ^ ,这个符号在这里不表示逻辑异或门;
- 使用多重括号时仅能使用圆括号;
- 在表达式中可以使用 && 来代表逻辑与门,用||来代表逻辑或门,! 比较特殊,加在一段表达式前代表逻辑非门,加在表达式或数字之后代表数学阶乘,但在这个指令的使用中不是非常重要;
- 比较使用的是 < > (大于与小于),<=(小于等于),>=(大于等于),==(等于),!=(不等于);
- 如果需要同时输入多个表达式(如一个x轴上的变换和一个y轴上的变换),两个表达式之间可以用分号隔开;
- 表达式写法支持Java风格的运算+赋值,如y+=1等同于y=y+1;
- 一般的函数是可以在表达式中使用的,如abs()绝对值,cos()正弦,sqrt()平方根等,完整的列表可以查看
(在下文的函数部分会有介绍与例子)
需要注意的地方有:
- 与日常书写表达式不同,3x,5y等需要用乘号链接,即3*x, 5*y;
综上所述,这个指令的格式为
- //generate <ID> [-r/-o] <表达式>
复制代码
-r, -o 为这个指令可以使用的标示。
使用这个指令的时候需要选择一个选区,指令会对选区按要求进行变形,注意选区的形状会影响到输出的结果,有时这个特性会造成一些麻烦,但有时可以使用这个来达到希望的效果,这一点我们接下来会讲到。
同时,就像刚才提到的,在使用这个指令时,我们可以使用一个或几个标示来改变指令的效果,来达到需要的结果。
作者: LocusAzzurro 时间: 2016-1-22 21:00
III.可用标示
在使用指令时,我们可以添加一个或多个标示来改变指令的运行方式,添加标示的方法很简单,只需要将标示像添加参数一样的方式添加至指令中即可。
如:
可用的标示有两个,分别是-r与-o。
-r 会使变换时使用源坐标
-o 会使变换时使用源坐标,同时将坐标系原点移动到玩家位置(或者玩家的第一选择点,如果使用了/toggleplace)
-r 与 -o 的效果冲突,因此-o的效果会覆盖掉-r的效果,推荐不要同时使用。
这里仅仅给出一个标示的基本介绍,在本文之后的章节中会一一介绍它们的效果,接下来我们首先来集中看一下不使用任何标示的情况。
作者: LocusAzzurro 时间: 2016-1-22 21:02
IV.坐标范围
在不使用任何标示的情况下,WorldEdit会将当前的选区看做一个三维直角坐标系,坐标系原点为选区中心。
如图,我用羊毛标出了三条坐标轴,WorldEdit使用的坐标轴系统与Minecraft的相同,即从西(负)到东(正)为X轴(红),从下到上为Y轴(黄),从北到南为Z轴(蓝)。
这个坐标系三条轴的界限为 -1 与 +1 ,也可以说生成的范围为 [-1;+1] ,注意这个界限仅在不使用标示存在,-r 与 -o 的运行方式完全不同,我们在下文会分别看到他们的生成方式。
上图使用金块和红石块标注的位置按前文所说应分别为为 (0;0.5;5)即Y值为0.5 ,与(0.5;0;0),即X值为0.5。
有人可能注意到到目前位置的操作使用的选区都是正方体,那么如果不是呢?这样的话坐标系就会被拉伸,几何变换的结果也会随之被拉伸,这还是因为选区的范围为从-1到+1造成的。
如上图,选区Y轴的长度为X轴与Z轴的两倍,金块标注的点(0;0.5;0)也会变化,虽然它在坐标系内的位置仍是相同的。
在接下来的一章我们将会看到长方体选区对几何变换的影响。
作者: LocusAzzurro 时间: 2016-1-22 21:09
V.变换方程-加减(移动)
接下来我们将会看到各种变换方程的效果,几何变换主要有三种,即移动,拉伸与旋转,首先我们来看一下相对简单的移动,同时观察一下长方体选区对变换的影响。
首先我们来看一个简单的移动,下图中我们有一个位于y=0位置的平面
我们希望将它向上移动0.5单位,我们需要使用的指令是:
注意这里使用的是 - ,这是几何变换表达式的特性,因为我们改变的是变量本身,需要使用相反的运算符来达到效果。
移动后的效果如上图。
它的运作方式是带入每个方块位置的坐标数值,将其按表达式进行变动,并将方块移动到计算出的坐标的新位置,接下来我们通过移动一个单个方块来更直观地来看看这一点:
首先,我们的方块所在位置为选区中心,即坐标系原点 (0;0;0)
首先使用指令:
将它向正X方向移动0.5单位,从下图可以看到方块成功被移动了。
接下来我们将它向上移动0.5单位,使用的指令是:
最后,我们来看一下更复杂点的物体的移动,一个球体,同时来看一下多个表达式的同时使用。
首先,下图为球体开始时的位置:
这里我们使用指令:
- //deform x=x+0.3; y=y+0.3
复制代码
将球体同时在两轴移动,可以看到指令中使用了分号来分隔两段表达式,下图为移动后球体的位置:
作者: LocusAzzurro 时间: 2016-1-22 21:18
VII.函数的使用
如同上文提到的,我们可以在我们的表达式中使用函数,我们来看一个简单的例子:
如上图,y=0 平面,我们需要使这个平面变为正弦波型的曲面,为达到这个效果,我们可以使用cos() 正弦函数,使用的命令为:
作用为在Y轴上加上正弦波的形状,结果如下:
我们可以注意到曲面上有许多空位,这是因为WorldEdit计算时是计算并移动每个方块的,如同上文提到的。
除了正常的数学函数,WorldEdit还提供了两个特殊的函数,让我们可以简单地进行对角翻转与旋转,让我们来看一下。
作者: LocusAzzurro 时间: 2016-1-22 21:18
VI.变换方程-乘除(缩放)
看完了加减,接下来我们来看看乘除,他们对应的是几何变换中的缩放,即通过带有乘除的表达式我们可以达到拉伸与压缩形体的效果。
首先我们来看一下拉伸:
下图我们的选区中有一个黑红相间的立方体,我们需要将它在X轴上进行拉伸,成为一个长方体。
为了达到这个效果,我们使用指令:
即将它在X轴上拉伸2倍,注意这里和之前的加减法异曲同工,拉伸使用的是除法,压缩使用的是乘法,拉伸后的效果如下:
接着我们来看看压缩:
我们需要将下图的长方体的高度压缩到一半。
我们使用的指令是:
这样就可以将它压缩为1/2,效果如下图:
这样我们就可以对物体进行缩放,我们也可以使用多个表达式来在多轴上同时进行缩放,如果我们在三轴上同时按同比例缩放,我们就可以达到按比例放大和缩小的效果,我们来看下面的例子:
我们需要将上图的形状放大3倍,我们可以使用:
- //deform x/=3; y/=3; z/=3
复制代码
可以看到同时使用了三个表达式,同时使用的是Java风格运算+赋值的方式。
转换的结果如下图:
接下来我们来看一下几何变换中函数的使用。
作者: LocusAzzurro 时间: 2016-1-22 21:27
VIII.特殊函数-旋转与翻转
WorldEdit提供了两个特殊的函数,swap(x,y) 与 rotate(x,y,a) ,二者的作用分别为交换两个变量的值,与在一个平面上旋转选区,让我们通过例子来了解:
首先是 swap(x,y)
它可以交换选区内所有点的两个指定坐标,即可以交换X与Y,X与Z,或Y与Z,这样可以达到分别相对于x=y, x=z, y=z 三个斜面进行面对称转换的效果,在使用时写出要交换的两个坐标即可。
下图中有一个红色羊毛球
我们尝试使用指令:
交换x与z,效果如下
可以看到球移动到了另一边,我们实际完成是一个相对于平面x=z的对称转换,下图可以看到平面的大概位置,使用玻璃标注出:
接着我们来看一下旋转,使用的函数为rotate(x,y, a)
x与y分别为两个坐标轴方向,可以为x,y,z,共同确定了选区旋转的基准面,也就是方向,a为需要旋转的角,注意它的单位并非角度,而是弧度,也就是说需要使用pi/2(90度) ,pi/6(30度) (pi代表π,在WorldEdit中取值3.14159265358979323846)等作为值,并且值的正负代表了旋转方向,让我们通过在三个方向的旋转来了解它的运作方式:
首先这是我们的球体的起始状态,同时这里开启了F3模式来更清楚地了解旋转方向(红线指向方向为正X,蓝线正Z,绿线正Y),注意下面的三个旋转都是以下图的状态为基准的。
首先是XY平面的旋转,使用的指令为:
- //deform rotate(x,y,pi/4)
复制代码
即顺时针45度,效果如下:
接下来是XZ面,逆时针45度,指令为
- //deform rotate(x,z,pi/4)
复制代码
效果如下:
最后是YZ面,同样45度,指令:
- //deform rotate(y,z,pi/4)
复制代码
结果如下:
作者: LocusAzzurro 时间: 2016-1-22 21:30
IX.源坐标的使用
看完了所有正常模式的转换,现在我们来关注一下 -r 标示,它的作用是使生成时使用源坐标,简单来说,就是将整个地图视作一个巨大的立体直角坐标系,虽然转换的范围依旧会被限制在选区中,但使用指令时可以带入实际的坐标进行(即F3画面上的XYZ坐标)运算。
这样说起来可能不好理解,让我们来看一个简单例子吧:
如上图,我们的目标是将物体向上移动5格距离(实际的5格),我们可以使用源坐标模式来达到效果,使用指令:
它的效果是使选区向上移动5单位,但由于使用了-r标示,1单位即为1格,所以为向上移动5格。
输入指令效果如下,球体向上移动了5格:
作者: LocusAzzurro 时间: 2016-1-22 21:35
X.移动后源坐标的使用
最后,我们来看一下-o 标示,移动过的源坐标,它与之前的-r 标示十分相似,也是使用实际地图坐标长度来进行运算,但二者的区别是-r 完完全全使用的是真实的方块坐标,但-o 模式会将玩家使用命令时所在的位置(或者玩家的第一个选择点,如果使用了/toggleplace),作为三维直角坐标系的原点。
和刚才一样,我们来看一个例子:
上图我们处于一个空心球体里,我们希望以所在位置为中心来拉伸空间,这样球体会在我们周围被拉伸。
我们使用的指令是:
效果为在Y轴上进行两倍的拉伸,使用真实坐标(虽然拉伸的效果与不使用标示相同),并将玩家位置作为原点,输入后效果如下:
可以看到球体在Y轴被拉伸了2倍
作者: LocusAzzurro 时间: 2016-1-22 21:37
XI.使用例子
最后我们来看一下两个简单的使用例子:
首先是一个圆柱体的旋转,我们需要将它逆时针在XY面旋转30度
我们需要使用的指令就是:
- //deform rotate(x,y,pi/6)
复制代码
效果如下图:
最后是一个物体的放大,是推荐使用来放大物体的方法:
首先下图是需要放大的物体,首先我们需要选择整个物体,建议只选取最小的可以包含整个物体的选区,推荐使用//sel extend 模式进行选择。
如下图,我们选择了整个物体
接下来我们使用//outset 来扩大选区,这样的好处的是可以简单扩大选区并使物体位于扩大后的选区中心,可以更好地控制扩大后物体的位置。如下图为扩大后的选区。
最后使用指令来拉伸物体即可:
结果如下图:
作者: LocusAzzurro 时间: 2016-1-22 21:40
XIII.后记
这又是令一个WorldEdit未被开发的新大陆,希望更多人能进行更深入的研究,成为这方面的领航者。
作者: LocusAzzurro 时间: 2016-1-22 21:42
XII.相关资料与来源
【WorldEdit】【教程直播】创世神的64把木斧
作者 Az蓝色轨迹(本人)
[//deform初步研究结果]
【WorldEdit】//generate 指令研究
作者 Az蓝色轨迹(本人)
[部分理论基础]
作者: WaterPast 时间: 2016-1-22 23:53
那个弯折的效果蛮有趣的⊙▽⊙
待会去服务器试试
作者: qq1933168588 时间: 2016-1-23 02:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: ESCesc 时间: 2016-1-23 14:13
很好的教程,看来楼主花费了很大心思吧?
作者: 格林 时间: 2016-1-24 10:04
学习了,先去试试。
作者: Look_Up仰望 时间: 2016-1-24 12:22
好像很厉害的样子0.0,瞬间涨姿势。
作者: Poison★殺神 时间: 2016-1-24 19:54
很好的教程,看来楼主花费了很大心思吧?
楼主辛苦了!
作者: gdahs 时间: 2016-1-25 14:34
收藏下来慢慢看
作者: -流动水- 时间: 2016-1-25 21:00
感觉每次AZ发的WE指令研究都好高能,虽然认真看看得懂,但是头都晕了。。
作者: 15253540 时间: 2016-1-26 04:21
WE再次给大神制造了新脑洞
作者: .:|玖小黧? 时间: 2016-1-26 09:09
这么厉害,顶上去报复渣渣=A=
作者: wsh183586217 时间: 2016-1-26 10:34
学到了 待会儿去服务器试试
作者: 1150445873 时间: 2016-1-26 12:17
好高深啊,半天没看完。
作者: 935262316 时间: 2016-1-26 12:31
功能很强大,不过我不是很会用
作者: REN0011 时间: 2016-1-28 06:37
厉害啊,在下佩服
作者: lie-yanwind 时间: 2016-1-28 16:54
神一样的存在
作者: hahahaadouawgds 时间: 2016-1-29 11:18
妈妈,我看不懂
看得懂的必须是大学生啊
作者: E100撞老鼠 时间: 2016-1-29 12:10
高中就可以了
作者: JNX 时间: 2016-2-3 13:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: カラスくん 时间: 2016-2-3 18:44
好东西,前来学习
作者: 815965853 时间: 2016-2-4 13:00
不错 挺好用的 一会去服务器试试去
作者: 懒虫哥 时间: 2016-2-6 11:53
WE对我来说还是太复杂了
作者: AIox 时间: 2016-2-6 15:48
膜拜大神
作者: asjwdwan521 时间: 2016-2-7 00:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: maxjkwang 时间: 2016-2-12 11:05
表示仍然看不懂233
作者: cs158 时间: 2016-2-13 21:04
太强大
作者: Digital 时间: 2016-2-15 15:06
我就用简单的指令就好了,实在不行就{:10_527:}
作者: a18964819868 时间: 2016-2-15 19:42
WE的最近几次升级使WE的功能大大提升,效率也高了N倍,LZ辛苦钻研了,加油~~~
作者: 懒虫哥 时间: 2016-2-17 09:02
感觉WE的作用还是太深奥了
作者: 枫林1 时间: 2018-7-19 14:41
支持下LZ,毕竟做这个教程帖子也不是很容易
作者: 東冻Dong 时间: 2019-3-29 22:33
好详细 就是enn不说了
作者: [email protected] 时间: 2019-10-21 13:16
WorldEdit Wiki http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax#Functions 这个网站看不了了还有没有其他的地方可以知道