去年我在社區(qū)服務(wù)器轉(zhuǎn)悠的時候,看到了各種奇奇怪怪的實(shí)時信息顯示屏。因?yàn)橛X得既然花時間在這種東西上面,不如再做得花哨一點(diǎn),所以我當(dāng)晚做了一個用旋轉(zhuǎn)方塊做顯示條的電表,效果是這樣的:
(資料圖片)
下面我們來講解它的運(yùn)行原理。
1.空間坐標(biāo)和選取視圖
首先來講解向量的概念。顧名思義,向量就是有方向的量,比如畫一條數(shù)軸,正數(shù)x就是從原點(diǎn)起向正方向長度為x,負(fù)數(shù)-x就是向負(fù)方向長度為x。如果以同一個原點(diǎn)畫出多條數(shù)軸,分布在平面或者空間內(nèi),就形成了坐標(biāo)系,數(shù)軸即坐標(biāo)軸。其實(shí)坐標(biāo)系還有更多的內(nèi)容和要求,但不重要在坐標(biāo)軸上取向量,將其相加,可以得到坐標(biāo)系內(nèi)任意向量,這一過程可以看成是點(diǎn)平行于坐標(biāo)軸的位移,方向和長度由向量決定。
例如:
為方便計算,我們讓坐標(biāo)軸正交(兩兩垂直),這就是最常用的空間直角坐標(biāo)系。
然而三維的物體終究不能直接變成二維圖片,所以要選一個二維視圖去投影。
Mindustry中畫圖所用的是平面直角坐標(biāo)系,所以可以建立如下對應(yīng)關(guān)系。
設(shè)原坐標(biāo)為(x,y,z),投影后坐標(biāo)為(x',y')
則
也就是原來y軸投影到現(xiàn)在x軸上,原來z軸下移半個x再投影到現(xiàn)在y軸上。這樣我們就得到了一個點(diǎn)的坐標(biāo)。以此可以得到其他點(diǎn)坐標(biāo)。
2.極坐標(biāo)和旋轉(zhuǎn),圓變橢圓
可以看到我們的方塊兒是以豎直z軸為旋轉(zhuǎn)軸旋轉(zhuǎn)的,所以我們利用極坐標(biāo)系計算xOy平面上點(diǎn)的坐標(biāo)。
極坐標(biāo)系是基于旋轉(zhuǎn)構(gòu)造的坐標(biāo)系,極坐標(biāo)由極角θ(就是定向的旋轉(zhuǎn)角,數(shù)學(xué)等常用弧度制,計算機(jī)等常用角度制)和極徑r(就是半徑/距離)組成。要與直角坐標(biāo)系對應(yīng),那么結(jié)合三角函數(shù),得到
解析計算旋轉(zhuǎn)過程時,,ω即角速度,φ即初相(t = 0時θ的值)。
旋轉(zhuǎn)時點(diǎn)沿圓運(yùn)動,圓在一個方向上伸縮變換就成了橢圓。,可由橢圓性質(zhì)得證(我高三上課不聽課拿草稿紙證過這個)。是為橢圓的參數(shù)方程。
3.畫圖原理
第一條理論:平面內(nèi)的n邊形可以由n-2個三角形拼成。曲面可以微分成三角形。
第二條理論:投影后投影面內(nèi)遵循的幾何關(guān)系依然成立(平行、平分等)。
第三條理論:確定三個頂點(diǎn),就能確定一個三角形。
因此任何幾何體投影時,都可以看成是多個三角形的拼合。只要確定了所有頂點(diǎn),就能確定相應(yīng)的三角形。
在邏輯塊中寫入以下代碼
結(jié)果是這樣的
4.生成小方塊
生成小方塊的幾項(xiàng)參數(shù)由以下代碼獲取
pns表當(dāng)前電量,pnc表存儲上限,pni表發(fā)電量,pno表用電量。
注意:pni和pno是微分量,如需直觀顯示,需要在適當(dāng)長度的時間區(qū)間上積分。常量積分只需乘以區(qū)間長度即可。
當(dāng)前電量對應(yīng)的高度。而電量增量對應(yīng)的高度。
利用橢圓的參數(shù)方程,對方塊每條棱計算出
將θ旋轉(zhuǎn)到下個直角,對應(yīng)算出x2,y12,y22,y32,可以求出一個側(cè)面。
注意:對每個投影面,θ間相差π/2,即90°。
集成以下代碼
(沒測,可能有誤,實(shí)際意思到了即可)
注意:將這段代碼粘貼到其他地方時,需要修改jump到的對應(yīng)位置。
最后再加個頂。當(dāng)時,四個角的y坐標(biāo)均為相對的平移值,否則為相對的平移值。在任何情況下,四個角的x坐標(biāo)均相同
令,則
以1,3兩點(diǎn)為底上兩點(diǎn),2,4兩點(diǎn)為頂點(diǎn),畫兩個三角形,得到頂蓋。
5.θ的計算
上文講過,旋轉(zhuǎn)中,也就是說,θ取決于ω,t,φ三個量。
由于我們只看到旋轉(zhuǎn)方塊的兩個側(cè)面,所以θ取值區(qū)間長度僅需180°(π);進(jìn)一步地,在一側(cè)消失的側(cè)面將在另一側(cè)有一個全等的側(cè)面執(zhí)行相同的運(yùn)動過程,所以θ取值區(qū)間長度僅需90°(π/2)。
Mindustry的三角函數(shù)使用角度制,因此θ的取值如下寫
//jump到set ang -45下一行
其中,
6.亮暗面
這個部分是最簡單的了,只要調(diào)整亮度即可。因?yàn)椴恍枰粒灾灰淖冾伾珜?yīng)數(shù)值即可。
黃:r,g
綠:g
紅:r
數(shù)值越高,顏色越亮。頂面亮度固定為,側(cè)面亮度(l表示col取值區(qū)間半徑)
以上。
如果有其他旋轉(zhuǎn)需求,建立類似的坐標(biāo)系即可。
關(guān)鍵詞: