2013-05-07 157 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