WorldEdit的//g指令-高级用法

本篇教程主要讲解的是//g在生成形状时对坐标系的旋转、伸缩的变换操作,及对方块数据值的高级应用。
因此本篇教程是建立在会基础使用//g指令的基础上的,如果你还不会使用//g指令可以先到MCBBS的教程上学习。(最下方相关链接)
变量
在//g中默认有一些变量:x、y、z、data、type。
你也可以设定一个自己的变量
例:r=sqrt(x^2+y^2) 这样你就获得了一个变量 r ,它的值还可以根据x、y的值的不同而改变。
伸缩变换
伸缩和平移
利用伸缩变换我们可以对坐标系的某个或几个轴进行伸长或缩短。
比如我们可以将一个圆压成一个椭圆、同理也可以将一个球压缩为椭球。
举例:
//g -c stone x^2+z^2<=16^2&&y==0
这是一个在y=0平面上以16为半径的圆。
当我们对X轴进行压缩可以得到:
//g -c planks (x=2*x);x^2+z^2<=16^2&&y==1
这是一个y=1平面上的半长轴长为16,半短轴长为8的椭圆。

可以看到我们的指令只多了一个 (x=2*x); 这一部分他的作用是让X坐标都缩小到原来的1/2。
我们也可以同时改变多个轴,比如我们可以同时再加入 (y=y-5); 这样整个图形就会向y轴正方向上平移5个单位。
这时部分玩家可能已经意识到了,这样的变换是有顺序的,也就是对于同一个轴的变换,先平移再伸缩和先伸缩再平移是不一样的。
也可能有观众还不明白,这里先卖个关子,讲一下变换的合并,可以有助于顺序的理解。
对于 (x=x+5);(x=2*x); 这样对同一个轴多长变换的式子我们可以对其进行合并,上述的式子可以合并为 (x=2*x+10); 也就是遵循从左到右的变换顺序,可以将上一个式子的变换带入下一个式子。即(x=2*(x+5)); 。
因此变换的顺序就显现出来了。
(x=x+5);(x=2*x); 变为 (x=2*x+10);
(x=2*x);(x=x+5); 变为 (x=2*x+5);
旋转变换
与伸缩变换的格式差不多,旋转变换的格式是 rotate(轴1, 轴2, 弧度);
这里的 轴1 和 轴2 是x、y、z中不同的两个,顺序无所谓,其作用是标记一个旋转的平面。
例如:rotate(x,y,pi/4); 的意思是将xy平面绕z轴旋转45°,至于旋转的方向可以记为:逆着旋转轴的正方向看,以顺时针旋转。
图例://g -h -c stone rotate(x,y,pi/4);(20-sqrt(x^2+z^2))^2+y^2<5^2

同样你也可以旋转多次,先绕z轴转,再绕y轴转……
于是又出现了顺序难题——旋转变换与伸缩变换之间的影响。
这里举例两个操作:
顺时针旋转90°
向上平移3格
情况①:先旋转后平移。
情况②:先平移后旋转。

可以看到,旋转的结果虽然相同,但最终位置截然不同。
无论是哪一种变换其直接影响的是内部的坐标系。因此对于接下来附加的坐标判断语句也有影响。
根据坐标的数据值变化
我们可以用 data=(number); 来设定方块的数据值,也可以利用判断语句来玩点花样。
例:
//g -h -c wool data=(y<0?0:1);(20-sqrt(x^2+z^2))^2+y^2<5^2

同样变换之间会收到影响


还有一个 type=(); 可以供我们使用
例:
//g -h -c wool type=(y<0?42:57);(20-sqrt(x^2+z^2))^2+y^2<5^2

注:此时指令中原本的羊毛并没有显现出来,这是因为在判断语句对选区内的全部方块总会返回true或false,因此不会有空位置留给羊毛。
同样判断语句内可以使用逻辑符号连接,例:type=(x<0||z<0?42:57);
应用
部分来自官方wiki

//g -h -c 35:15 rotate(x,z,y*pi/32);(x=x-17);(z=0.7*z);x^2+z^2<8^2


相关链接
//generate 指令研究基础 http://www.mcbbs.net/thread-535283-1-1.html
官方wiki //generate页面 http://wiki.sk89q.com/wiki/WorldEdit/Generation#Arbitrary_shapes