簡體   English   中英

在C ++中使用opengl旋轉rubik立方體面的問題

[英]Issues with rotating rubik cube faces using opengl in C++

我必須設計功能實用的魔方作為作業的一部分。 我不是直接使用openGL,而是提供了一個框架。 所有不屬於openGL且在此處未列出其主體的函數都將被假定為正確

功能:如果通過按鍵選擇所有面部,則需要旋轉所有面部。 整個立方體必須旋轉。

整個多維數據集的旋轉是正確的,不會成為此問題的主題。

為了做到這一點,我從27個較小的多維數據集(多維數據集大小為3)以及一個三維數組中創建了rubik多維數據集。 包含小型多維數據集索引的多維數據集的副本。 為了更好地理解這一點:

如果最初一張臉是:

0 1 2
3 4 5
6 7 8 

輪換后應該是:

6 3 0
7 4 1
8 5 2

我可以將立方體相對於X軸或Y軸旋轉無限次,並且可以完美地工作。 但是,如果我組合旋轉(以隨機方式將X旋轉與Y旋轉交替),則會出現立方體變形的情況。 由於這種情況不一致,因此我很難找到原因。

這就是我創建多維數據集的方式:

int count = 0;

for (int i = -1; i < 2; i++)
    for(int j = -1; j < 2; j++)
        for(int k = -1; k < 2; k++)  {
            RubikCube.push_back(drawCube());
            RubikCube.at(count)->translate(4*i,4*j,4*k);
            CubIndici[j+1][k+1][i+1] = count;

            count++;
        }

函數drawCube()有效地繪制一個大小為4的立方體,其中心位於原點。 CubIndici是用於存儲多維數據集位置的3D數組。

這是我用來旋轉3D陣列中的矩陣的函數。 (我已經對其進行了仔細檢查,因此應該是正確的,但是也許我遺漏了一些東西)。

void rotateMatrix(int face_index, int axis) {
    if (axis == 0 ) 
    {
            for ( int i = 0; i < 3; i++)
                for( int j = i; j < 3; j++) 
                 {
                      swap(&CubIndici[i][j][face_index],&CubIndici[j][i][face_index]);
                 }
            for (int i = 0; i < 3; i++)
                for(int  j = i; j < 3; j++) 
                 {
                     swap(&CubIndici[i][j][face_index],&CubIndici[2-i][j][face_index]);
                 }
    }

        if (axis == 1 ) 
    {
            for ( int i = 0; i < 3; i++)
                for( int j = i; j < 3; j++) 
                 {
                      swap(&CubIndici[face_index][i][j],&CubIndici[face_index][j][i]);
                 }
            for (int i = 0; i < 3; i++)
                for(int  j = i; j < 3; j++) 
                 {
                     swap(&CubIndici[face_index][i][j],&CubIndici[face_index][2-i][j]);
                 }
    }
}

CubIndici 3d數組是全局數組,因此我需要axis參數來確定要執行哪種旋轉(相對於X,Y或Z)

按下w鍵時,我應該繞X軸旋轉(目前為硬編碼)面

for (int i = 0; i < 3; i++)
                for(int j = 0; j < 3; j++)
                    RubikCube.at(CubIndici[i][j][1])->rotateXRelativeToPoint(
                                          RubikCube.at(CubIndici[1][1][1])->axiscenter, 1.57079633);
            rotateMatrix(1,0);

CubIndici 1 1應該始終包含位於面CubIndici [*] [*] 1中心的多維數據集。

同樣的,

        for (int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                RubikCube.at(CubIndici[2][i][j])->rotateYRelativeToPoint(
                                          RubikCube.at(CubIndici[2][1][1])->axiscenter, 1.57079633);
        rotateMatrix(2,1);

用於在Y軸上旋轉。

1.57079633是90度的弧度等效

為了更好地理解,我添加了在X軸上旋轉左側和在Y軸上旋轉頂部的詳細顯示。

IMG

第一個坐標塊是初始立方體面。 (CubIndici索引矩陣未修改)

旋轉前-面部每個立方體的坐標和索引。 旋轉后-旋轉對象后的坐標和索引。 (旋轉矩陣后)(旋轉矩陣后)(未觸摸矩陣)。 如果將“旋轉前矩陣”與“旋轉后矩陣”的索引進行比較,您會發現旋轉90度。

這是第一次旋轉(將左面繞X旋轉),這是完全正確的。

但是,在下一輪旋轉時,應包含在頂部向下的面(以及左側面)中的多維數據集應為2,5,8。 但是,它們顯示為2,5,6。 如果您看一下第一個“后旋轉矩陣”,則2,5,8確實是第一行。

這是使立方體變形的問題,我不知道是什么原因導致的。

如果有任何不清楚的地方,請告訴我,我將編輯帖子或回復評論!

立方體切片中位於位置<x;y>的單元的PI / 2順時針旋轉公式為:

  x' = 2 - y
  y' = x

類似地,對於逆時針旋轉:

  x' = y
  y' = 2 - x

但是這些是旋轉,您想對數組進行就地修改。 我們可以通過2個鏡像對稱的組合來代替旋轉。

順時針:

  <x;y>  ->  <y;x> 
  <x;y>  ->  <2-x;y>

而逆時針方向則是這些功能的相反組成部分。

給定這些公式,您可以像這樣編寫旋轉函數:

 void rotateMatrix_X_CW(int face_index) {
     int i,j;  
     for ( i = 0; i < 2; i++)
         for( j = i; j < 3; j++) 
         {
             swap(CubIndici[i][j][face_index],CubIndici[2-i][j][face_index]);
         }
     for ( i = 0; i < 2; i++)
         for( j = i; j < 3; j++) 
         {
             swap(CubIndici[i][j][face_index],CubIndici[j][i][face_index]);
         }
 }

 void rotateMatrix_X_CCW(int face_index) {
     int i,j;  
     for ( i = 0; i < 2; i++)
         for( j = i; j < 3; j++) 
         {
             swap(CubIndici[i][j][face_index],CubIndici[j][i][face_index]);
         }
     for ( i = 0; i < 2; i++)
         for( j = i; j < 3; j++) 
         {
             swap(CubIndici[i][j][face_index],CubIndici[2-i][j][face_index]);
         }
 }

您應該能夠從那里實現其他軸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM