最近研究了下WorldEdit的//generate命令,发现这个简直就是一个神器,这个贴将会说明一些关于这个指令的基础用法,注意事项以及一些实例。
在此也欢迎各位进行讨论,插楼灌水适量~



第一章 基本知识


首先 以一个WE Wiki上的例子讲解这个命令的基础



这个石头的物体是用一个指令生成的【对你没看错是一个
生成需要先选择一个选区,然后输入指令
命令为 //g stone (0.75-sqrt(x^2+y^2))^2+z^2 < 0.25^2


下面讲解这个命令的组成


//g
主命令//generate的缩写


stone
石头,即生成物体所用的材料


(0.75-sqrt(x^2+y^2))^2+z^2 < 0.25^2
方程表达式,也是这个命令的核心部分
//genenrate 命令可以以一个方程表达式来生成物体,任何你可以用一个(或多个,后面会讲到)的方程来表达的物体


这个命令的语法为
//generate (-h/-r/-o) <block> <expression>
//generate : 主命令 也可写作//g 或 //gen
(-h/-r/-o) : 生成选项,不必须,3选一 
-h比较重要,可以生成空心物体
-r会使用MC坐标,默认使用 -1/1 坐标,后面讲解
-o会将玩家输入命令的位置作为原点(0,0,0)生成物体,默认为选区中心)
<block> : 生成所用方块,可以是id(比如 1),也可以是方块名称(比如 stone)
<expression> : 方程式,以下重点讲解

----------------------------------------------

第二章 方程式



(0.75-sqrt(x^2+y^2))^2+z^2 < 0.25^2


这个就是使用的方程式,由于LZ学历有限,就不多做解释


但是这里要讲解写WE方程式方法及几个重点


写法


数字:按正常写,小数点用点表示,支持正负号
运算符号:
加减乘除分别为 + - * / 
次方为 ^ 例: 2^2 表示2的2次方
括号:只支持圆括号
逻辑:(使用多个方程时的重点)
&& 代表逻辑与门
|| 代表逻辑或门
比较:
大于与小于: < >
小于等于:<=
大于等于:>=
等于:==
不等于:!=
其他function如 sqrt(平方根)等也能正常使用
具体列表可以看这里
http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax#Functions


写方程需要注意的地方


2x 3y 等需要写成 2*x 3*y


最后,非常重要的一个


这些方程并不是等式,它们是不等式
原因是因为WE在生成的物体是一个区域,不是一个或一条直线



这里举一个例子



这里的是一个等式,表达了一条直线



这里的是一个不等式,表示了一个区域(蓝色部分)
WE可以识别的是不等式,这跟WE的算法有关
在生成物体时,WE会分析选择区域内的每个方块,将坐标代入计算,如果坐标满足不等式,则生成,反之则不生成


总结下来
1.WE中的运算符号和正常写法有些不同
2.只能使用不等式,不能使用等式
3.乘号不能省略

 

------------------------------------------

第三章 球?椭球?


了解了方法之后,现在做一个简单的应用


一个直径1的球体


大家都知道球体的方程 
x^2+y^2+z^2=1


但是WE只识别不等式,所以应该写成
x^2+y^2+z^2<1


之所以是小于,因为球体表面用等式表达,用来表达内部的空间自然使用小于


加上其他的就是 //g 1 x^2+y^2+z^2<1
这里的1代表石头,可以使用其他材料


这个就是结果



你们肯定发现不对了,因为这明明是一个椭球


但是 WE确实是用生成球体的不等式生成的


原因就是选择区域不是一个正方体
这个是很重要的一个变量


WE生成物体所使用的三维空间为选择区域,但是这个三维空间的坐标界限为-1和+1原点默认为选择区域的中心


如图所示




这3条石头代表x y z 轴, WE的x轴对应MC的x轴,WE的y轴对应MC的y轴,WE的z轴对应MC的z轴,每个坐标上界限为-1和1,3条石头的交叉点为原点


这样的后果就是不同的比例不是1:1:1,造成了刚才的球体被拉长成了椭球




现在我们选择了一个方形的选区,也就是说,不同轴的比例是1:1:1


正如前面说过,一个球体出现了




总结下来就是
1.表达立体图形的内部空间要使用 <
2.生成规则图形时,选区要为正方体才会正确生成,不然会被拉长或者压扁
3.WE的3条轴与MC的相同,并不是直角坐标系内的xyz轴方向
4.每条轴上的最大值为1,最小值为-1
5.原点为选择区域的中心-

