2013-05-07 134 views
0

所以我通過實現Prim的算法成功創建了我的迷宮。結果存儲在單元格的二維數組中,其中每個單元格都有一個北,南,東,西(代表4個不同的牆)。在opengl中渲染迷宮

我真正掙扎的部分是使用立方體渲染3D。每個立方體代表一堵牆,如果牆壁在那裏,我只想渲染立方體。下面是我目前的代碼,但它不能正常工作(導致太多的立方體被繪製/不存在的迷宮)。

任何幫助,將不勝感激。如果需要更多信息,請讓我知道,我會盡快發佈。

void Maze::drawMaze(vector<vector<Cell> > maze) {  
    for (int i = 0; i < 10; i++) { 
     for (int j = 0; j < 10; j++) { 
      if (maze[i][j].south == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2 - 2, 0, i * 2); 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
      if (maze[i][j].north == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2 + 2, 0, i * 2); 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
      if (maze[i][j].east == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2, 0, i * 2 + 2); 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
      if (maze[i][j].west == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2, 0, i * 2 - 2); 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
     } 
    } 
} 

這裏是我表現出正確的迷宮,只是無法弄清楚如何將其轉化爲正確的OpenGL的打印方法。

void Maze::PrintMaze(){ 
    for(int i = 0; i < 2*10; ++i){ 
     cout << "_"; 
    } 
    cout << endl; 
    for (int i = 0; i < 10; ++i){ 
     cout << "|"; 
     for (int j = 0; j < 10; ++j){ 
      Cell c = maze[i][j]; 
      cout << (c.south == 0 ? " " : "_"); 
      if (c.east == 0) 
       cout << " "; 
      else cout << "|"; 
     } 
     cout << endl; 
    } 
} 
____________________ 
| | | |_ | | | _ | 
| _|_ _ _ | |_| 
|  _|_ |_ | | 
| |_| | |_ _ |_|_ _| 
| | _ _ |_ _| _| 
|_|_| _| |_| _| _| 
|_  _ _ | |_ | | 
| |_| | | _ _ _ | 
|  _|_|  _| | 
|_|_|_ _|_ _|_|_|_ _| 
+0

除了北,南,東,西有任何「標誌」 '牆'或'NO_wall'? – 2013-05-07 17:47:37

+0

否。如果n,s,e,w是1,那麼有一堵牆。如果它是0,那麼沒有牆。 – Kinru 2013-05-07 17:48:01

+0

從我所瞭解的你正在繪製立方體,就好像你處於中心位置一樣,你不必畫出它,就好像你在實際的迷宮中一樣? (j * 2 + 2,0,i * 2);' 'glTranslatef(j * 2 + 2,0,i * 2);' north'glTranslatef(j * 2 + 4,0,i * 2);' east'glTranslatef(j * 2 + 0,i * 2 + 2);' west'glTranslatef(j * 2 + 2,0,i * 2 - 2);' – 2013-05-07 18:01:32

回答

2

兩點:

  • 你正確地把你的相機的位置看ZX平面?
  • 你的立方體沒有太寬的寬度?嘗試做一個thiner立方體和使用glScale使其高

編輯

試試這個代碼:

void Maze::drawMaze(vector<vector<Cell> > maze) {  
    for (int i = 0; i < 10; i++) { 
     for (int j = 0; j < 10; j++) { 
      if (maze[i][j].south == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2 - 2, 0, i * 2); 
       glScalef(1, 1, 0.25); // Added here 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
      if (maze[i][j].north == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2 + 2, 0, i * 2); 
       glScalef(1, 1, 0.25); // Added here 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
      if (maze[i][j].east == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2, 0, i * 2 + 2); 
       glScalef(0.25, 1, 1); // Added here 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
      if (maze[i][j].west == 1) { 
       glColor4f(0, .2, 0, 0); 
       glPushMatrix(); 
       glTranslatef(j * 2, 0, i * 2 - 2); 
       glScalef(0.25, 1, 1); // Added here 
       glutSolidCube(2); 
       glPopMatrix(); 
      } 
     } 
    } 
} 
+0

對不起,ZX飛機是我畫迷宮的平面飛機。 寬度不應該不重要嗎?只要我用相同的寬度抵消每個立方體,應該不會有問題 – Kinru 2013-05-07 20:34:31

+0

是的,但是對於我所看到的,似乎你沒有空間來看你的迷宮。你的立方體在每邊都有相同的尺寸,所以,只有在門戶你會畫出一個洞。結果,你將只能看到一個有一些洞的大立方體。 – Amadeus 2013-05-07 20:45:59

+0

嗯好的。我試圖減少厚度和增加規模(在y方面使他們更高)。但是,現在所有立方體之間只有一個間隙(應該是這樣)。不知道現在該做什麼。 – Kinru 2013-05-07 20:55:57