2013-09-24 32 views
3

我是相當新的使用GLUT,我一直在試圖編譯程序(我發現here,第一反應),使用鼠標繪製一個矩形點擊和拖動點。通過記錄的開始和結束繪製一個矩形與鼠標GLUT

作爲一個乾淨的複製/粘貼,它會編譯但不畫任何東西。即使將背景顏色更改爲黑色(在setup()函數中),它也只是顯示一個白色屏幕。我已經閱讀了幾個來源來驗證這個程序在繪製和重塑函數中不會錯過任何東西,並且它都在那裏。我創建一個窗口,將視口設置爲窗口尺寸,然後使用gluOrtho2D函數設置映射(因爲窗口和視口尺寸相同,我將映射設置爲窗口尺寸)。鼠標回調記錄了我左鍵單擊的位置以及釋放左鍵單擊的位置,然後調用glutPostRedisplay()函數以使用新座標重新繪製窗口。比特調試之後,我發現了座標記錄並適當地保存,並且以像素爲單位進行測量(x和y是0和窗口尺寸之間的整數),所以我應該能夠從一個頂點畫一個矩形的其他頂點使用座標。但是,正如我所說,它只顯示一個白色屏幕。

那麼,有沒有什麼問題,我繪製矩形的方式嗎?我是否錯誤地繪製了窗口?我嚴重丟失,任何反饋將不勝感激。

EDIT2:我改變了glutInitDisplayMode從GLUT_SINGLE到GLUT_DOUBLE,並固定了整個非交互式白屏的事情。現在,它將繪製一個帶有翻轉y座標(我固定)的鼠標的矩形,現在它效果很好。非常感謝你的建議。

這裏是我的程序(EDIT1:添加了註釋):

#include <cstdlib> 
#include <GL/glut.h>  

using namespace std; 

GLsizei width, height; 

struct Position 
{ 
    Position() : x(0), y(0) {} 
    float x; 
    float y; 
}; 

Position start; // Records left-click location 
Position finish; // Records left-click release location 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); // clear window 

    glColor3ub(rand()%256, rand()%256, rand()%256); // generates random color 
    glBegin(GL_QUADS); 
     glVertex2f(start.x,start.y); 
     glVertex2f(finish.x,start.y); 
     glVertex2f(finish.x,finish.y); 
     glVertex2f(start.x,finish.y); 
    glEnd(); 

    glutSwapBuffers(); // display newly drawn image in window 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, (GLsizei)w, (GLsizei)h); // set to size of window 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    gluOrtho2D(0.0, (float)w, 0.0, (float)h); 

    width = w; // records width globally 
    height = h; // records height globally 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void mouse(int button, int state, int x, int y) 
{ 
    switch(button) 
    { 
    case GLUT_LEFT_BUTTON: 

     if(state==GLUT_DOWN) 
     { 
      start.x = x; //x1 
      start.y = y; //y1       
     } 
     if(state==GLUT_UP) 
     { 
      finish.x = x; //x2 
      finish.y = y; //y2 
     } 
     break; 
     glutPostRedisplay(); 
    } 
} 

void motion(int x, int y) 
{ 
    finish.x = x; 
    finish.y = y; 
    glutPostRedisplay(); 
} 

void setup() 
{ 
    glClearColor(0.0, 0.0, 0.0, 1.0); // *should* display black background 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
    glutInitWindowSize(640,480); 
    glutInitWindowPosition(100,100); 
    glutCreateWindow(""); 

    setup(); 

    // initializing callbacks 
    glutReshapeFunc(reshape); 
    glutDisplayFunc(display); 
    glutMouseFunc(mouse); 
    glutMotionFunc(motion); 

    glutMainLoop(); 
    return 0; 
} 
+0

glutInitDisplayMode應是GLUT_DOUBLE,這可能不是這裏沒有問題,但是因爲你正在調用glutSwapBuffers,你應該指定glut來啓用雙緩衝。 – pippin1289

+0

此外,鼠標內部的glutPostRedisplay可能需要在中斷之前或switch語句之外。此外,雖然將glutPostRedisplay switch語句外有意義可能無法與原來的問題 – pippin1289

+0

你的第一個建議的工作就像一個魅力。非常有用的信息,謝謝。 –

回答

3

正如我的評論所說:

變化:

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 

到:

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
相關問題