minecraft吧 关注:2,560,900贴子:31,986,397

【WorldEdit】//generate 指令研究

只看楼主收藏回复


大家好,这里是文化部的Az,最近完成了对WorldEdit中//generate 指令的研究,在这里与大家分享一下获得的成果,发掘这个功能更多的潜能。
正式开始前的提示:你可能需要如下知识来理解本文并了解它的使用方式
- WorldEdit 基础操作
- 三维直角坐标系
- 基础代数
- 集合论与逻辑运算
由于文章较长分多楼发布,请善用“只看楼主”功能,且请勿插楼。


IP属地:意大利本楼含有高级字体1楼2015-12-27 11:36回复
    I.指令简介
    //generate 为WorldEdit中的一个指令,可简写为//gen或//g,作用是按照用户给出的一个表达式生成对应的形状。这个是WorldEdit一个非常强大的功能,理论上下可以生成任何使用表达式表示的物体,但实际使用有一个较大的限制,由于Minecraft单指令可以输入的最大字符数,过长的表达式无法输入,但就算如此,这个指令仍然可以用来完成一些复杂的操作,在Minecraft各个领域得到应用。
    在这里我将与各位讲解一下这个指令的使用方法,使用时的注意事项,以及我研究与找到的一些实际使用方法与例子,也希望各位如果有能力一起来完善对这个指令的研究,发掘出他更多的潜力。
    在正式开始之前,我们来看一个来自WorldEdit Wiki的例子来了解这个指令的强大效果。

    一个心形,仅使用了一个指令生成,虽然在这里我不会介绍如此复杂的使用方式,但从这里也不难看出这个指令的强大。
    用来生成它的指令为
    //g wool:red (z/2)^2+x^2+(5*y/4-sqrt(abs(x)))^2<0.6
    接下来,我们将会一一讲解这个指令的结构与使用方式。


    IP属地:意大利本楼含有高级字体2楼2015-12-27 11:38
    收起回复
      2025-08-29 14:25:06
      广告
      不感兴趣
      开通SVIP免广告
      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 为这个指令可以使用的标示。
      使用这个指令的时候需要选择一个选区,形状会在这个选择的选区中生成,注意选区的形状会影响到输出的形状,有时这个特性会造成一些麻烦,但有时可以使用这个来达到希望的效果,这一点我们接下来会讲到。
      同时,就像刚才提到的,在使用这个指令时,我们可以使用一个或几个标示来改变指令的效果,来达到需要的结果。


      IP属地:意大利本楼含有高级字体3楼2015-12-27 11:39
      收起回复
        V.等式与不等式
        刚才提到了WorldEdit使用的不等式而非等式,这里简单来讲解一下二者的区别(学霸可以跳过)。
        下面的这个等式是一条直线

        而不等式表达的是一个区域

        WorldEdit中使用的是不等式,来表达一个区域,这个区域中的方块位置便会被放置方块。


        IP属地:意大利本楼含有高级字体7楼2015-12-27 11:47
        回复
          VI.空心图形标示的使用
          刚才我们提到了生成时可以使用标示来改变命令的输出,首先我们来看一下空心图形标示,即 -h ,它的作用是可以使生成的图形“空心”,即只有图形边缘位置得方块会被生成,这个边缘的判定方式是“如果这个方块位置一方块单位周围的任何方块位置不属于这个图形,那么这个位置的方块就会被生成,反之则不生成。
          首先我们来看一个例子

          上图使用的指令是
          //g 95:0 x^2+y<1
          即一个抛物面的下方部分
          如果使用相同的表达式,但是使用-h 标示,结果就会是这样的(下图红色玻璃部分为新指令输出,覆盖到白色玻璃的旧指令的输出上进行比较)。

          可以看到,只有抛物面最上方(也可以说只有抛物面本身)的位置生成了方块。
          上图使用的是
          //g 95:14 -h x^2+y<1
          就像我们刚刚看到的,使用这个方式也可以使不等式拥有类似等式的输出,接下来我们来看一下另一个例子。
          在本文开始的部分我们提到了球体内部的不等式
          x^2+y^2+z^2<1
          如果我们使用-h 标示,就可以生成空心的球体,即表达式为
          x^2+y^2+z^2=1
          的球面,虽然并不能达到完全准确,但也能达到八九分。
          那么,我们来看一下生成的效果:

          上图使用的命令为
          //g 95:0 -h x^2+y^2+z^2<1
          可以看到使用空心图形标示的效果。
          到现在为止,我们使用的例子都是简单的平面或曲面,那么各位可能会问了,像是正方体这种有棱有角的多面体可以生成吗?
          答案是肯定的,但生成多面体我们需要用到另一个功能,那就是逻辑门


          IP属地:意大利本楼含有高级字体8楼2015-12-27 11:50
          回复
            woc看起来好高端的样子【看不懂


            IP属地:安徽9楼2015-12-27 11:52
            收起回复
              VIII.函数的使用
              在表达式中我们可以使用一系列的函数,使用的方法与日常的写法相似,即函数(<输入值>),这里我们来使用几个常见的函数作为例子了解一下它们在表达式中的应用。

              上图使用了
              //g 155 y<abs(x)
              其中abs(x)代表的便是x的绝对值
              下面这个是正弦cos(x),同时使用了 -h 来仅生成正弦的曲线(什么?你想说说好的曲线呢?有两种可能,一是你没仔细看前面的,二是你三角函数没学好www)

              上图使用的指令是
              //g 95:0 sin(x)<y

              那么为了更容易得看出曲线,我们可以对它进行一些压缩

              这里我们使用了
              //g 95:0 sin(4*x)<y
              这样就能明显看出正弦的曲线了。
              除了提到的这两个,生成时还可以使用许多其他的函数,各位可以参考前文给出的链接中的列表来了解。
              接下来,我们将会讲解生成时可以使用的另外两个标示,-r 与 -o 这两个标示的运作方式与之前提到的完全不同。


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

                这次我们的目标是生成一个以这个金块为中心的空心椭球,和刚才不同,我们不需要得到这个金块的坐标,而是将这个金块位置得坐标看做原点,即(0;0;0)
                接着,我们在这个位置使用指令
                //g 95:0 -o -h x^2+(2*y)^2+z^2<100
                可以看到使用了-o 与 -h 标示,并且并没有对像刚才一样带入中心点的坐标,如此输入的结果是:

                从外面看的效果如下:

                成功生成了需要的椭球。
                最后我们来看一个斜面:

                如上图,我们在钻石块位置使用指令:
                //g 155 -o -h x<y
                因为x=y平面的特性,可以生成一个45度的斜面
                效果如下:

                整体效果:

                至此,对于指令本身的研究结束,接下来会展示一些本人收集到的一些实际的应用与实际操作例子(部分为个人研究,部分为在他人的研究之上进行的深入,部分为他人的研究)。


                IP属地:意大利本楼含有高级字体13楼2015-12-27 12:12
                回复
                  2025-08-29 14:19:06
                  广告
                  不感兴趣
                  开通SVIP免广告
                  XI.例子-曲面
                  接下来我们来了解一些这个指令的实际应用,这些应用一般与建筑有关,也会有一些其他非相关的形体。
                  每个图形我仅会给出所用的公式与标示,前面的主命令与方块部分需要自己补全,即使用时要使用如下格式:
                  //g <方块ID> <下文给出部分>
                  一部分形体生成时高度不会达到选区总高度,所以需要选择适当大小的选区来进行生成,并且通过使用不同形状的选区可以达到拉伸形体的效果。
                  1. 半球
                  通过由球体向下平移一单位得到
                  x^2+(y+1)^2+z^2<1
                  形体高度=选区高度/2
                  如果使用了-h标示便可以生成半球穹顶。

                  2. 圆柱体
                  两个的表达式分别为
                  x^2+z^2<1
                  x^2+y^2<1
                  形体高度=选区高度
                  使用 -h 可以生成空心圆柱


                  3. 半圆拱顶
                  通过将上一个圆柱体向下移动一单位并使用-h得到
                  -h x^2+(y+1)^2<1
                  形体高度=选区高度/2
                  将x替换为z可以得到另一个方向的拱顶

                  4.半圆十字拱/穹形拱顶
                  通过将两个方向的半圆拱顶交叉形成
                  -h x^2+(y+1)^2<1||z^2+(y+1)^2<1
                  形体高度=选区高度/2


                  IP属地:意大利本楼含有高级字体14楼2015-12-27 12:16
                  回复
                    5. 抛物面
                    -h x^2+y<0
                    形体高度=选区高度/2
                    将x替换为z可以生成另一方向的抛物面
                    抛物线形的拱顶

                    6. 抛物面十字拱
                    通过将两个方向的抛物面交叉形成
                    -h x^2+y<0||z^2+y<0
                    形体高度=选区高度/2

                    7. 等角拱
                    通过两个稍大平移过的圆柱体的交集形成
                    -h (x+1)^2+(y+1)^2<4&&(x-1)^2+(y+1)^2<4
                    形体高度=选区高度/0.25+sqrt(2)/2
                    将x替换为z可以生成另一个方向的拱顶

                    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

                    9. 圆锥
                    x^2+z^2<(0.5*(y-1))^2
                    形体高度=选区高度
                    使用-h可以生成空心形体


                    IP属地:意大利本楼含有高级字体15楼2015-12-27 12:19
                    回复
                      10.旋转抛物面
                      x^2+z^2+y<1
                      形体高度=选区高度

                      11. 抛物面帆拱
                      通过上一个形体的空心形体得到
                      x^2+z^2+y<1
                      形体高度=选区高度
                      帆拱为从圆形面到方形面的转换

                      12. 球形帆拱
                      通过稍大的半球穹顶的空心形体得到
                      -h x^2+(y+1)^2+z^2<2
                      形体高度=选区高度

                      13. 双曲面
                      x^2/A+z^2/B-y^2/C<D
                      A,B,C,D可以分别取值,下图使用的是
                      x^2/0.4+z^2/0.4-y^2<1
                      形体高度=选区高度

                      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
                      生成在选区上半部分
                      将多个形体连续放置可以得到扇形拱顶


                      IP属地:意大利本楼含有高级字体16楼2015-12-27 12:23
                      收起回复
                        15. 四面攒尖顶
                        通过4个方向的抛物面外部的交集形成,并只取下半部分
                        -h y^2+x>0&&y^2+z>0&&y^2-x>0&&y^2-z>0&&y<0
                        形体高度=选区高度/2

                        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

                        17. 葱型圆顶
                        -h x^2+z^2<(0.5*sin(0.75*pi*(y+1))+0.5)^2
                        形体高度=选区高度


                        IP属地:意大利本楼含有高级字体17楼2015-12-27 12:25
                        回复
                          火钳


                          来自Android客户端19楼2015-12-27 12:30
                          收起回复
                            XIII.使用例子
                            最后,我们来看几个实际的操作例子:
                            1. 肋形穹顶走廊
                            操作目标是在这些柱子上加上肋形穹顶

                            首先确定选区,选区底边的四个点为四根柱子的中心点

                            接下来使用肋形穹顶的指令
                            //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)

                            成功生成了穹顶

                            接下来使用//stack进行堆积即可,最终效果如下

                            2. 半椭球穹顶
                            目标为在圆形底座上创建半椭球型的穹顶,首先创建选区

                            使用指令
                            //g lapislazuli -h x^2+(y+1)^2+z^2<1

                            成功生成,效果如下


                            IP属地:意大利本楼含有高级字体20楼2015-12-27 12:31
                            回复