用DirectX實現魔方(一)

2021-09-22 06:03:06 字數 1823 閱讀 3106

魔方英文名字叫做rubik's cube,是由匈牙利建築學教授和雕塑家ernő rubik於2023年發明,最初叫做magic cube(這大概也是中文名字的來歷吧),2023年ideal toys公司開始銷售此玩具,並將名字改為rubik's cube。

魔方在80年代最為風靡,至今未衰。截至2023年1月,魔方在全世界已經售出了3億五千多萬個。最常見的魔方是三階魔方,由27個小方塊構成,共三層,每層9個小方塊。我的demo實現的就是三階魔方。其他的魔方種類有二階,四階及更高階,也有鑽石魔方,五邊形魔方,三角魔方等。

三階魔方所有可能的排列數是43252003274489856000,這個數實在是太大了,用中文不知道該如何表達。可以打乙個比方,如果有這麼多個三階魔方,那麼可以覆蓋地球表面275次!

程式採用c/c++語言+directx 9.0編寫,用的還是固定管線api,因為我對shader不太熟悉,稍後有空學習一下可以出個shader版本。也可能移植到directx 11上,就算是練練手吧。這個demo涉及的技術有以下幾個方面。

俗話說得好,有圖有真相!先來個透視照(線框圖)

然後來個素顏照(實體未貼圖)

再來個有貼圖的(穿上衣服後,好看多了),魔方的顏色採用國際標準配色。

旋轉某一層

打亂順序

起初,模型採用的是directx的.x檔案格式,現在.x格式已經被微軟拋棄了,儘管你仍然可以使用它,但是在directx 11中,已經沒有支援.x檔案的介面了。要使用.x檔案,只能使用舊版本的directx sdk或者用第三方庫。由於魔方對應的幾何模型比較簡單,就是立方體,所以就乾脆不用.x檔案了,直接畫,乙個完整的魔方由27個小的立方體構成,所以如果能繪製乙個小立方體,那麼就可以繪製27個,拼成乙個完整的魔方。

關於貼圖,開始用的是紋理,後來簡化了一下,直接在記憶體中生成紋理,因為單色的,而且只有六種顏色,並不麻煩。動態生成的乙個好處是發布程式的時候也不同發布紋理了,只有乙個可執行檔案。

旋轉魔方是通過滑鼠拖拽來完成的,分為如下兩個部分:

前者通過變換視角來完成,實現採用arcball技術,arcball有很多優點,相比尤拉角來說,arcball更加平滑,而且沒有抖動現象(這個本質是因為arcball裡面採用的是quaternion)。變換視角而不是通過旋轉魔方本身的好處是

後者通過旋轉模型本身來實現,因為變換視角會影響場景中的所有模型,而旋轉某一層要保證其他層不動,所以只能旋轉模型本身,因為將魔方拆成了27個小的cube。這對於只操作某些部分而維持其他部分不變是十分方便的。旋轉某一層的方法如下

主要有如下幾個類及檔案

用DirectX實現魔方(一)

魔方英文名字叫做rubik s cube,是由匈牙利建築學教授和雕塑家ern rubik於1974年發明,最初叫做magic cube 這大概也是中文名字的來歷吧 1980年ideal toys公司開始銷售此玩具,並將名字改為rubik s cube。魔方在80年代最為風靡,至今未衰。截至2009年...

用DirectX實現魔方(一)

魔方英文名字叫做rubik s cube,是由匈牙利建築學教授和雕塑家ern rubik於1974年發明,最初叫做magic cube 這大概也是中文名字的來歷吧 1980年ideal toys公司開始銷售此玩具,並將名字改為rubik s cube。魔方在80年代最為風靡,至今未衰。截至2009年...

用DirectX實現粒子系統(三)

引言 前面說了,乙個複雜的現象是由若干個基本單元構成的,所以,我們最先定義這個基本單元 粒子,乙個粒子主要有哪些屬性呢?由上面的圖可知,首先粒子是有顏色的,上面一共有白,紅,黃,綠四種顏色的粒子。其次,粒子是有大小的,只有大小不同的粒子相互組合才能構成特殊的漸進效果。再次粒子也是有紋理的,比如上面的...