【教程】soma3.0×python的一些想法+命令數(shù)據(jù)包調(diào)用
? ? ? ?結(jié)束了超級(jí)短的寒假,折騰了一個(gè)假期的soma3.0,現(xiàn)在終于搞出了點(diǎn)名堂來(lái)。首先先說(shuō)明一下,請(qǐng)君準(zhǔn)備好python(強(qiáng)推spyder)和數(shù)學(xué)(高中水平夠了)(此處將涉及極坐標(biāo)的一點(diǎn)點(diǎn)東西,沒(méi)有極坐標(biāo)方程,不用擔(dān)心)。
值得一提的是,minecraft的坐標(biāo)系為zxy系,不是右手系哦!至于soma是個(gè)啥?簡(jiǎn)單來(lái)說(shuō)就是連續(xù)平滑相切的曲線。
注意:此專欄已于2022.5.1重新編輯(函數(shù)大改),并于2023.1.9重新編輯(soma函數(shù))

? ? ? ?首先來(lái)到第一部分,主要是三大函數(shù):medline()、lines()和point()【為了簡(jiǎn)單明了,所以括號(hào)內(nèi)的內(nèi)容省略了】。這一部分思想?yún)⒖?a target="_blank" >https://www.bilibili.com/read/cv14086991?from=search&spm_id_from=333.337.0.0這篇文章里面找每一個(gè)圓心的方法。我在這里簡(jiǎn)述一下:先確定A、B、C、P(圓心)坐標(biāo)。必須的是,P在AB中垂線上。然后求出BC中垂線,求出直線PB和BC中垂線的交點(diǎn),而那個(gè)交點(diǎn)就是下一個(gè)圓心的坐標(biāo)(不多說(shuō)了,再說(shuō)成抄襲了)。
? ? ? ?簡(jiǎn)而言之,A、B、P的坐標(biāo)關(guān)乎之后所有粒子的運(yùn)動(dòng)軌跡。
? ? ? ?代碼如下:
大家知道直線方程的一般式吧:ax+by+c=0,于是,求出a、b、c就OK了(僅返回a b c的值)。lines()函數(shù)用兩點(diǎn)求出直線方程,由直線的兩點(diǎn)式方程推演而來(lái)。而medline()函數(shù)采用了一樣的方法求中垂線。然后point()函數(shù)就是聯(lián)立求點(diǎn)法(當(dāng)然不是數(shù)學(xué)里面單純的聯(lián)立)【參考知乎:https://www.zhihu.com/question/381406535/answer/1095948349】,然后返回交點(diǎn)。以下是第一部分的后半部分代碼:
首先你得準(zhǔn)備一個(gè)“point.txt”文件來(lái)儲(chǔ)存你的坐標(biāo),要和你的程序放在同一個(gè)目錄下。坐標(biāo)怎么來(lái)?當(dāng)然是自己算啦?。ú粫?huì)吧不會(huì)吧,連坐標(biāo)都不想算?不肝不行哦!特效全靠肝,程序只是輔助的);格式要這樣(那個(gè)逗號(hào)是英文里的逗號(hào)):

同時(shí),我們得將求出的交點(diǎn)再次入?yún)⒆兂蓌0,z0(我就在這里栽的)
說(shuō)明一下上面的那些代碼。第一個(gè)for循環(huán)是為了生成list1這個(gè)列表。strip()是用來(lái)去掉換行符“\n”的,split()是利用“,”作為分隔符生成列表。就成了怎么一個(gè)玩意兒:

然后生成一個(gè)“opoint.txt”用來(lái)儲(chǔ)存生成的圓心坐標(biāo)。write()那個(gè)部分是很有意思的一部分。利用format來(lái)填充大括號(hào)內(nèi)的內(nèi)容,“.10f”代表存儲(chǔ)10位小數(shù)。like this:


