Sunday, June 24, 2018

Unity_魔術方塊教學軟體

當兵暑假可以完成哪些事情呢



拿起你的鱷魚皮小冊子,開始想辦法把魔術方塊轉成二維陣列,ㄏㄏ抽到密碼通譯兵,教官還以為我要抄密碼出去xd


,加上專題老師的要求魔術方塊教學軟體,老師看到了新聞說什麼日本教授透過手機拍照解魔術方塊,所以他想要做這個專題,還是硬接下來`,幾乎都是都是python呢,我們來用c#硬上吧xd
20141127 Taipei.py - PyCuber 用Python解魔術方塊

新增


修正一些bug,然後基於8355法去解魔術方塊
2.3實作內容
l   如何根據影像讀入魔術方塊
l   如何自動尋找魔術方塊解法
l   3D畫面呈現與動畫
l   把解法分層解法,並希望剛接觸的人也可以輕易把魔術方塊解出來
l   探討並分析,和其他人解法有何不同

三、原理與分析
3.1
讀魔術方塊顏色到電腦
將手上的魔術方塊狀態輸入到APP以便讓APP可以運算解答並用來教學,而魔術方塊顏色的讀入,可使用Unity直接引用OpenCV或者在Android封裝時順便將OpenCV包進去。但因這部份比較繁瑣,所以本專題採用簡單的圖形偵測方式,首先,把圖片進行邊緣化偵測後會得到一個白色外框矩形,(2)左方是取樣魔術方塊如(2)右邊的其中一面,圖上9個點是取樣的像素,用來判讀其顏色,就可取得魔術方塊的四個角落,再依比例就可以得到9塊區域的中心點,在對中心點做顏色的取樣,在背景雜訊不多時效果很好。
2. 色彩辨識
3.2 選擇魔術方塊解法
這邊解法使用台灣人許技江老師所發明,分為8底、3邊、5邊,而最後的5呢是基於工作區特殊的加一減一依序作左上右下或者下左上右,不管做幾次6次底層一定會回復到原先樣子,有這樣特性就可以來更換最後的五角完成魔術方塊。
3.3 自動尋解與教學
本專題的魔術方塊解答方式,以實作許技江老師所發明的8355法,8355法的特點是不用死背公式而是用理解的方式來解出魔術方塊,初學者可以快速上手,且不易忘記。


a.上層十字






b.工作區


c.底層十字
d.五角歸位
3  8355


4.魔術方塊轉換成2維陣列
       

5.魔術方塊向右旋轉2維陣列結果





3.4自動尋解:
(3)8355法的一些情形。(3c)的情況可使用(3b)工作區來進行邊塊和角塊的對調,最後的(3d)使用加一減一的算法來把最後五角歸位。
接下來就是把魔術方塊上各顏色的位置作轉換,成為比較好處理的二維陣列。一個立方空盒攤開後會有六個面,而魔術方塊為一個六面的立方體,亦可以類似地將其六面數位化。(4)為數位化的魔術方塊,其中的05數值分別代表六種顏色。
在對紅色一面如(5)所示,進行90度左右旋轉的時候,可以知道旋轉紅色面的話則會牽動到灰色區塊一併要進行旋轉,到這邊的時候魔術方塊已經可以用來判斷哪一面哪一點的顏色了。      
有了上面這些資訊,在做自動尋解的過程中,就只要先找到目標方塊在哪一面哪一點,然後把依照8355法或者其他解法,將方塊進行90度左右旋轉,把目標方塊轉至定位即可完成自動尋解這功能。





7.小方塊組成大方塊


3.5 3D畫面呈現
           在畫魔術方塊的時候我們採用Unity內建的3D矩形組合成(6)的這麼大的魔術方塊供需要273D矩形,所以只要把用先把位置弄出來,我們再依序把273D矩形放入到相對應位置,再配合3.4自動尋解中所提到的二維陣列就可以畫出一顆完整的魔術方塊。
3.6動畫的呈現
如圖6所示
程式碼去呼叫IEnumerator介面函數時,會先去執行裡面的函數,當遇到yield return 0;則暫時返回呼叫它的原先程式。Start()繼續往下做其他事情,Nowplay()則會繼續執行直到沒遇到yield return 0;則結束 IEnumerator ,將用這些函數來做畫面更新及延遲。
方塊旋轉
哪一面共包含哪九塊小方塊,這些在程式中已經配置好,如果我要對第0面進行旋轉,則第0面所牽動的九塊小方塊將會一併跟著旋轉,在旋轉的過程中,會呼叫旋轉函數並計算九個小方塊旋轉的角度,然後利用上面函數StartCoroutine來進行畫面的延遲及更新,將角度慢慢增加或減少,以呈現動畫。