Minecraft(我的世界)中文论坛

标题: [WorldEdit]//deform 指令研究 - 随意控制你的百变选区!

作者: LocusAzzurro    时间: 2016-1-22 20:56
I.指令简介

//deformWorldEdit中的一个指令,作用是根据用户给出的表达式对选区进行变换。 这个功能是WorldEdit的强大功能之一,可以按照用户的需求对选区进行转换,可以达到旋转,拉伸,移动选区内容的效果。
在本文中我将向各位分享这个指令的使用方式,需要注意的地方,以及一些实例,也希望各位共同发现它更多的潜能。
在正式开始之前,我们先来看一个例子了解它的能力:



上面的形体通过一个命令即可转换为:



当然,这样看起来并不能很好的理解它是如何运作的,那么让我来一一了解它的功能,首先,我们通过上图使用的指令来了解指令的构成。


作者: LocusAzzurro    时间: 2016-1-22 20:57
标题: [WorldEdit]//deform 指令研究 - 随意控制你的百变选区!
本帖最后由 LocusAzzurro 于 2016-1-22 14:54 编辑



使用表达式来控制你的百变选区!

大家好,这里Az,最近完成了对WorldEdit中//deform 指令的研究,在这里与大家分享一下获得的成果,发掘这个功能更多的潜能。


目录

I.指令简介        
II.指令结构与使用方式        
III.可用标示        
IV.坐标范围        
V.变换方程-加减(移动)        
VI.变换方程-乘除(缩放)        
VII.函数的使用        
VIII.特殊函数-旋转与翻转        
IX.源坐标的使用        
X.移动后源坐标的使用        
XI.使用例子        
XII.相关资料与来源        
XIII.后记


阅读提示:你可能需要如下知识来理解本文并了解它的使用方式


注意本文内容虽然与//generate指令研究同源,但二者为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是一个常用的地图编辑工具,玩家可以利用它进行许多建筑中的操作,加快施工速度,同时也提供了许多便捷的功能。







[groupid=1151]Minecraft插件百科[/groupid]
作者: LocusAzzurro    时间: 2016-1-22 20:58
II.指令结构与使用方式
上图使用的指令是:

  1. //deform x+=sin(2*y)
复制代码

这其中:
//deform 为主指令
x+=sin(2*y) 为使用的几何变换表达式


这里使用的表达式的写法与日常的有些不同,我们来看一下表达式需要注意的地方:

WorldEdit Wiki http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax#Functions
(在下文的函数部分会有介绍与例子)
需要注意的地方有:


综上所述,这个指令的格式为

  1. //generate <ID> [-r/-o] <表达式>
复制代码


-r, -o 为这个指令可以使用的标示。


使用这个指令的时候需要选择一个选区,指令会对选区按要求进行变形,注意选区的形状会影响到输出的结果,有时这个特性会造成一些麻烦,但有时可以使用这个来达到希望的效果,这一点我们接下来会讲到。

同时,就像刚才提到的,在使用这个指令时,我们可以使用一个或几个标示来改变指令的效果,来达到需要的结果。



作者: LocusAzzurro    时间: 2016-1-22 21:00
III.可用标示

在使用指令时,我们可以添加一个或多个标示来改变指令的运行方式,添加标示的方法很简单,只需要将标示像添加参数一样的方式添加至指令中即可。
如:
  1. //deform -r y+=1
复制代码
可用的标示有两个,分别是-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单位,我们需要使用的指令是:
  1. //deform y=y-0.5
复制代码
注意这里使用的是 - ,这是几何变换表达式的特性,因为我们改变的是变量本身,需要使用相反的运算符来达到效果。



移动后的效果如上图。
它的运作方式是带入每个方块位置的坐标数值,将其按表达式进行变动,并将方块移动到计算出的坐标的新位置,接下来我们通过移动一个单个方块来更直观地来看看这一点:
首先,我们的方块所在位置为选区中心,即坐标系原点 (0;0;0)



首先使用指令:
  1. //deform x=x-0.5