-----------------------------------

球体的方程 x^2+y^2+z^2=1

 

------------------------------------------

 

第四章 正方体


大家知道,用一个不等式大部分情况下只能生成有弧度的东西,比如球体


那像正方体有棱有角的怎么生成呢?
【别跟我提直接//set只是举个例子,有本事你用//set弄出个4面体

这里是准备好的框子


这里LZ找到的方法是,先确定正方体6个所属的平面,然后用< > 决定区域(这里需要有些3D分析能力),找到6个不等式
然后将它们用 逻辑与门 && 连起来,意思就是找到这6个区域共有的区域,那个区域就是我们的正方体了


这里用2D的正方形举个栗子



因为WE的空间限定于-1与1之间,先放大
对了这个软件叫GeoGebra 是一个免费的作图软件

这个是我们需要的正方形 4个为 (0.5,0.5)(-0.5,0.5)(0.5,-0.5)(-0.5,-0.5)


我们先找到它的4条所属的直线以及表示这些直线的方程
x=0.5
x=-0.5
y=0.5
y=-0.5


然后一一转换成不等式,这里转换的是 x=0.5 因为这个不等式的区域和其他3个不等式的区域的交集为最后的正方形,所以它的区域肯定要包括那个正方形,所以不等式为 x<0.5

这样把4个方程转为不等式,它们的交集就是我们需要的正方形了~ 也就是图上最深的那部分




现在让我们回到MC
如果我们需要一个边长为1,在选区中心的正方体那么它的6个将会是 
(0.5,0.5,0.5) (0.5,-0.5,0.5) (-0.5,0.5,0.5) (0.5,0.5,-0.5) (0.5,-0.5,-0.5) (-0.5,-0.5,-0.5)
它的6个所属的平面方程将会是
x=0.5
x=-0.5
y=0.5
y=-0.5
z=0.5
z=-0.5
可以看出除了多出z之外没什么变化


转换成不等式
x<0.5
x>-0.5
y<0.5
y>-0.5
z<0.5
z>-0.5


这6个不等式空间区域的交集就是那个正方体
我们用&&表示逻辑与门,就是交集,这样就可以把6个不等式连起来
x<0.5 && x>-0.5 && y<0.5 && y>-0.5 && z<0.5 && z>-0.5


最后的指令就是
//g 1 x<0.5 && x>-0.5 && y<0.5 && y>-0.5 && z<0.5 && z>-0.5


输入命令,正方体出现了~










利用这个方法可以生成几乎任何有棱角的物体
基本步骤就是
1.找到它的所有顶点的坐标
2.找到它所有面所属的平面的方程(利用3个属于一个平面的点的坐标可以算出平面的方程)
3.将方程转化为不等式
4.将不等式写成WE的格式
5.用&&连接然后输入


关于有弧度的物体,比如球基本都是一个方程就能解决,LZ的学历也没达到那么高,这里就不再详细说明

 

---------------------------------

 

第五章 四面体
这里是一个实际的应用


4面体 Tetrahedron
图片来自维基

为了方便取坐标这里使用 stella octangula进行参考,将要生成的是黄色的那个,它的4个顶点为一个正方体8个顶点中的4个

取得的坐标
(-1,-1,1)
(-1,1,-1)
(1,-1,-1)
(1,1,1)


通过计算得到4个所属平面方程


4x + 4y +4z + 4=0


-4x + 4y +4z + -4=0


-4x + 4y +-4z + 4=0


4x + 4y +-4z + -4=0


写成WE格式 这里的大于小于需要有些3D的思考能力,实在不行一个一个试


4*x + 4*y +4*z + 4>0


-4*x + 4*y +4*z -4<0


-4*x + 4*y +-4*z + 4>0


4*x + 4*y +-4*z -4<0


最后的命令


//g 1 4*x + 4*y +4*z + 4>0 &&-4*x + 4*y +4*z -4<0&&-4*x + 4*y +-4*z + 4>0&&4*x + 4*y +-4*z -4<0


生成的效果

----------------------------------------
 
 

 

 

 

引用:http://tieba.baidu.com/p/2714393353?pid=41908521437&cid=0#41908521437

文章標籤
全站熱搜
創作者介紹
創作者 coumn08 的頭像
coumn08

coumn08的部落格

coumn08 發表在 痞客邦 留言(0) 人氣(295)