欢迎光临散文网 会员登陆 & 注册

【Minecraft】worldedit|generate 莫比乌斯旋转模型

2022-11-12 17:53 作者:MHols_  | 我要投稿

成品

//generate 35 a=atan2(x,z)*2;x1=sqrt(x^2+z^2)-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);data=(X<0)?(Y>0?1:2):(Y<0?3:4);(abs(X)-0.1)^2+(abs(Y)-0.1)^2<0.1^2
//generate 35 a=atan2(x,z)/2;x1=sqrt(x^2+(z)^2)-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);(X)^2+15*Y^2<0.2^2

先讲下主要的设计思路,我们以成品的第二个图为例,把表达式拆开一步步分析

先做一个椭圆柱

//generate 35 x^2+15*y^2<0.2^2

接着我们暂时让这个椭圆柱以z的值旋转:

//generate 35 a=(1+z)*pi/2;X=x*cos(a)-y*sin(a);Y=x*sin(a)+y*cos(a);X^2+15*Y^2<0.2^2

实现的方式就是

a=(1+z)*pi/2;

X=x*cos(a)-y*sin(a);Y=x*sin(a)+y*cos(a);

把x替换成X,y替换成Y,学过仿射变换的应该知道,这个来源于

https://ww2.mathworks.cn/help/releases/R2021a/images/matrix-representation-of-geometric-transformations.html

这个直接记住就行了,xy平面内旋转就把x和y替换掉

接着如果我们把仿射变换里的原x再提前做个变换

x1=x-0.7;a=(1+z)*pi/2;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);

你会发现,整体向x轴正向移动,这为我们把这个形状做成环状做了准备

//generate 35 a=(1+z)*pi/2;x1=x-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);X^2+15*Y^2<0.2^2
//generate 35 a=atan2(x,z)/2;x1=sqrt(x^2+z^2)-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);X^2+15*Y^2<0.2^2

我们把 x1=x-0.7; 改成 x1=sqrt(x^2+z^2)-0.7;这里我可能也说不清楚,大概就是让本来只与x相关改成与x,z同时相关的(也就是把本来 x轴上的点距离原点大小 改成 平面上的点与原点的距离大小),这一步就可以让这个形状形成半径为0.7的环状

下一步,角度a不能再是与z的值相关的了,该改成atan2(x,z)/2,范围:-pi/2~pi/2 总长:pi

意思就是旋转的角度为其当前的极角相关,一圈总共旋转了pi,刚好接上

当然这个值可以变,改成2*atan2(x,z)就是一圈转了4pi,也就是两圈

好,依照上面的思路,如果我们在第一步时使用的不是一个椭圆柱,而是四个圆柱相贴合

//generate 35 (abs(x)-0.1)^2+(abs(y)-0.1)^2<0.1^2

然后,后面的操作同理,我们想让这个环多转点,那就a=atan2(x,z)*2

//generate 35 a=atan2(x,z);x1=sqrt(x^2+z^2)-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);(abs(X)-0.1)^2+(abs(Y)-0.1)^2<0.1^2;

接下来是上色部分,我们只需要分开这四个圆柱就行了,data=(X<0)?(Y>0?1:2):(Y<0?3:4);

这里用了嵌套,应该不用多说

//generate 35 a=atan2(x,z)*2;x1=sqrt(x^2+z^2)-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);data=(X<0)?(Y>0?1:2):(Y<0?3:4);(abs(X)-0.1)^2+(abs(Y)-0.1)^2<0.1^2;

同理,当这个是个矩形呢?

//generate 35 a=atan2(x,z)/2;x1=sqrt(x^2+z^2)-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);X^10+Y^10<0.001^2;

总结下,本专栏的精华内容就是:

a=atan2(x,z)/2;x1=sqrt(x^2+z^2)-0.7;X=x1*cos(a)-y*sin(a);Y=x1*sin(a)+y*cos(a);

后面接一个在x,y平面内的图形的表达式,把表达式内的x,y分别替换成X,Y

有什么问题或者想看什么其他效果可以留言


【Minecraft】worldedit|generate 莫比乌斯旋转模型的评论 (共 条)

分享到微博请遵守国家法律