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