2013-06-04 60 views
0

這是我的魔方。一旦創建,它具有在任-2,-1,0,1,或2隨機翻譯在GLUT變壞

void cube(void) 
{ 
    srand (time(0)); 

    int cube_posX; 
    int lowv = -2; 
    int highv = 2; 

    cube_posX = rand() % (highv - lowv + 1) + lowv; 

    glTranslatef(cube_posX, 0.0, cube_angle); 
    glRotatef(cube_angle, 90.0, 0.0, 1.0); 
    glutSolidCube(0.25); 
} 

隨機x位置,這是我怎麼移動立方體緩緩前行

void MOVE_CUBE(int value) 
{ 
    cube_posZ = cube_posZ - 0.01; 
    glutPostRedisplay(); 
    glutTimerFunc(25, MOVE_CUBE, 0); 
} 

最後將它們放在顯示:

void init(void) 
{ 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
} 

float cam_eyeX = 0.0, cam_eyeY = 1.5, cam_eyeZ = 5.0; 
float cam_centerX = 0.0, cam_centerY = 0.0, cam_centerZ = 0.0; 
void display(void) 
{ 
    glClearColor(1.0,1.0,1.0,1.0);  //to add background color (white) 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    gluLookAt(cam_eyeX, cam_eyeY, cam_eyeZ, cam_centerX, cam_centerY, cam_centerZ, 0.0, 1.0, 0.0); //camera! (cam position X, cam position Y, cam position Z, cam target X, cam target Y, cam target Z, up position X, up position Y, up position Z) 

    cube(); 

    glutSwapBuffers(); 
    angle += 0.05; //to affect the glRotate function 
    glFlush(); 
} 

void reshape(int w, int h) 
{ 
    glViewport (0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective (60, (GLfloat)w/(GLfloat)h, 1.0, 100.0); 
    glMatrixMode (GL_MODELVIEW); 
} 


int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);  // Set up display buffer 
    glutInitWindowSize(750, 500);  //window's size 
    glutInitWindowPosition(100, 100); //window's position 
    glutCreateWindow("Hendra Ganteng!"); //window's title 
    init(); 
    glutDisplayFunc(display); 
    glutIdleFunc (display); 
    glutReshapeFunc(reshape); 
    glutKeyboardFunc(keyboard_Handler); 

    MOVE_CUBE(0); 

    glutMainLoop(); 
    return 0; 
} 

但是,當我看到它的行動,立方體向前移動完美無缺,但不斷變化到那些5種可能性x位置(-2,-1,0,1,2)每0.5到1秒。如果我禁用srand(time(0)),立方體會迅速改變它的x位置。我只是想讓它停留在1個位置,然後我可以在不同的x位置調用更多的立方體。有人可以請我的代碼好嗎?

回答

0

這種行爲如何預期?每次顯示多維數據集時都會生成一個隨機的X位置。如果您使用時間重新生成隨機數生成器,則每當時間改變時(每秒一次),它將開始不同的序列。

相反,您應該預先生成您的多維數據集。怎麼樣:

// Global cube data 
struct Cube { 
    int x; 
    double angle; 
}; 

vector<Cube> cubes; 
const int num_cubes = 1; 

// Example initialisation... 
void InitCubes() 
{ 
    cubes.reserve(num_cubes); 

    for(int i = 0; i < num_cubes; i++) 
    { 
     Cube cube; 
     cube.x = rand() % (highv - lowv + 1) + lowv; 
     cube.angle = 0.0; 
     cubes.push_back(cube); 
    } 
} 

現在更新/顯示週期只需要修改角度,而不是x位置。

void UpdateCube(Cube & cube) 
{ 
    cube.angle += 0.05; 
} 

void DisplayCube(Cube & cube) 
{ 
    glTranslatef((double)cube.x, 0.0, cube.angle); 
    glRotatef(cube.angle, 90.0, 0.0, 1.0); 
    glutSolidCube(0.25); 
} 

在你主要功能,啓動時調用InitCubes()

在你顯示功能,這樣做:

void display(void) 
{ 
    glClearColor(1.0,1.0,1.0,1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    gluLookAt(cam_eyeX, cam_eyeY, cam_eyeZ, cam_centerX, cam_centerY, cam_centerZ, 0.0, 1.0, 0.0);  

    // Display cubes   
    for(int i = 0; i < cubes.size(); i++) DisplayCube(cubes[i]); 

    glutSwapBuffers(); 
    glFlush(); 

    // Update cubes for next render cycle. 
    for(int i = 0; i < cubes.size(); i++) UpdateCube(cubes[i]); 
} 
+0

我似乎有一種「預生成」問題的立方體,我不明白其中部分用於循環屬於。我在上面的源代碼中將void代碼複製並粘貼到函數void display(void)中,結果是立方體仍在迅速切換x位置。我不是編程專家,因爲我希望更簡單的解釋。謝謝! –

+0

當我們談論生成,特別是「預生成」時,我們的意思是在剩下的任何代碼之前做一次*。這意味着,*不要*在你的'display'函數中生成。整個過程就是你在一個隨機位置創建一個立方體*,然後更新並顯示多次。 – paddy

+0

您需要將'Cube'實例傳遞給函數!我編輯了我的答案,試圖明確你應該如何使用代碼。 – paddy