相信大家已經(jīng)解決了上面的那一堆了。那么我們就開始第二部分吧!
第二部分:soma()函數(shù)和循環(huán)結(jié)構(gòu)求出每?jī)牲c(diǎn)相對(duì)于圓心的坐標(biāo)(考慮到極坐標(biāo)求法的特殊性)。代碼如下:
上面的代碼里面定義了兩個(gè)全局變量n和list2,這個(gè)是用來(lái)返回這個(gè)點(diǎn)原本的坐標(biāo)的(請(qǐng)結(jié)合下面的另一部分消化一下)。
極坐標(biāo)這玩意,這里只用了一小部分,即單純地求坐標(biāo)。這里的代碼利用了復(fù)數(shù)數(shù)學(xué)庫(kù)(cmath),然后xi,zi那一部分就是用來(lái)求坐標(biāo)的現(xiàn)在的高中教材中已經(jīng)沒(méi)有了,所以我也不做解釋,免得誤導(dǎo)大家。
實(shí)際上除了極坐標(biāo)法,還可以用圓的參數(shù)方程。差也差不多,因?yàn)槟愕冒腰c(diǎn)對(duì)應(yīng)的角度求出來(lái)。
然后這里是另外一部分代碼:
至于way的變量為什么是這么個(gè)變法,你可以畫個(gè)圖看一下(看那些圓心的相對(duì)位置)。有意思的是,我這里這個(gè)代碼并不是完全對(duì)的:
更改部分:說(shuō)白了就是數(shù)學(xué)里面的圓的內(nèi)外切問(wèn)題——外切方向變,內(nèi)切不變
每一段圓弧會(huì)直接生成一個(gè)<num>.mcfunction文件,<num>對(duì)應(yīng)的就是n的值(全局變量)。當(dāng)然,切分的工作交給你嘍!如果你不切的話,每一個(gè)圓弧生成的時(shí)間都是0.05s(轉(zhuǎn)瞬即逝呢)。推薦每一個(gè)mcfunction文件按照同在一個(gè)方塊內(nèi)的為一個(gè)文件:

為了減少我們的工作量,這里有一個(gè)輔助用于生成mcfunction文件的程序:
range()里面的數(shù)字按需修改,(100)就是從0取到99。

好嘍,最后一個(gè)階段:調(diào)用。
這里介紹的是1.13+版本的調(diào)用方法(比1.12以下復(fù)雜嘞)(我采用1.17.1),說(shuō)白了就是寫個(gè)數(shù)據(jù)包:
建個(gè)文件夾,命名
在它下面建個(gè)data文件夾和pack.mcmeta(用記事本編輯以下代碼),pack_format對(duì)應(yīng)的是mc的版本號(hào)(4對(duì)應(yīng)1.13、1.14,5對(duì)應(yīng)1.15,6對(duì)應(yīng)1.16 etc.),description是它的描述

3.在data文件夾下建立文件夾,文件夾名稱必須是整型?。ㄟ@和調(diào)用有關(guān))

4.在各自文件夾下放mcfunction文件(比如說(shuō)直線全部在1,soma全部在2......)
5.進(jìn)入游戲調(diào)用(看起來(lái)很簡(jiǎn)單呢)“:”前面的是那個(gè)整型文件夾名稱,后面是mcfunction對(duì)應(yīng)的名稱:

效果如視頻所示(視頻里面粒子的速度被我調(diào)成了0.1,所以會(huì)飛開來(lái)。我放在GitHub上的源碼也是這樣的,你可以用上面的覆蓋一下【因?yàn)楦懔税胩煳募](méi)更新成功】)
粒子是末地燭,自己做了個(gè)材質(zhì)包。
注1:由于soma()函數(shù)的取點(diǎn)方式是每度1個(gè),所以當(dāng)r越大時(shí),點(diǎn)會(huì)很分散,你可以增加它的采樣頻率(再來(lái)一層循環(huán)結(jié)構(gòu))
注2:學(xué)命令的,珍惜好CTRL鍵,C鍵,V鍵,X鍵以及TAB鍵。別忘了,在成就你的同時(shí),還有很多很多的無(wú)名英雄在幫你。
然后有問(wèn)題歡迎留言!(up要開開心心地上學(xué)去了)

尾聲:
任何難題,并不在于我們沒(méi)見過(guò)它(沒(méi)見過(guò)的東西多嘞),而在于我們有沒(méi)有這個(gè)毅力和膽量去嘗試它。生活中絕大多數(shù)事情并不能一時(shí)半會(huì)就完成了(就像寫代碼),你說(shuō)你行,那有可能真行;你說(shuō)你不行,那就真不行。保持耐心,慢慢來(lái),不然你說(shuō)胖子是如何形成的?(up就是哦)
——北山_Besson