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

【教程】soma3.0×python的一些想法+命令数据包调用

2022-02-19 21:28 作者:北山_Besson  | 我要投稿

       结束了超级短的寒假,折腾了一个假期的soma3.0,现在终于搞出了点名堂来。首先先说明一下,请君准备好python(强推spyder)和数学(高中水平够了)(此处将涉及极坐标的一点点东西,没有极坐标方程,不用担心)。

值得一提的是,minecraft的坐标系为zxy系,不是右手系哦!至于soma是个啥?简单来说就是连续平滑相切的曲线。


注意:此专栏已于2022.5.1重新编辑(函数大改),并于2023.1.9重新编辑(soma函数)

       首先来到第一部分,主要是三大函数:medline()、lines()和point()【为了简单明了,所以括号内的内容省略了】。这一部分思想参考https://www.bilibili.com/read/cv14086991?from=search&spm_id_from=333.337.0.0这篇文章里面找每一个圆心的方法。我在这里简述一下:先确定A、B、C、P(圆心)坐标。必须的是,P在AB中垂线上。然后求出BC中垂线,求出直线PB和BC中垂线的交点,而那个交点就是下一个圆心的坐标(不多说了,再说成抄袭了)。

       简而言之,A、B、P的坐标关乎之后所有粒子的运动轨迹。

       代码如下:

大家知道直线方程的一般式吧:ax+by+c=0,于是,求出a、b、c就OK了(仅返回a b c的值)。lines()函数用两点求出直线方程,由直线的两点式方程推演而来。而medline()函数采用了一样的方法求中垂线。然后point()函数就是联立求点法(当然不是数学里面单纯的联立)【参考知乎:https://www.zhihu.com/question/381406535/answer/1095948349】,然后返回交点。以下是第一部分的后半部分代码:

首先你得准备一个“point.txt”文件来储存你的坐标,要和你的程序放在同一个目录下。坐标怎么来?当然是自己算啦!(不会吧不会吧,连坐标都不想算?不肝不行哦!特效全靠肝,程序只是辅助的);格式要这样(那个逗号是英文里的逗号):

同时,我们得将求出的交点再次入参变成x0,z0(我就在这里栽的)

说明一下上面的那些代码。第一个for循环是为了生成list1这个列表。strip()是用来去掉换行符“\n”的,split()是利用“,”作为分隔符生成列表。就成了怎么一个玩意儿:

然后生成一个“opoint.txt”用来储存生成的圆心坐标。write()那个部分是很有意思的一部分。利用format来填充大括号内的内容,“.10f”代表存储10位小数。like this:

相信大家已经解决了上面的那一堆了。那么我们就开始第二部分吧!

第二部分:soma()函数和循环结构求出每两点相对于圆心的坐标(考虑到极坐标求法的特殊性)。代码如下:

上面的代码里面定义了两个全局变量n和list2,这个是用来返回这个点原本的坐标的(请结合下面的另一部分消化一下)。

极坐标这玩意,这里只用了一小部分,即单纯地求坐标。这里的代码利用了复数数学库(cmath),然后xi,zi那一部分就是用来求坐标的现在的高中教材中已经没有了,所以我也不做解释,免得误导大家。

实际上除了极坐标法,还可以用圆的参数方程。差也差不多,因为你得把点对应的角度求出来。

然后这里是另外一部分代码:

至于way的变量为什么是这么个变法,你可以画个图看一下(看那些圆心的相对位置)。有意思的是,我这里这个代码并不是完全对的:

更改部分:说白了就是数学里面的圆的内外切问题——外切方向变,内切不变

每一段圆弧会直接生成一个<num>.mcfunction文件,<num>对应的就是n的值(全局变量)。当然,切分的工作交给你喽!如果你不切的话,每一个圆弧生成的时间都是0.05s(转瞬即逝呢)。推荐每一个mcfunction文件按照同在一个方块内的为一个文件:

为了减少我们的工作量,这里有一个辅助用于生成mcfunction文件的程序:

range()里面的数字按需修改,(100)就是从0取到99。

好喽,最后一个阶段:调用。

这里介绍的是1.13+版本的调用方法(比1.12以下复杂嘞)(我采用1.17.1),说白了就是写个数据包:

  1. 建个文件夹,命名

  2. 在它下面建个data文件夹和pack.mcmeta(用记事本编辑以下代码),pack_format对应的是mc的版本号(4对应1.13、1.14,5对应1.15,6对应1.16 etc.),description是它的描述

3.在data文件夹下建立文件夹,文件夹名称必须是整型!(这和调用有关)

4.在各自文件夹下放mcfunction文件(比如说直线全部在1,soma全部在2......)

5.进入游戏调用(看起来很简单呢)“:”前面的是那个整型文件夹名称,后面是mcfunction对应的名称:

效果如视频所示(视频里面粒子的速度被我调成了0.1,所以会飞开来。我放在GitHub上的源码也是这样的,你可以用上面的覆盖一下【因为搞了半天文件没更新成功】)

粒子是末地烛,自己做了个材质包。

注1:由于soma()函数的取点方式是每度1个,所以当r越大时,点会很分散,你可以增加它的采样频率(再来一层循环结构)

注2:学命令的,珍惜好CTRL键,C键,V键,X键以及TAB键。别忘了,在成就你的同时,还有很多很多的无名英雄在帮你。

然后有问题欢迎留言!(up要开开心心地上学去了)

尾声:

任何难题,并不在于我们没见过它(没见过的东西多嘞),而在于我们有没有这个毅力和胆量去尝试它。生活中绝大多数事情并不能一时半会就完成了(就像写代码),你说你行,那有可能真行;你说你不行,那就真不行。保持耐心,慢慢来,不然你说胖子是如何形成的?(up就是哦)

——北山_Besson

【教程】soma3.0×python的一些想法+命令数据包调用的评论 (共 条)

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