LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 17:11 编辑

http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezzswgfzlnj30m80go0vo.jpg


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

大家好,这里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是一个常用的地图编辑工具,玩家可以利用它进行许多建筑中的操作,加快施工速度,同时也提供了许多便捷的功能。





2021/06/13 18:10 GMT+1 图片重修复与纯文本流线化完成

来自群组: Minecraft插件百科

LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 15:39 编辑

I.指令简介

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


上面的形体通过一个命令即可转换为:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezzsgp68saj311y0jlgwe.jpg


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

LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:08 编辑

II.指令结构与使用方式

上图使用的指令是:
  1. //deform x+=sin(2*y)
复制代码

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

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

需要注意的地方有:

LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:10 编辑

III.可用标示

在使用指令时,我们可以添加一个或多个标示来改变指令的运行方式,添加标示的方法很简单,只需要将标示像添加参数一样的方式添加至指令中即可。如:
  1. //deform -r y+=1
复制代码

可用的标示有两个,分别是-r与-o-r 会使变换时使用源坐标-o 会使变换时使用源坐标,同时将坐标系原点移动到玩家位置(或者玩家的第一选择点,如果使用了/toggleplace)
-r 与 -o 的效果冲突,因此-o的效果会覆盖掉-r的效果,推荐不要同时使用。
这里仅仅给出一个标示的基本介绍,在本文之后的章节中会一一介绍它们的效果,接下来我们首先来集中看一下不使用任何标示的情况。

LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:13 编辑

IV.坐标范围

在不使用任何标示的情况下,WorldEdit会将当前的选区看做一个三维直角坐标系坐标系原点为选区中心
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsgrz4kzj311y0jl7g7.jpg


如图,我用羊毛标出了三条坐标轴,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造成的。
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezzsgwcvjzj311y0jlqe4.jpg


如上图,选区Y轴的长度为X轴与Z轴的两倍,金块标注的点(0;0.5;0)也会变化,虽然它在坐标系内的位置仍是相同的。在接下来的一章我们将会看到长方体选区对几何变换的影响。


LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:25 编辑

V.变换方程-加减(移动)

接下来我们将会看到各种变换方程的效果,几何变换主要有三种,即移动,拉伸与旋转,首先我们来看一下相对简单的移动,同时观察一下长方体选区对变换的影响。
首先我们来看一个简单的移动,下图中我们有一个位于y=0位置的平面
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsifnrizj311y0jlwmq.jpg


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

注意这里使用的是 - ,这是几何变换表达式的特性,因为我们改变的是变量本身,需要使用相反的运算符来达到效果。
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezzsiknickj311y0jnai7.jpg


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


首先使用指令:
  1. //deform x=x-0.5
复制代码

将它向正X方向移动0.5单位,从下图可以看到方块成功被移动了。
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezzsi5xl5oj311y0jnn6t.jpg


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

http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsi8hzd2j311y0jkgvc.jpg


最后,我们来看一下更复杂点的物体的移动,一个球体,同时来看一下多个表达式的同时使用
首先,下图为球体开始时的位置:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsidfqcpj311y0jj110.jpg


这里我们使用指令:
  1. //deform x=x+0.3; y=y+0.3
复制代码

将球体同时在两轴移动,可以看到指令中使用了分号来分隔两段表达式,下图为移动后球体的位置:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsiavdv0j311y0jl46t.jpg




LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:31 编辑

VI.变换方程-乘除(缩放)

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


为了达到这个效果,我们使用指令:
  1. //deform x=x/2
复制代码

即将它在X轴上拉伸2倍,注意这里和之前的加减法异曲同工,拉伸使用的是除法,压缩使用的是乘法,拉伸后的效果如下:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezzsjtrd3xj311y0jl49t.jpg


接着我们来看看压缩:
我们需要将下图的长方体的高度压缩到一半。
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsk1adytj311y0jkn6q.jpg


我们使用的指令是:
  1. //deform y=y*2
复制代码

这样就可以将它压缩为1/2,效果如下图:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezzsjywt14j311y0jiwo0.jpg


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


我们需要将上图的形状放大3倍,我们可以使用:
  1. //deform x/=3; y/=3; z/=3
复制代码

可以看到同时使用了三个表达式,同时使用的是Java风格运算+赋值的方式。转换的结果如下图:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezzsk5ofnxj311y0jltkz.jpg


接下来我们来看一下几何变换中函数的使用。

LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:34 编辑

VII.函数的使用

如同上文提到的,我们可以在我们的表达式中使用函数,我们来看一个简单的例子:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezzslsxalsj311y0jn10k.jpg


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

作用为在Y轴上加上正弦波的形状,结果如下:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzslp6jp4j311y0jm474.jpg


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

LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:43 编辑

VIII.特殊函数旋转与翻转

WorldEdit提供了两个特殊的函数,swap(x,y)rotate(x,y,a),二者的作用分别为交换两个变量的值,与在一个平面上旋转选区,让我们通过例子来了解:

首先是 swap(x,y)它可以交换选区内所有点的两个指定坐标,即可以交换X与Y,X与Z,或Y与Z,这样可以达到分别相对于x=y, x=z, y=z 三个斜面进行面对称转换的效果,在使用时写出要交换的两个坐标即可。
下图中有一个红色羊毛球
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsmfmjh2j311y0jlgwx.jpg


我们尝试使用指令:
  1. //deform swap(x,z)
