algodoo進(jìn)階教程(一)——閃色的設(shè)定
你還在為不會(huì)制作閃色而煩惱嗎?
本文可以讓你精通閃色制作原理
目錄:
一、取余
二、三角函數(shù)
附錄:各種閃色的代碼(看不懂可以來這里自取)

————————————正文開始————————————
一、取余
取余,顧名思義,就是取余數(shù)。符號(hào)是%,用法是:
若a÷b=c……d,則:a%b=d,(a,b,c,d∈Z)(取余計(jì)算與乘除計(jì)算同級(jí))
看一個(gè)例子:
postStep=(e)=>{
? ? scene.my.rainbow = color;
? ? colorHSVA = [270 * sim.time % 360, 1, 1, 1]
}
這是 @灰安教主 的圖中彩虹的代碼。(個(gè)人不太推薦寫在postStep里,后期在使用新規(guī)則時(shí)可能產(chǎn)生不必要的麻煩)
第一行不用管,咱們直接分析取余部分:
色相為270 * sim.time % 360,那么色相的變化不是完全連續(xù)的,從0°到360°均勻變化,每1.5秒完成一次循環(huán)。
也就是說,取余只適合某一變量的單向均勻循環(huán)變化,其中只有一個(gè)參數(shù)(270)負(fù)責(zé)控制閃爍速度。
由此,各種彩虹的制作都可以解決了。
二、三角函數(shù)(重點(diǎn))
高中我們都學(xué)過三角函數(shù)的復(fù)合形式:y=Asin(wx+φ)+B
那么我們應(yīng)該如何將它利用到閃色制作上來呢?
看一個(gè)例子:
postStep=(e)=>{
? ? scene.my.mono = color;
? ? colorHSVA = [0, 0, math.sin(sim.time * 6) / 2 + 0.5, 1]
}
(math.sin()是algodoo自帶的函數(shù),前面的math.不能?。?/p>
這是 @灰安教主?的圖中黑白閃的代碼。
第一行不用管,咱們直接分析三角函數(shù)部分:
對(duì)照標(biāo)準(zhǔn)式,咱們可以得到:
A=1/2 ; w=6 ; φ=0 ; x=sim.time ; B=0.5
什么意思呢?
colorHSVA(2)即顏色的亮度參數(shù)(范圍為0到1)的基準(zhǔn)線為0.5,以0.5的振幅來回浮動(dòng),且以約1.02秒為一次浮動(dòng)周期,變量是sim.time(開始擬真后計(jì)時(shí))。
也就是說,A決定振幅,w決定閃爍速度,B為基準(zhǔn)線,φ無所謂
三角函數(shù)適用于變量循環(huán)往復(fù),擺動(dòng)式的變化。
由此,三角函數(shù)可以解決絕大多數(shù)閃色的問題。
再來一個(gè)例子:
如果我想做酸橙-品紅閃呢?
已知:酸橙rgb:(0,256,0);品紅rgb:(256,0,256)
翻譯成algodoo的顏色,則
酸橙:color=【0,1,0,1】;品紅:color=【1,0,1,1】
同樣,分析三角函數(shù)的幾個(gè)參數(shù)。
我們發(fā)現(xiàn),兩個(gè)顏色的四個(gè)參數(shù)中有三個(gè)都不一樣,那么這三個(gè)參數(shù)都得使用三角函數(shù)。
可以看出,三者的基準(zhǔn)線都為0.5,振幅都為0.5,閃爍速度分別為x,-x,x(x自定,可正可負(fù))
接下來上代碼:
color={
? ? [-0.5 * math.sin(3 * sim.system.time) + 0.5, 0.5 * math.sin(3 * sim.system.time) + 0.5, -0.5 * math.sin(3 * sim.system.time) + 0.5, 1.0]
}
其中system.time是一打開algodoo就開始計(jì)時(shí)的。
建議像我這樣寫在color里,可以騰出postStep與update里的空間以供做其他處理。
最后總結(jié)一個(gè)任意閃色制作的公式:
顏色1:【a1,b1,c1】;顏色2:【a2,b2,c2】(a1,b1,c1,a2,b2,c2均為該顏色原來的rgb除以256,∈【0,1】)
則:
color={
? ? [((a1 - a2) / 2)?* math.sin(3 * sim.system.time) + (a1 + a2) / 2 , ((b1 - b2) / 2) * math.sin(3 * sim.system.time) + (b1?+ b2)?/?2 , ((c1 -?c2)?/?2) * math.sin(3 * sim.system.time) + (c1?+ c2)?/?2 , 1.0]
}
注意:(1)1和2的前后順序一定要固定,且三個(gè)一致
(2)公式中的3可更改,而且必須3個(gè)一起改

附錄:部分閃色的代碼:(復(fù)制時(shí)只需復(fù)制花括號(hào)及其里面的內(nèi)容至對(duì)應(yīng)變量后即可)
1.彩虹:colorHSVA = {
[270?*?sim.time % 360, 1, 1, 1]
}
2.淺彩虹:colorHSVA = {
[270?* sim.time % 360, 0.5, 1,?1]
}
3.深彩虹:?colorHSVA = {
[270 * sim.time % 360, 1, 0.5, 1]
}
4.彩虹閃:colorHSVA = {
[270 * sim.time % 360, math.sin(sim.time * 6) * 0.5 + 0.5, math.cos(sim.time * 6) * 0.5 + 0.5, 1]
}(注意這里的明度使用了cos)
5.黑白閃:colorHSVA = {
[0, 0, math.sin(sim.time * 6) / 2 + 0.5, 1]
}
6.紅黑閃:colorHSVA = {
[0, 1, math.sin(sim.time * 6) / 2 + 0.5, 1]
}
7.青白閃:?colorHSVA = {
[180, math.sin(sim.time * 6) / 2 + 0.5, 1, 1]
}
8.螳螂生:color = {
? ? [math.sin(sim.system.time * 3) * (22.5 / 256) + (156.5 / 256.0), math.sin(sim.system.time * 3) * (20.5 / 256) + (160.5 / 256), math.sin(sim.system.time * 3) * (78.0 / 256) + (117.0 / 256), 1]
}
9.王瓜生:color = {
? ? [math.sin(sim.system.time * 3) * (6.0 / 256) + (236 / 256.0), math.sin(sim.system.time * 3) * (77.0 / 256) + (77.0 / 256), math.sin(sim.system.time * 3) * (50.0 / 256) + (68.0 / 256), 1]
}
10.始電:color = {
? ? [math.sin(sim.system.time * 3) * (16.0 / 256) + (34 / 256.0), math.sin(sim.system.time * 3) * (37.5 / 256) + (75.5 / 256), math.sin(sim.system.time * 3) * (47.5 / 256) + (123.5 / 256), 1]
}
11.倉庚鳴:color = {
? ? [math.sin(sim.system.time * 3) * (28.0 / 256) + (226 / 256.0), math.sin(sim.system.time * 3) * (99.0 / 2 / 256) + (170.5 / 256), math.sin(sim.system.time * 3) * (36.5 / 256) + (57.5 / 256), 1]
}
12.雨水:color = {
? ? [math.sin(sim.system.time * 3) * 0.16015625 + 0.8125, math.sin(sim.system.time * 3) * 0.22070313 + 0.60351563, math.sin(sim.system.time * 3) * 0.1875 + 0.69921875, 1]
}
13.漸變紅(漸變單色就舉這一個(gè)例子):update = (e)=>{
? ? sin(sim.time * 3) / 2 >= 0 ? {
? ? ? ? colorHSVA = [0, 1, 1 - sin(sim.time * 3) / 2, 1]
? ? } : {
? ? ? ? colorHSVA = [0, 1 + sin(sim.time * 3) / 2, 1, 1]
? ? }
}
14.隨機(jī)色:后續(xù)教程里講到隨機(jī)數(shù)時(shí)再說

文章到此就結(jié)束了。
本文只介紹了一些基礎(chǔ)閃色的設(shè)定,如有其他顏色可以在評(píng)論區(qū)里補(bǔ)充。
至于脈沖,后期也會(huì)專門提溜出一期來說。
如果對(duì)你有用的話請(qǐng)多多轉(zhuǎn)發(fā)哦!感謝大家的支持!