2013-07-19 4 views
0

В настоящее время я пытаюсь узнать о 3D, и я пытаюсь немного повеселиться с 3D-массивами и всем этим интересным материалом, а на нем. Я не могу понять, почему мой код не предоставляет правильные кубы ... Я запускаю трехмерный массив и назначаю случайные состояния (1 ничья, 2 не рисует) Я не могу понять, почему, когда я пробегаю состояния, это только кажется, нарисовать все кубы или нет.Voxel Chunk не передает правильные блоки?

любая помощь приветствуется, извините за плохой код.

EDIT: (Я добавил файл COUT и устроились немного кода)

#include <iostream> 
#include <cstring> 
#include <cstdlib> 
#include <windows.h> 
#include <time.h> 


#include <SDL.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
using namespace std; 


float SCALE = 2; 
int i; 
int chunk[16][16][16]; 
int chunkSize = 16; 
time_t seconds; 
int seed = 0; 
int colors; 

void buildChunk(); 
void renderChunk(); 

void drawCube(float size,int x,int y,int z) 
{ 


    glBegin(GL_QUADS); 

    // front face 
    glColor3f(0,200,255); 
    glVertex3f(size/2*x,size/2+y,size/2+z); 
    glVertex3f(-size/2*x,size/2+y,size/2+z); 
    glVertex3f(-size/2*x,-size/2+y,size/2+z); 
    glVertex3f(size/2*x,-size/2+y,size/2+z); 
    // left face 
    glColor3f(0.0,1.0,0.0); 
    glVertex3f(-size/2*x,size/2+y,size/2+z); 
    glVertex3f(-size/2*x,-size/2+y,size/2+z); 
    glVertex3f(-size/2*x,-size/2+y,-size/2+z); 
    glVertex3f(-size/2*x,size/2+y,-size/2+z); 
    // back face 
    glColor3f(0.0,0.0,1.0); 
    glVertex3f(size/2*x,size/2+y,-size/2+z); 
    glVertex3f(-size/2*x,size/2+y,-size/2+z); 
    glVertex3f(-size/2*x,-size/2+y,-size/2+z); 
    glVertex3f(size/2*x,-size/2+y,-size/2+z); 
    // right face 
    glColor3f(1.0,1.0,0.0); 
    glVertex3f(size/2*x,size/2+y,size/2+z); 
    glVertex3f(size/2*x,-size/2+y,size/2+z); 
    glVertex3f(size/2*x,-size/2+y,-size/2+z); 
    glVertex3f(size/2*x,size/2+y,-size/2+z); 
    // top face 
    glColor3f(1.0,0.0,1.0); 
    glVertex3f(size/2*x,size/2+y,size/2+z); 
    glVertex3f(-size/2*x,size/2+y,size/2+z); 
    glVertex3f(-size/2*x,size/2+y,-size/2+z); 
    glVertex3f(size/2*x,size/2+y,-size/2+z); 
    // bottom face 
    glColor3f(0.0,1.0,1.0); 
    glVertex3f(size/2*x,-size/2+y,size/2+z); 
    glVertex3f(-size/2*x,-size/2+y,size/2+z); 
    glVertex3f(-size/2*x,-size/2+y,-size/2+z); 
    glVertex3f(size/2*x,-size/2+y,-size/2+z); 
    glEnd(); 
} 

float angle = 0.0; 
const int triangle = 1; 

void init() 
{ 

    glClearColor(0.0,0.0,0.0,1.0); //background color and alpha 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45,640.0/480.0,1.0,500.0); 
    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_DEPTH_TEST); 
    buildChunk(); 
} 

void render() 
{ 

    renderChunk(); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(0.0,0.0,-30.0); 
    glRotatef(angle,1.0,1.0,0.0); // angle, x-axis, y-axis, z-axis 
} 

int main(int argc, char** argv) 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    SDL_Surface *screen; 
    screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE|SDL_OPENGL); 
//  screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE|SDL_FULLSCREEN); 
    bool running = true; 
    const int FPS = 30; 
    Uint32 start; 
    SDL_Event event; 
    init(); 
    while(running) 
    { 
     start = SDL_GetTicks(); 
     while(SDL_PollEvent(&event)) 
     { 
      switch(event.type) 
      { 
      case SDL_QUIT: 
       running = false; 
       break; 
      } 
     } 

     render(); 
     SDL_GL_SwapBuffers(); 
     angle += 0.5; 
     if(angle > 360) 
      angle -= 360; 
     if(1000/FPS > SDL_GetTicks()-start) 
      SDL_Delay(1000/FPS-(SDL_GetTicks()-start)); 
    } 
    SDL_Quit(); 
    return 0; 
} 

void buildChunk() 
{ 
    seconds = time (NULL); 
    seed = seconds; 
    srand(seed); 
    /* Seed the random number generator with the specified seed */ 
    int x; 
    int y; 
    int z; 



    for(x=0; x < chunkSize; x++) 
    { 
     for(y=0; y < chunkSize; y++) 
     { 
      for(z=0; z < chunkSize; z++) 
      { 




       /* 50% chance for a cell to be alive */ 
       if(rand() % 100 < 50) 
       { 
        chunk[x][y][z] = 1; 
       } 
       else 
       { 
        chunk[x][y][z] = 0; 
       } 
       cout<< "chunk[" << x << "][" << y << "][" << z << "] state: " << chunk[x][y][z]<<endl; 

      } 
     } 
    } 
} 

void renderChunk() 
{ 
    int x; 
    int y; 
    int z; 

    for(x=0; x < chunkSize; x++) 
    { 
     for(y=0; y < chunkSize; y++) 
     { 
      for(z=0; z < chunkSize; z++) 
      { 

       if(chunk[x][y][z] == 1) 
       { 
        drawCube(1,x,y,z); 
       } 


      } 
     } 
    } 
} 

ответ

2

Обратите внимание, что у вас есть символ в первом столбце все ваши glVertex3f вызовов «*». Это должно быть «+», чтобы компенсировать вершину х, а не масштабировать ее. Вы также можете рассмотреть возможность масштабирования размера каждого куба по размеру. Вы получите что-то вроде:

 

    float halfSize = size/2; 
    float xSize = x * size; 
    float ySize = y * size; 
    float zSize = z * size; 

    // front face 
    glColor3f(0,200,255); 
    glVertex3f(xsize + halfSize, ysize + halfSize, zsize + halfSize); 
    glVertex3f(xsize - halfSize, ysize + halfSize, zsize + halfSize); 
    glVertex3f(xsize - halfSize, ysize - halfSize, zsize + halfSize); 
    glVertex3f(xsize + halfSize, ysize - halfSize, zsize + halfSize); 

 Смежные вопросы

  • Нет связанных вопросов^_^