复制代码

交换x与z,效果如下
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezzsmcovqoj311y0jogx5.jpg


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


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


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

即顺时针45度,效果如下:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezzsm2q037j311y0jnal8.jpg


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

效果如下:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezzsm57qlmj311y0jjwpj.jpg


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

结果如下:
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsm7n2qtj311y0jkgws.jpg




LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:47 编辑

IX.源坐标的使用

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


如上图,我们的目标是将物体向上移动5格距离(实际的5格),我们可以使用源坐标模式来达到效果,使用指令:
  1. //deform -r y-=5
复制代码

它的效果是使选区向上移动5单位,但由于使用了-r标示,1单位即为1格,所以为向上移动5格。输入指令效果如下,球体向上移动了5格:
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezzso8qphjj311y0jlwp8.jpg


LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:50 编辑

X.移动后源坐标的使用

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


上图我们处于一个空心球体里,我们希望以所在位置为中心来拉伸空间,这样球体会在我们周围被拉伸。
我们使用的指令是:
  1. //deform -o y=y/2
复制代码

效果为在Y轴上进行两倍的拉伸,使用真实坐标(虽然拉伸的效果与不使用标示相同),并将玩家位置作为原点,输入后效果如下:
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezzsogxnsqj311y0jkqi7.jpg


可以看到球体在Y轴被拉伸了2倍
http://ww4.sinaimg.cn/mw690/0062Lzp6gw1ezzsoefaalj311y0jjk12.jpg


LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:55 编辑

XI.使用例子

最后我们来看一下两个简单的使用例子:
首先是一个圆柱体的旋转,我们需要将它逆时针在XY面旋转30度
http://ww3.sinaimg.cn/mw690/0062Lzp6gw1ezzsp5nrl6j311y0jktj6.jpg


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

效果如下图:
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezzsp89vdrj311y0jm13f.jpg


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


如下图,我们选择了整个物体
http://ww1.sinaimg.cn/mw690/0062Lzp6gw1ezzspghpjwj311o0jaajq.jpg


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


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

结果如下图:
http://ww2.sinaimg.cn/mw690/0062Lzp6gw1ezzspliywbj311y0jnk4r.jpg


LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:58 编辑

XII.相关资料与来源

【WorldEdit】【教程直播】创世神的64把木斧
作者 Az蓝色轨迹(本文作者)
http://tieba.baidu.com/p/3896008092
[//deform初步研究结果]

【WorldEdit】//generate 指令研究
作者 Az蓝色轨迹(本文作者)
http://tieba.baidu.com/p/4235806549
[部分理论基础]

LocusAzzurro
本帖最后由 LocusAzzurro 于 2021-6-13 16:59 编辑

XIII.后记

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

WaterPast
那个弯折的效果蛮有趣的⊙▽⊙

待会去服务器试试

qq1933168588
WaterPast 发表于 2016-1-22 23:53
那个弯折的效果蛮有趣的⊙▽⊙

待会去服务器试试

额额额额

ESCesc
很好的教程,看来楼主花费了很大心思吧?


格林
学习了,先去试试。

Look_Up仰望
好像很厉害的样子0.0,瞬间涨姿势。

Fracture_Moon

很好的教程,看来楼主花费了很大心思吧?
楼主辛苦了!

gdahs
收藏下来慢慢看

-流动水-
感觉每次AZ发的WE指令研究都好高能,虽然认真看看得懂,但是头都晕了。。

15253540
WE再次给大神制造了新脑洞

.:|玖小黧?
这么厉害,顶上去报复渣渣=A=

wsh183586217
学到了 待会儿去服务器试试

1150445873
好高深啊,半天没看完。

935262316
功能很强大,不过我不是很会用

REN0011
厉害啊,在下佩服

lie-yanwind
神一样的存在

hahahaadouawgds
LocusAzzurro 发表于 2016-1-22 21:09
V.变换方程-加减(移动)

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

妈妈,我看不懂
看得懂的必须是大学生啊

狸旻
hahahaadouawgds 发表于 2016-1-29 11:18
妈妈,我看不懂
看得懂的必须是大学生啊

高中就可以了

JNX
LZ太牛逼了!!!

カラスくん
好东西,前来学习

815965853
不错 挺好用的 一会去服务器试试去

虫儿.
WE对我来说还是太复杂了

AIox
膜拜大神

asjwdwan521
楼主,这个好牛!!!!收藏进包了。

maxjkwang
表示仍然看不懂233

cs158
太强大               

Digital
我就用简单的指令就好了,实在不行就{:10_527:}

a18964819868
WE的最近几次升级使WE的功能大大提升,效率也高了N倍,LZ辛苦钻研了,加油~~~

虫儿.
感觉WE的作用还是太深奥了

枫林1
支持下LZ,毕竟做这个教程帖子也不是很容易

東冻Dong
好详细 就是enn不说了

[email protected]
WorldEdit Wiki http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax#Functions    这个网站看不了了还有没有其他的地方可以知道

Qingraw
原来创世神还有这么多玩法,长知识了

naiifjisfifhaih
太强了,赞赞赞赞赞赞赞赞赞

cruelssr
学到了 很有用 谢谢

Mortal-9
长知识了(好晕啊。。。)
we还是一如既往的神奇

生气土豆z
我的服务器用无论什么we,都没法用笔刷在指定地点刷,而是总是以人为圆心开始刷

下一页 最后一页