复制代码
将它向正X方向移动0.5单位,从下图可以看到方块成功被移动了。



接下来我们将它向上移动0.5单位,使用的指令是:
  1. //deform y=y-0.5
复制代码



最后,我们来看一下更复杂点的物体的移动,一个球体,同时来看一下多个表达式的同时使用
首先,下图为球体开始时的位置:



这里我们使用指令:
  1. //deform x=x+0.3; y=y+0.3
复制代码
将球体同时在两轴移动,可以看到指令中使用了分号来分隔两段表达式,下图为移动后球体的位置:






作者: LocusAzzurro    时间: 2016-1-22 21:18
VII.函数的使用

如同上文提到的,我们可以在我们的表达式中使用函数,我们来看一个简单的例子:



如上图,y=0 平面,我们需要使这个平面变为正弦波型的曲面,为达到这个效果,我们可以使用cos() 正弦函数,使用的命令为:
  1. //deform y+=sin(4*x)/2
复制代码

作用为在Y轴上加上正弦波的形状,结果如下:



我们可以注意到曲面上有许多空位,这是因为WorldEdit计算时是计算并移动每个方块的,如同上文提到的。
除了正常的数学函数,WorldEdit还提供了两个特殊的函数,让我们可以简单地进行对角翻转与旋转,让我们来看一下。



作者: LocusAzzurro    时间: 2016-1-22 21:18
VI.变换方程-乘除(缩放)

看完了加减,接下来我们来看看乘除,他们对应的是几何变换中的缩放,即通过带有乘除的表达式我们可以达到拉伸与压缩形体的效果。
首先我们来看一下拉伸:
下图我们的选区中有一个黑红相间的立方体,我们需要将它在X轴上进行拉伸,成为一个长方体。



为了达到这个效果,我们使用指令:
  1. //deform x=x/2
复制代码
即将它在X轴上拉伸2倍,注意这里和之前的加减法异曲同工,拉伸使用的是除法,压缩使用的是乘法,拉伸后的效果如下:



接着我们来看看压缩:
我们需要将下图的长方体的高度压缩到一半。



我们使用的指令是:
  1. //deform y=y*2
复制代码
这样就可以将它压缩为1/2,效果如下图:



这样我们就可以对物体进行缩放,我们也可以使用多个表达式来在多轴上同时进行缩放,如果我们在三轴上同时按同比例缩放,我们就可以达到按比例放大和缩小的效果,我们来看下面的例子:



我们需要将上图的形状放大3倍,我们可以使用:
  1. //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与YXZ,或YZ,这样可以达到分别相对于x=y, x=z, y=z 三个斜面进行面对称转换的效果,在使用时写出要交换的两个坐标即可。
下图中有一个红色羊毛球



我们尝试使用指令:
  1. //deform swap(x,z)
复制代码
交换xz,效果如下



可以看到球移动到了另一边,我们实际完成是一个相对于平面x=z的对称转换,下图可以看到平面的大概位置,使用玻璃标注出:



接着我们来看一下旋转,使用的函数为rotate(x,y, a)
xy分别为两个坐标轴方向,可以为xyz,共同确定了选区旋转的基准面,也就是方向a为需要旋转的角,注意它的单位并非度,而是度,也就是说需要使用pi/2(90度) ,pi/6(30) (pi代表π,在WorldEdit中取值3.14159265358979323846)等作为值,并且值的正负代表了旋转方向,让我们通过在三个方向的旋转来了解它的运作方式:
首先这是我们的球体的起始状态,同时这里开启了F3模式来更清楚地了解旋转方向(红线指向方向为正X,蓝线正Z,绿线正Y),注意下面的三个旋转都是以下图的状态为基准的。



首先是XY平面的旋转,使用的指令为:
  1. //deform rotate(x,y,pi/4)
复制代码

即顺时针45度,效果如下:



接下来是XZ面,逆时针45度,指令为
  1. //deform rotate(x,z,pi/4)
复制代码

效果如下:



最后是YZ面,同样45度,指令:
  1. //deform rotate(y,z,pi/4)
复制代码

结果如下:






作者: LocusAzzurro    时间: 2016-1-22 21:30
IX.源坐标的使用

看完了所有正常模式的转换,现在我们来关注一下 -r 标示,它的作用是使生成时使用源坐标,简单来说,就是将整个地图视作一个巨大的立体直角坐标系,虽然转换的范围依旧会被限制在选区中,但使用指令时可以带入实际的坐标进行(即F3画面上的XYZ坐标)运算。
这样说起来可能不好理解,让我们来看一个简单例子吧:



如上图,我们的目标是将物体向上移动5格距离(实际的5格),我们可以使用源坐标模式来达到效果,使用指令:
  1. //deform -r y-=5
复制代码
它的效果是使选区向上移动5单位,但由于使用了-r标示,1单位即为1格,所以为向上移动5格。
输入指令效果如下,球体向上移动了5格:



作者: LocusAzzurro    时间: 2016-1-22 21:35
X.移动后源坐标的使用

最后,我们来看一下-o 标示,移动过的源坐标,它与之前的-r 标示十分相似,也是使用实际地图坐标长度来进行运算,但二者的区别是-r 完完全全使用的是真实的方块坐标,但-o 模式会将玩家使用命令时所在的位置(或者玩家的第一个选择点,如果使用了/toggleplace),作为三维直角坐标系的原点。
和刚才一样,我们来看一个例子:



上图我们处于一个空心球体里,我们希望以所在位置为中心来拉伸空间,这样球体会在我们周围被拉伸。
我们使用的指令是:
  1. //deform -o y=y/2
复制代码
效果为在Y轴上进行两倍的拉伸,使用真实坐标(虽然拉伸的效果与不使用标示相同),并将玩家位置作为原点,输入后效果如下:



可以看到球体在Y轴被拉伸了2




作者: LocusAzzurro    时间: 2016-1-22 21:37
XI.使用例子
最后我们来看一下两个简单的使用例子:
首先是一个圆柱体的旋转,我们需要将它逆时针在XY面旋转30



我们需要使用的指令就是:
  1. //deform rotate(x,y,pi/6)
复制代码
效果如下图:



最后是一个物体的放大,是推荐使用来放大物体的方法:
首先下图是需要放大的物体,首先我们需要选择整个物体,建议只选取最小的可以包含整个物体的选区,推荐使用//sel extend 模式进行选择。



如下图,我们选择了整个物体



接下来我们使用//outset 来扩大选区,这样的好处的是可以简单扩大选区并使物体位于扩大后的选区中心,可以更好地控制扩大后物体的位置。如下图为扩大后的选区。



最后使用指令来拉伸物体即可:
  1. //deform x/=2;y/=2;z/=2
复制代码

结果如下图:




作者: LocusAzzurro    时间: 2016-1-22 21:40
XIII.后记

这又是令一个WorldEdit未被开发的新大陆,希望更多人能进行更深入的研究,成为这方面的领航者。


作者: LocusAzzurro    时间: 2016-1-22 21:42
XII.相关资料与来源

WorldEdit】【教程直播】创世神的64把木斧
作者 Az蓝色轨迹(本人)
http://tieba.baidu.com/p/3896008092
[//deform初步研究结果]
WorldEdit//generate 指令研究
作者 Az蓝色轨迹(本人)
http://tieba.baidu.com/p/4235806549
[部分理论基础]


作者: 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
LocusAzzurro 发表于 2016-1-22 21:09
V.变换方程-加减(移动)

接下来我们将会看到各种变换方程的效果,几何变换主要有三种,即移动,拉伸与旋转 ...

妈妈,我看不懂
看得懂的必须是大学生啊
作者: E100撞老鼠    时间: 2016-1-29 12:10
hahahaadouawgds 发表于 2016-1-29 11:18
妈妈,我看不懂
看得懂的必须是大学生啊

高中就可以了
作者: 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    这个网站看不了了还有没有其他的地方可以知道