[英]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軸上旋轉頂部的詳細顯示。
第一個坐標塊是初始立方體面。 (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.