本實用新型涉及一種三階魔方虛擬系統(tǒng)的動作采集單元。
背景技術(shù):
魔方,也稱魯比克方塊,是一種娛樂玩具,由厄爾諾·魯比克(Erno Rubik)教授發(fā)明魔方,作為一種幫助學生增強空間思維能力的教學工具。魔方復原指魔方從非原始狀態(tài)到原始狀態(tài)的過程,是一個集觀察、動手和想象于一體的過程,可以很好地培養(yǎng)人的動手、動腦能力、訓練記憶力、空間想象力和判斷力。
很多青少年在剛接觸魔方的時候,被其設計的精巧和趣味性所吸引,魔方變化數(shù)非常龐大,例如三階魔方的變化數(shù)為:43,252,003,274,489,856,000,但也被總結(jié)出很多還原方法,包括層先法、角先法、橋式方法、CFOP法、棱先法等等。
傳統(tǒng)學習解魔方的方法都比較晦澀難懂,對初學者來說不太容易理解,光靠文字描述很難說清楚,口口相傳費時費力??焖購驮Х绞呛芏嗄Х綈酆谜叩睦硐?,然而,實體魔方在復原過程中手速快速、隨機性,重復再現(xiàn)難,觀摩學習困難。
中國專利文獻CN103394191A公開了一種電子三階魔方比賽系統(tǒng),包括數(shù)據(jù)采集模塊、無線通信模塊、數(shù)據(jù)處理模塊、和虛擬魔方演示模塊,可使觀眾清楚地觀看選手還原魔方的的步驟,提高了比賽的觀賞性。
在上述電子魔方中,數(shù)據(jù)采集模塊集成于真實魔方內(nèi)部,構(gòu)成動作采集單元,用于采集真實魔方的體位變化和旋轉(zhuǎn)的數(shù)據(jù),通過數(shù)據(jù)處理模塊轉(zhuǎn)化為虛擬魔方的控制信號,并在虛擬魔方演示模塊上實現(xiàn)虛擬魔方的同步控制,進而能夠復原魔方操作步驟。
然而上述虛擬魔方在每次玩魔方復原游戲時,魔方需要事先打亂,由于數(shù)據(jù)采集模塊集成于真實魔方內(nèi)部,虛擬魔方和真實魔方是一一對應的,按照預定的顏色配置來打亂魔方需要花費大量精力,給魔方復原教學帶來不便。
技術(shù)實現(xiàn)要素:
本實用新型的目的在于提供一種三階魔方虛擬系統(tǒng)的動作采集單元,以方便魔方復原教學。
為此,本實用新型提供了一種三階魔方虛擬系統(tǒng)的動作采集單元,用于向三階魔方模型的九個旋轉(zhuǎn)對象提供旋轉(zhuǎn)指令,包括三個六軸陀螺儀和信號處理模塊,其中,所述六軸陀螺儀用于將自身的翻轉(zhuǎn)動作轉(zhuǎn)為檢測信號,所述信號處理模塊用于對所述三個六軸陀螺儀的檢測信號進行采集并且將所述檢測信號轉(zhuǎn)為旋轉(zhuǎn)指令,其中,每個所述六軸陀螺儀提供三個旋轉(zhuǎn)對象的旋轉(zhuǎn)指令。
進一步地,上述六軸陀螺儀為MPU-6000傳感器。
進一步地,上述信號處理模塊為Arduino UNO板,用于對三個MPU-6000傳感器進行片選并且將片選后的MPU-6000的檢測信號轉(zhuǎn)化為相應旋轉(zhuǎn)對象的旋轉(zhuǎn)指令。
進一步地,上述三階魔方虛擬系統(tǒng)的動作采集單元還包括魔方顏色配置單元,用于三階魔方模型的表面顏色的初始配置,包括與所述Arduino UNO板信號連接的顏色采集模塊。
進一步地,上述顏色采集模塊為六個按鍵。
根據(jù)本實用新型的三階魔方虛擬系統(tǒng)的動作采集單元,采用了三個六軸陀螺儀代替真實魔方來采集復原動作,使得三階虛擬魔方顏色的初始配置無需依賴對真實魔方的動作檢測,滿足隨意打亂魔方的要求。
除了上面所描述的目的、特征和優(yōu)點之外,本實用新型還有其它的目的、特征和優(yōu)點。下面將參照圖,對本實用新型作進一步詳細的說明。
附圖說明
構(gòu)成本申請的一部分的說明書附圖用來提供對本實用新型的進一步理解,本實用新型的示意性實施例及其說明用于解釋本實用新型,并不構(gòu)成對本實用新型的不當限定。在附圖中:
圖1是根據(jù)本實用新型一實施例的三階魔方虛擬方法的流程圖;
圖2是根據(jù)本實用新型另一實施例的三階魔方虛擬方法的流程圖;
圖3是根據(jù)本實用新型一實施例的三階魔方虛擬系統(tǒng)的結(jié)構(gòu)框圖;
圖4是根據(jù)本實用新型的三階魔方模型的示意圖;
圖5是根據(jù)本實用新型的三階魔方模型的六個表面的標記圖;
圖6是根據(jù)本實用新型的三階魔方模型的三維坐標圖;
圖7是根據(jù)本實用新型一實施例的三階魔方虛擬系統(tǒng)中動作采集單元的結(jié)構(gòu)示意圖;
圖8是根據(jù)本實用新型的動作采集單元中的一個六軸陀螺儀執(zhí)行的三個旋轉(zhuǎn)指令的示意圖;
圖9是根據(jù)本實用新型的動作采集單元的動作指令的采集流程圖;
圖10是根據(jù)本實用新型一實施例的三階魔方虛擬系統(tǒng)的魔方顏色配置單元的結(jié)構(gòu)示意圖;
圖11是根據(jù)本實用新型的三階魔方模型的各表面的顏色配置順序圖;
圖12是根據(jù)本實用新型一實施例的三階魔方虛擬系統(tǒng)的工作流程圖;
圖13示出了根據(jù)本實用新型的三階虛擬魔方游戲界面,其魔方游戲處于開始狀態(tài);
圖14示出了根據(jù)本實用新型的三階虛擬魔方游戲界面,其中魔方處于打亂狀態(tài);
圖15示出了根據(jù)本實用新型的三階虛擬魔方游戲界面,其中魔方處于復原操作狀態(tài);以及
圖16示出了根據(jù)本實用新型的三階虛擬魔方游戲界面,其中魔方游戲處于結(jié)束狀態(tài)。
具體實施方式
需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。下面將參考附圖并結(jié)合實施例來詳細說明本實用新型。
圖1至圖16示出了根據(jù)本實用新型的一些實施例。
在一實施例中,如圖1所示,三階魔方虛擬方法包括以下步驟:
S11、建立三階魔方模型并且按照選定的視角在顯示界面上顯示,其中,將三階魔方模型配置為按照3*3*3方式堆積的27個立方體,將暴露在外的立方體表面按照真實魔方顏色進行配置,并令三階魔方模型中的頂層、左面、繞Y軸、中間層xoy、中間層yoz、前面、底層、右面和繞X軸這九個旋轉(zhuǎn)對象接收外部旋轉(zhuǎn)指令;
S13、利用動作采集單元向所述三階魔方模型提供所述九個旋轉(zhuǎn)對象的旋轉(zhuǎn)指令;以及
S15、使三階魔方模型在接收所述旋轉(zhuǎn)指令后對所述旋轉(zhuǎn)對象及其表面顏色進行整體旋轉(zhuǎn),并且在所述顯示界面上實時顯示。
根據(jù)本實用新型的三階魔方虛擬方法,三階魔方模型構(gòu)造成僅需要九個旋轉(zhuǎn)指令即可實現(xiàn)魔方復原操作,使得三階虛擬魔方顏色的初始配置無需依賴對真實魔方的動作檢測,滿足隨意打亂魔方的要求。
在一實施例中,如圖2所示,三階魔方虛擬方法包括如下步驟:
S11、建立三階魔方模型并且按照選定的視角在顯示界面上顯示,其中,將三階魔方模型配置為按照3*3*3方式堆積的27個立方體,將暴露在外的立方體表面按照真實魔方顏色進行配置,并令三階魔方模型中的頂層、左面、繞Y軸、中間層xoy、中間層yoz、前面、底層、右面和繞X軸這九個旋轉(zhuǎn)對象接收外部旋轉(zhuǎn)指令;
S12、對三階魔方模型的表面顏色進行初始配置,即按照要求打亂。
S13、利用動作采集單元向所述三階魔方模型提供所述九個旋轉(zhuǎn)對象的旋轉(zhuǎn)指令;以及
S15、使三階魔方模型在接收所述旋轉(zhuǎn)指令后對所述旋轉(zhuǎn)對象及其表面顏色進行整體旋轉(zhuǎn),并且在所述顯示界面上實時顯示。
根據(jù)本實用新型的三階魔方虛擬方法,三階魔方模型構(gòu)造成僅需要九個旋轉(zhuǎn)指令即可實現(xiàn)魔方復原操作,使得三階虛擬魔方顏色的初始配置無需依賴對真實魔方的動作檢測,滿足隨意打亂魔方的要求,通過在游戲開始前設置三階魔方模型的表面顏色的初始配置,滿足魔方復原游戲的要求,提高打亂設置的效率。
在一實施例中,如圖3所示,三階魔方虛擬系統(tǒng)包括建模處理單元30,用于建立三階魔方模型,其中,三階魔方模型配置為按照3*3*3方式堆積的27個小立方體,將暴露在外的小立方體表面按照真實魔方顏色配置,并令三階魔方模型中的頂層、左面、繞Y軸、中間層xoy、中間層yoz、前面、底層、右面和繞X軸這九個旋轉(zhuǎn)對象接收外部旋轉(zhuǎn)指令;顯示單元40,用于按照選定的視角顯示所建立的三階魔方模型;以及動作采集單元,包括動作采集傳感器10和信號處理模塊20,用于向所述三階魔方模型提供所述九個旋轉(zhuǎn)對象的旋轉(zhuǎn)指令,其中,所述建模處理單元30用于根據(jù)接收到的旋轉(zhuǎn)指令對相應的旋轉(zhuǎn)對象及其表面顏色進行旋轉(zhuǎn),并且在所述顯示單元上實時顯示。
下面對三階魔方的設計實例加以說明。
1、三階魔方模型設計
它是三階魔方虛擬方法中的關鍵技術(shù)問題之一。雖然三階魔方整體上是一個立方體,但是由于各個面都要能夠轉(zhuǎn)動,因此,實際上魔方可以看作是由27個小立方體按照3*3*3的規(guī)格堆砌起來的。其中,最中間的小立方體的六個面沒有顏色,將堆砌形成的大立方體的前面填充紅色,后面填充橘色,左面填充白色,右面填充黃色,頂面填充藍色,底面填充綠色,小立方體其余沒有填充顏色的面可以全都填充黑色,最中心的無色小立方體也可以一同填充上黑色。據(jù)此建立的有顏色三階魔方模型如圖4所示。
如圖4和圖5所示,三階魔方能夠旋轉(zhuǎn)頂層(up)、底層(down)、左邊的一層(left)、右邊的一層(right)、前面的一層(front)、后面的一層(back),用英文大寫字母表示就是U、D、L、R、F、B。除此之外只旋轉(zhuǎn)一層的話我們還可以旋轉(zhuǎn)魔方中間層,若以魔方的中心為原點o,建立oxyz三維坐標系的話,旋轉(zhuǎn)的中間層有xoy面所在層、yoz面所在層、xoz面所在層三種,此外,在魔方游戲中,還需要魔方整體旋轉(zhuǎn)。
上述三階魔方模型的旋轉(zhuǎn)方向過多,成為魔方虛擬化的一個難題,本實用新型將魔方的旋轉(zhuǎn)對象限定為9個,進而大幅簡化了魔方虛擬化的技術(shù)難度。雖然魔方可以順時針旋轉(zhuǎn),逆時針旋轉(zhuǎn),為簡明起見,對三階魔方模型的旋轉(zhuǎn)操作進行如下限定:
(1)每次單層旋轉(zhuǎn)以順時針90度為一個單位,如果要進行逆時針旋轉(zhuǎn),則可以通過順時針旋轉(zhuǎn)270度來實現(xiàn)。
(2)在旋轉(zhuǎn)魔方的表面時,需要旋轉(zhuǎn)的五個面分別是頂層(up)、底層(down)、左邊的一層(left)、右邊的一層(right)、前面的一層(front),用英文大寫字母表示就是U、D、L、R、F。對于旋轉(zhuǎn)后面(B)就可以使用整體繞y軸順時針旋轉(zhuǎn)180度,這樣將后面旋轉(zhuǎn)到了前面然后這時候在使用前面(F)層的單層旋轉(zhuǎn),就可以完成B的旋轉(zhuǎn)了。
(3)兩層兩層旋轉(zhuǎn)可以用單層旋轉(zhuǎn)來實現(xiàn),比如先轉(zhuǎn)一個表面層,再轉(zhuǎn)一個中間層,三個中間層只需要其中兩個面向前方組成十字的兩個分別為xoz層和yoz層,對于xoy層的旋轉(zhuǎn)只需整體繞y軸逆時針旋轉(zhuǎn)90度,然后再進行yoz中間層的旋轉(zhuǎn)就可以實現(xiàn)了。中間層的旋轉(zhuǎn)被用在兩層一起旋轉(zhuǎn)的情況時,配合六個表面來使用。
(4)三層的旋轉(zhuǎn)就是魔方(三階魔方)的整體旋轉(zhuǎn)了,要想觀察到魔方的六個面的顏色塊分布狀況,只需要兩種旋轉(zhuǎn)方式:整體繞y軸向左逆時針的旋轉(zhuǎn)和整體繞x軸向后順時針的旋轉(zhuǎn)。
如此,僅需要頂層、左面、繞Y軸、中間層xoy、中間層yoz、前面、底層、右面和繞X軸這九個旋轉(zhuǎn)對象的旋轉(zhuǎn)指令即可實現(xiàn)魔方的復原操作。
本實用新型采用三個動作采集傳感器實現(xiàn)三階魔方的9個獨立旋轉(zhuǎn)動作的采集,該旋轉(zhuǎn)動作采集傳感器優(yōu)選為MPU-6000六軸陀螺儀,每個六軸陀螺儀采集三個旋轉(zhuǎn)動作,結(jié)合參照圖7和圖8,三個動作采集傳感器分別采集的旋轉(zhuǎn)動作如下:
1#陀螺儀控制魔方的U(頂層)、L(左面)、Y(整體繞y軸向左逆時針旋轉(zhuǎn))旋轉(zhuǎn)。
2#陀螺儀控制魔方的兩個中間層xoz和yoz的旋轉(zhuǎn),還有一個F(前面)的旋轉(zhuǎn)。
3#陀螺儀控制魔方的D(底層)、R(右面)、X(整體繞x軸向后順時針旋轉(zhuǎn))旋轉(zhuǎn)。
一個動作采集模塊每被旋轉(zhuǎn)一次都是以順時針90度為單位,這樣使用三個MPU-6000動作采集模塊即可實現(xiàn)三階魔方的所有旋轉(zhuǎn)方式。
三個六軸陀螺儀與信號處理模塊信號連接,用于將三個六軸陀螺儀的采集信號轉(zhuǎn)化為旋轉(zhuǎn)指令。在一實施例中,信號處理模塊為Arduino UNO開發(fā)板。游戲設計中動作采集模塊使用了I2C總線,Arduino UNO板通過片選的方式讀取三個相同的動作采集模塊的數(shù)據(jù)。
對于MPU-6000模塊來說,要讀取它的數(shù)據(jù)時,只需將它的AD0引腳的電壓拉低即可。本實用新型中的游戲設計中如果需要讀取三個動作采集模塊其中一個的數(shù)據(jù)時,只需將其的AD0引腳的電壓拉低,同時把另外兩個MPU-6000模塊的AD0引腳電壓拉高,這樣Arduino板就可以讀取其中任意一個動作采集模塊采集的數(shù)據(jù)了。對于拉低拉高MPU-6000傳感器模塊的AD0引腳電壓問題,本實用新型的設計中使用Arduino UNO板的數(shù)字信號I/O接口與傳感器模塊的AD0引腳相連接,直接用Arduino UNO模塊來控制三個動作采集模塊的片選問題。
Arduino UNO與六軸陀螺儀模塊電路連接在圖3中示出,將三個六軸陀螺儀MPU-6000的SCL(串行時鐘線)接口SDA(串行數(shù)據(jù)線)接口與Arduino板塊的兩個模擬信號輸入接口(ANALOG IN)A4、A5相連接,六軸陀螺儀采集到人的旋轉(zhuǎn)動作數(shù)據(jù)后,通過I2C總線中的串行時鐘線(SCL)和串行數(shù)據(jù)線(SDA)傳送給Arduino板塊,Arduino板塊將數(shù)據(jù)按照一定算法處理后,通過串口通信傳給上位機。
在實際連接電路時,由于Arduino UNO的VCC接、GND接口、A5接口和A4接口無法同時連接三個傳感器的對應接口,在本實用新型中,借助于Arduino的擴展板實現(xiàn)電路的連接。
如圖9所示,動作采集單元的動作指令的采集流程順次如下:1、初始化三個MPU-6000片選接口為輸出引腳;2、設置波特率;3、初始化I2C總線;4、片選第一個MPU-6000芯片,讀取其數(shù)據(jù);5、片選第二個MPU-6000芯片,讀取其數(shù)據(jù);6、片選第三個MPU-6000芯片,讀取其數(shù)據(jù);7、將三組數(shù)據(jù)進行處理;8、結(jié)合前一次記錄的三組數(shù)據(jù)進行動作判斷;9、將采集動作指令序號上傳至上位機。
其中一個傳感器的數(shù)據(jù)處理代碼片段如下:
bx=bx/16384+1;//加1可以避免負號出現(xiàn)。
by=by/16384+1;
bz=bz/16384+1;//記錄下當前xyz三個方向的值。
if(bx==0){b1=0;}//將當前2號傳感器的x方向值記錄下來。
if(bx==2){b1=2;}
if(bx==1){
if(b1==0){Serial.write(6);}//如果傳感器2號的x方向值變?yōu)?,則想上位機上傳指令“6”,代表魔方前面順時針旋轉(zhuǎn)90度。
if(b1==2){Serial.write(4);}}//若是變?yōu)?則想上位機上傳指令“4”,表示xoz層順時針旋轉(zhuǎn)90度。
以上代碼實現(xiàn)了數(shù)據(jù)的處理,三個MPU-6000動作采集模塊一共要給上位機發(fā)送九個數(shù)字,這九個數(shù)字分別代表一種有效的旋轉(zhuǎn)動作。第一個MPU-6000傳感器模塊連接Arduino UNO的2號I/O接口,它用于采集三個動作信號,發(fā)給上位機三個數(shù)字指令,分別為“1”、“2”、“3”。第二個MPU-6000傳感器模塊連接Arduino UNO的4號I/O接口,它用于采集三個動作信號,發(fā)給上位機三個數(shù)字指令,分別為“4”、“5”、“6”。第三個MPU-6000傳感器模塊連接Arduino UNO的7號I/O接口,它用于采集三個動作信號,發(fā)給上位機三個數(shù)字指令,分別為“7”、“8”、“9”。所有旋轉(zhuǎn)動作的初始狀態(tài)都是MPU-6000傳感器模塊面朝上放置。
“1”表示Up,即將虛擬魔方圖像的頂層順時針旋轉(zhuǎn)90度,它對應采集的旋轉(zhuǎn)動作是將第一個傳感器模塊繞x軸順時針向后旋轉(zhuǎn)90度并還原到初始狀態(tài)(如圖8所示)。
“2”表示Left,即將虛擬魔方圖像的左面順時針旋轉(zhuǎn)90度,它對應采集的旋轉(zhuǎn)動作是將第一個傳感器模塊繞x軸逆時向前旋轉(zhuǎn)90度并還原到初始狀態(tài)。
“3”表示Y,即將整個虛擬魔方圖像整體向左逆時針旋轉(zhuǎn)90度,它的作用是便于玩家觀察魔方各個面的顏色分布狀態(tài),對應采集的旋轉(zhuǎn)動作是將第一個傳感器模塊繞z軸逆時針向左旋轉(zhuǎn)90度并還原到初始狀態(tài)。
“4”表示xoz,即將虛擬魔方圖像的前面的橫向中間層(xoz層)順時針旋轉(zhuǎn)90度,它對應采集的旋轉(zhuǎn)動作是將第二個傳感器模塊繞x軸逆時針向前旋轉(zhuǎn)90度并還原到初始狀態(tài)。
“5”表示yoz,即將虛擬魔方圖像的前面的縱向中間層(yoz層)順時針旋轉(zhuǎn)90度,它對應采集的旋轉(zhuǎn)動作是將第二個傳感器模塊繞x軸順時針向后旋轉(zhuǎn)90度并還原到初始狀態(tài)。
“6”表示Front,即將虛擬魔方圖像的前面順時針旋轉(zhuǎn)90度,它對應采集的旋轉(zhuǎn)動作是將第二個傳感器模塊繞z軸順時針向右旋轉(zhuǎn)90度并還原到初始狀態(tài)。
“7”表示Down,即將虛擬魔方圖像的底層順時針旋轉(zhuǎn)90度,它對應采集的旋轉(zhuǎn)動作是將第三個傳感器模塊繞z軸逆時針向左旋轉(zhuǎn)90度并還原到初始狀態(tài)。
“8”表示Right,即將虛擬魔方圖像的右面順時針旋轉(zhuǎn)90度,它對應采集的旋轉(zhuǎn)動作是將第三個傳感器模塊繞x軸順時針向后旋轉(zhuǎn)90度并還原到初始狀態(tài)。
“9”表示X,即將整個虛擬魔方圖像整體向后順時針旋轉(zhuǎn)90度,它的作用同Y一樣是便于玩家觀察魔方各個面的顏色分布狀態(tài),對應采集的旋轉(zhuǎn)動作是將第一個傳感器模塊繞z軸順時針向右旋轉(zhuǎn)90度并還原到初始狀態(tài)。
優(yōu)選地,利用Processing語言(計算機語言)來設計三維立體魔方,因為Processing語言繪圖時,有自身的oxyz三維坐標系,自帶建立三維點的Point()函數(shù)可以直接調(diào)用并設定其坐標,采用processing語言設計較方便。下面以Processing語言為例對三階魔方模型的設計加以說明。
基于以上模型分析,首先設計小立方體。本設計中將小立方設計成為一個Cube類,這個類中包含小立方體的位置position。雖然每個小立方體只有8個點坐標,但是由于繪制小立方體的時候,以面為單位,繪制一個面需要四個點坐標,所以繪制6個面需要有24個三維點坐標的值,Cube類中將這24個三維點坐標值存放在一個長度為24的PVector型一維數(shù)組vertices中。還有七種顏色紅、黃、橙、白、綠、藍、黑,他們存放在長度為7的color型一維數(shù)組faceColor中,用于建立小立方體時,給它們的各個面上色。還有長度l,它代表小立方體的邊長。六個面的坐標要在Cube類里面進行初始化,它們分別代表著前面、左面、右面、后面、頂面和底面,通過邊長來設定他們的坐標,以小立方體的中心點為坐標原點。結(jié)合參照圖6,下面是Cube類的定義:
class Cube{
PVector position;//三維量position用于存放小立方體的中心位置坐標。
PVector[]vertices=new PVector[24];//用于存放對應6個面的24個點坐標,雖然坐標會有重復,但是方便了drawCube()函數(shù)中小立方體面的繪制。
color[]faceColor=new color[7];//存放7種顏色紅、黃、橙、白、綠、黑。
float l;//小立方體的邊長l。
在Cube類中設計drawCube()函數(shù)用于小立方體的繪制。這個函數(shù)有六個整型參數(shù)fc、lc、rc、bac、tc、boc,它們分別表示前、左、右、后、頂、底各個面的顏色序號,序號的值將對應faceColor數(shù)組中的下標。在for循環(huán)中,一次繪制各個面的四個點,每繪制一個面時,都會根據(jù)參數(shù)中的序號進行上色。drawCube函數(shù)代碼設計如下:
void drawCube(int fc,int lc,int rc,int bac,int tc,int boc){//繪制小立方體。
for(int i=0;i<6;i++){
if(i==0){fill(faceColor[fc]);}//給小立方體的前面上色。
if(i==1){fill(faceColor[lc]);}//給小立方體的左面上色。
if(i==2){fill(faceColor[rc]);}//給小立方體的右面上色。
if(i==3){fill(faceColor[bac]);}//給小立方體的后面上色。
if(i==4){fill(faceColor[tc]);}//給小立方體的頂面上色。
if(i==5){fill(faceColor[boc]);}//給小立方體的底面上色。
beginShape(QUADS);
for(int j=0;j<4;j++){//調(diào)用每一個面的四個點來繪制對應的面。
vertex(vertices[j+4*i].x,vertices[j+4*i].y,vertices[j+4*i].z);}
endShape();}}
設計好小立方體類,在程序中就要建立27個相同大小的小立方體類。不僅如此,我們還要建立26個長度為6的數(shù)組來存放除了中心的小立方體以外的26個小立方體六個面的顏色序號。這樣我們在使用drawCube()函數(shù)繪制每一個小立方體時,不用一一設置它們的參數(shù),只需要調(diào)用它們對應的那個顏色數(shù)組即可。除了中心的小立方體,其余的26個立方體都要圍繞著中心塊,因此我們以中心的小立方體的位置position為原點o,以水平向右為x軸的正方向,以垂直x軸向下為y軸的正方向,以垂直xoy面向前為z軸正方向,建立oxyz坐標系。這樣坐標軸的方向與Processing默認的坐標軸方向相同,只是將原點移到了魔方的中心,更加方便確立魔方中各個小立方體的坐標。
小立方體邊長為l,相互間的間隔為s,每個小立方體position間的距離為s+l,將這個值賦給s,這樣我們就可以根據(jù)每個小立方體的position坐標來初始化繪制一個三階魔方了。因為構(gòu)成每個小立方體的8個點坐標是一樣的,只是每個小立方體的中心點坐標(position)不同。所以在繪制每一個小立方體時,都要先使用pushMatrix()函數(shù)將當前矩陣的數(shù)據(jù)全部存儲起來,然后使用translate()函數(shù),將坐標系的原點o轉(zhuǎn)換成當前小立方體的position值,接著再調(diào)用其對應的drawCube()進行繪制,最后繪制完后還要調(diào)用popMatrix()函數(shù)還原原點o的坐標,以便下一個小立方體的繪制。下面是頂層左下角小立方體的初始化繪制代碼片段:
pushMatrix();//將當前矩陣數(shù)據(jù)存儲起來。
translate(-s,-s,s);//將當前坐標原點移至頂層左下角位置。
cube[1].position.x=-s;//初始化cube[1].position為魔方頂層左下角。
cube[1].position.y=-s;
cube[1].position.z=s;
cube[1].drawCube(0,3,6,6,5,6);//top ceng//初始化繪制cube[1]。
popMatrix();//將當前矩陣數(shù)據(jù)恢復,坐標原點還原。
2、魔方的旋轉(zhuǎn)設計
本實用新型使用九個旋轉(zhuǎn)函數(shù):Up()、Left()、Y()、xoz()、yoz()、Front()、Down()、Right()、X()、Left()、Front()、Down()、Right()、和Up()比較類似,只是旋轉(zhuǎn)的中心小立方體的位置不同,發(fā)生旋轉(zhuǎn)的面不同,但是它們的基本思想都是類似的。
X()和Y()是將整個魔方進行旋轉(zhuǎn),除了在旋轉(zhuǎn)軸上的小立方體的坐標和顏色不用修改,其余的小立方體的坐標和顏色都要進行修改。xoz()函數(shù)是將魔方前面橫向第二層進行旋轉(zhuǎn),yoz()函數(shù)是將魔方前面縱向第二層進行旋轉(zhuǎn),它們的旋轉(zhuǎn)中心都不用更改,都是以中心的小立方體為旋轉(zhuǎn)中心。上面的這九個函數(shù)分別一一對應著Arduino UNO從串口發(fā)來的數(shù)據(jù)指令[9]。“1”對應Up()函數(shù),“2”對應Left()函數(shù)、“3”對應Y()函數(shù)、“4”對應xoz()、“5”對應yoz()函數(shù)、“6”對應Front()函數(shù)、“7”對應Down()函數(shù)、“8”對應Right()函數(shù)、“9”對應X()模塊。
(1)確定旋轉(zhuǎn)層
如果接受到串口傳來的指令“1”則跳入頂層順時針旋轉(zhuǎn)Up()函數(shù)。需要進行頂層旋轉(zhuǎn),要將當前中心原點坐標由中心的小立方體position坐標轉(zhuǎn)換為目前坐標位置中最上方的中心色塊的小立方體的位置。使用judgeUp()函數(shù),比較六個中心色塊的小立方體的position的y值,將y最小的那個小立方體的序號值返回。這樣找到了需要旋轉(zhuǎn)的中心的小立方體的position,用它的position值一一找出坐標在它四周的其余八個需要旋轉(zhuǎn)的小立方體的坐標,坐標確定了,對應坐標的小立方體也就找到了。
(2)設置旋轉(zhuǎn)角度
找到他們后,就要將它們進行旋轉(zhuǎn),頂層旋轉(zhuǎn)是繞著y軸的順時針旋轉(zhuǎn),但是如果直接進行rotateY(-PI/2),是無法觀察到魔方的旋轉(zhuǎn)過程的,只能看到魔方頂層的顏色發(fā)生了變化,而沒有旋轉(zhuǎn)過程,這樣整個虛擬游戲的效果就會大打折扣,玩家的游戲體驗會變差,所以,不能直接進行旋轉(zhuǎn)90度。要解決這個問題,代碼中需要加入一個角度變量a,它的初始值為0,使用rotateY(a),然后將a不斷的減小直至a<=-PI/2,這樣不斷的調(diào)用Up()函數(shù)直至a<=-PI/2時,將a還原為0。這樣圖像就會顯示出頂層順時針慢慢旋轉(zhuǎn)90度的過程。
(3)修改旋轉(zhuǎn)后的坐標
旋轉(zhuǎn)執(zhí)行完后,被旋轉(zhuǎn)的小立方體的坐標發(fā)生了變化,因此,要將這些position發(fā)生變化的小立方體記錄下來,在旋轉(zhuǎn)動作完成后,將它們的值進行修改。頂層旋轉(zhuǎn)不改變position.y只需要修改8個圍繞在旋轉(zhuǎn)中心四周的小立方體的position.x和position.z的值,將它們的position坐標值改為旋轉(zhuǎn)后的位置坐標值。
(4)修改旋轉(zhuǎn)后各個面的顏色
完成了旋轉(zhuǎn)動作并重新修改好各個小立方體的坐標值,就要將所有的小立方體進行重繪,這時就會發(fā)現(xiàn)旋轉(zhuǎn)后小立方體的位置變化了,但是六個面的顏色沒有發(fā)生變化。由于在魔方的一次旋轉(zhuǎn)中,不僅改變了小立方體的坐標,還改變了它的六個面的順序。比如魔方頂層順時針旋轉(zhuǎn)90度,發(fā)生旋轉(zhuǎn)的小立方體的前面變?yōu)樽竺妫竺孀優(yōu)楹竺?,后面變?yōu)橛颐?,右面變?yōu)榍懊妗P×⒎襟w自身的六個面發(fā)生了旋轉(zhuǎn)。考慮到修改vertices數(shù)組中的24值比較麻煩,所以代碼設計中直接對發(fā)生旋轉(zhuǎn)的小立方體自身各個面的顏色進行“旋轉(zhuǎn)”。若要將魔方的頂面單層順時針旋轉(zhuǎn)90度,頂層的小立方體的自身頂面和底面的顏色并沒有發(fā)生變化,只有前后左后四個面的顏色發(fā)生了變化,因此,代碼中只需要將小立方體對應的顏色數(shù)組中的前后左右四個面對應的顏色序號進行一定的交換。所以要實現(xiàn)魔方頂面單層順時針旋轉(zhuǎn)90度,就是將顏色數(shù)組中的前面的顏色序號換成右面,右面顏色序號換成后面,后面顏色序號換成左面,左面顏色序號換為最初前面顏色序號,當然還要對魔方中進行旋轉(zhuǎn)的小立方體的坐標進行變換。
在游戲設計中還要把需要進行旋轉(zhuǎn)的小立方體的序號記錄下來,在旋轉(zhuǎn)完成后,要對這些記錄中的小立方體進行變換。本文的游戲設計中使用rot[]數(shù)組存放旋轉(zhuǎn)小立方體的序號。
下面為頂層左下角的小立方體的坐標更改和顏色變換代碼:
cube[rot[0]].position.z=-s;//將頂層左下角的小立方體的坐標進行修改,修改為進行頂層旋轉(zhuǎn)后的位置坐標,即將它的坐標改為頂層左上角。
switch(rot[0]){//rot[0]里面記錄的是頂層左下角發(fā)生旋轉(zhuǎn)的小立方體的序號,由于這個小立方體是一個角塊,所以從對應的八個角塊里面選擇,序號是幾就對應修改幾號的顏色數(shù)組。
case 1:t=c1[0];c1[0]=c1[2];c1[2]=c1[3];c1[3]=c1[1];c1[1]=t;break;//修改角塊1。顏色數(shù)組中存放的各個面的顏色序號順序是:前左右后上下,頂層旋轉(zhuǎn)將前面換為右面,右面換為后面,后面換為左面,左面換為沒發(fā)生變換時的前面。
case 3:t=c3[0];c3[0]=c3[2];c3[2]=c3[3];c3[3]=c3[1];c3[1]=t;break;
case 7:t=c7[0];c7[0]=c7[2];c7[2]=c7[3];c7[3]=c7[1];c7[1]=t;break;
case 9:t=c9[0];c9[0]=c9[2];c9[2]=c9[3];c9[3]=c9[1];c9[1]=t;break;
case 18:t=c18[0];c18[0]=c18[2];c18[2]=c18[3];c18[3]=c18[1];c18[1]=t;break;
case 20:t=c20[0];c20[0]=c20[2];c20[2]=c20[3];c20[3]=c20[1];c20[1]=t;break;
case 24:t=c24[0];c24[0]=c24[2];c24[2]=c24[3];c24[3]=c24[1];c24[1]=t;break;
case 26:t=c26[0];c26[0]=c26[2];c26[2]=c26[3];c26[3]=c26[1];c26[1]=t;break;
default:break;}
在一實施例中,如圖10所示,魔方顏色配置單元用于三階魔方模型的表面顏色的初始配置,包括顏色采集模塊和信號處理模塊,該顏色采集模塊優(yōu)選為六個按鍵,信號處理模塊優(yōu)選為Arduino UNO開發(fā)板。
其中,六個按鍵分別對應魔方的紅色、橙色、藍色、綠色、黃色和白色,六個按鍵分別連接到Arduino的14個數(shù)字信號I/O接口中的6個上。它們分別是Pin2、Pin4、Pin7、Pin8、Pin12和Pin13在需要利用按鍵輸入魔方顏色時,只需要按下對應該顏色的按鍵,即可向Arduino開發(fā)板輸入數(shù)據(jù),Arduino通過接受到的數(shù)據(jù)判斷按下的是哪個按鍵,如果是按下第一個按鍵,則向Processing輸出0,代表紅色,如果按下第二個按鍵,則輸出1,代表黃色,其余四個按鍵分別輸出2、3、4、5,代表橙色,白色,綠色和藍色。
在一實施例中,如圖11所示,在本實用新型中顏色的輸入順序為上->下->左->右->前->后。每一面的輸入順序為:上面:先沿Y增大的方向,再沿著X增大的方向進行輸入;下面:先沿Y增大的方向,再沿著X減小的方向進行輸入;左面:先沿Z增大的方向,再沿著X增大的方向進行輸入;右面:先沿Z減小的方向,再沿著X增大的方向進行輸入;前面:先沿Y增大的方向,再沿著Z減小的方向進行輸入;后面:先沿Y增大的方向,再沿著Z增大的方向進行輸入。每一面的輸入順序為將該面朝上,從最左上角開始,一行一行輸入。
在其它實施例中,初始顏色配置可以從設定好的若干顏色配置模板中選擇。
在一實施例中,如圖12所示,三階魔方虛擬系統(tǒng)的工作流程依次如下:1、開始界面,如圖13所示,提供選定視角的三階魔方模型;2、對界面上的三階魔方模型進行打亂,打亂后的魔方如圖14所示;3、接下來讓玩家確定是否開始游戲,例如提供“Play”按鈕供玩家確定;4、接收串口動作指令;5、執(zhí)行對應旋轉(zhuǎn)動作,執(zhí)行后的結(jié)果如圖15所示;6、接下來讓玩家確定是否需要查看步驟提示,例如提供“提示”按鈕,當玩家查看步驟提示后轉(zhuǎn)入下一步或者不查看步驟提示直接轉(zhuǎn)入下一步;7、判斷是否復原魔方,若沒有,轉(zhuǎn)入步驟4,繼續(xù)接受串口動作指令,若復原,進入下一步;8、提供游戲完成界面,如圖16所示,統(tǒng)計游戲結(jié)果,轉(zhuǎn)入下一步驟:9、是否再來一局,若是返回開始界面,若否,結(jié)束游戲。
根據(jù)本實用新型的三階虛擬魔方系統(tǒng),能夠應用三階的解魔方仿真教學及訓練,在一實施例中,該系統(tǒng)包括對三階魔方進行數(shù)字圖像采集、對魔方進行軟件建模、顯示解魔方的步驟及演示圖像。首先,通過顏色傳感器將實體魔方的顏色等信息錄入到軟件系統(tǒng)中,接著通過將三階魔方視為3*3*3方式堆積的27個立方體,在系統(tǒng)中進行軟件建模,根據(jù)采集到的信息,給出解魔方的具體步驟的提示信息,并相應的改變軟件系統(tǒng)中的魔方的演示狀態(tài),達到分步驟教學的目的。使用者可以跟隨提示信息,操作手中的魔方,并與系統(tǒng)中的魔方進行對照。亦可通過動作采集器控制每一個面的旋轉(zhuǎn),直接操控軟件中的魔方模型。
動作采集器的使用方法具體描述如下:令三階魔方模型中的頂層、左面、繞Y軸、中間層xoy、中間層yoz、前面、底層、右面和繞X軸這九個旋轉(zhuǎn)對象接收外部旋轉(zhuǎn)指令。這九個旋轉(zhuǎn)動作指令分別對應的是No1、No2和No3加速度傳感器的三個方向的變化,既從水平變化到向左側(cè)翻轉(zhuǎn)90度、從水平變化到向前翻轉(zhuǎn)90度和從水平變化到向后翻轉(zhuǎn)90度。這九個面接收外部旋轉(zhuǎn)指令;利用動作采集單元向所述三階魔方模型提供所述九個面的旋轉(zhuǎn)指令;以及使三階魔方模型在接收所述旋轉(zhuǎn)指令后對所述旋轉(zhuǎn)對象及其表面顏色進行整體旋轉(zhuǎn),并且在所述顯示界面上實時顯示。在本實用新型中,三階魔方模型構(gòu)造成僅需要九個旋轉(zhuǎn)指令即可實現(xiàn)魔方復原操作,滿足隨意打亂魔方的要求。
訓練功能:當要測試其學習成果時,可以使用該系統(tǒng)進行競賽。該系統(tǒng)包含隨意打亂功能、接收動作采集器的命令來控制三階魔方模型的功能、計時功能和判斷是否結(jié)束功能。
以上所述僅為本實用新型的優(yōu)選實施例而已,并不用于限制本實用新型,對于本領域的技術(shù)人員來說,本實用新型可以有各種更改和變化。凡在本實用新型的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本實用新型的保護范圍之內(nèi)。